79 lines
2.2 KiB
Lua
79 lines
2.2 KiB
Lua
local nginx_signals = require "kong.cmd.utils.nginx_signals"
|
|
local conf_loader = require "kong.conf_loader"
|
|
local pl_path = require "pl.path"
|
|
local kill = require "kong.cmd.utils.kill"
|
|
local log = require "kong.cmd.utils.log"
|
|
|
|
local function execute(args)
|
|
log.disable()
|
|
-- retrieve default prefix or use given one
|
|
local default_conf = assert(conf_loader(nil, {
|
|
prefix = args.prefix
|
|
}))
|
|
log.enable()
|
|
assert(pl_path.exists(default_conf.prefix),
|
|
"no such prefix: " .. default_conf.prefix)
|
|
|
|
-- load <PREFIX>/kong.conf containing running node's config
|
|
local conf = assert(conf_loader(default_conf.kong_env))
|
|
|
|
-- wait before initiating the shutdown
|
|
ngx.update_time()
|
|
local twait = ngx.now() + math.max(args.wait, 0)
|
|
if twait > ngx.now() then
|
|
log.verbose("waiting %s seconds before quitting", args.wait)
|
|
while twait > ngx.now() do
|
|
ngx.sleep(0.2)
|
|
if not kill.is_running(conf.nginx_pid) then
|
|
log.error("Kong stopped while waiting (unexpected)")
|
|
return
|
|
end
|
|
end
|
|
ngx.update_time()
|
|
end
|
|
|
|
-- try graceful shutdown (QUIT)
|
|
assert(nginx_signals.quit(conf))
|
|
|
|
log.verbose("waiting for nginx to finish processing requests")
|
|
|
|
local tstart = ngx.now()
|
|
local texp, running = tstart + math.max(args.timeout, 1) -- min 1s timeout
|
|
repeat
|
|
ngx.sleep(0.2)
|
|
running = kill.is_running(conf.nginx_pid)
|
|
ngx.update_time()
|
|
until not running or ngx.now() >= texp
|
|
|
|
if running then
|
|
log.verbose("nginx is still running at %s, forcing shutdown", conf.prefix)
|
|
assert(nginx_signals.stop(conf))
|
|
log("Timeout, Kong stopped forcefully")
|
|
return
|
|
end
|
|
|
|
log("Kong stopped (gracefully)")
|
|
end
|
|
|
|
local lapp = [[
|
|
Usage: kong quit [OPTIONS]
|
|
|
|
Gracefully quit a running Kong node (Nginx and other
|
|
configured services) in given prefix directory.
|
|
|
|
This command sends a SIGQUIT signal to Nginx, meaning all
|
|
requests will finish processing before shutting down.
|
|
If the timeout delay is reached, the node will be forcefully
|
|
stopped (SIGTERM).
|
|
|
|
Options:
|
|
-p,--prefix (optional string) prefix Kong is running at
|
|
-t,--timeout (default 10) timeout before forced shutdown
|
|
-w,--wait (default 0) wait time before initiating the shutdown
|
|
]]
|
|
|
|
return {
|
|
lapp = lapp,
|
|
execute = execute
|
|
}
|