openwrt: better error checking and zombie process handling in rrdtool server
This commit is contained in:
parent
41fa14cf61
commit
8d1ccbc8fc
|
@ -19,7 +19,10 @@
|
||||||
|
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
local nixio = require 'nixio'
|
require 'nixio'
|
||||||
|
|
||||||
|
local nixio, os =
|
||||||
|
nixio, os
|
||||||
|
|
||||||
local getfenv, setmetatable =
|
local getfenv, setmetatable =
|
||||||
getfenv, setmetatable
|
getfenv, setmetatable
|
||||||
|
@ -27,7 +30,7 @@ local getfenv, setmetatable =
|
||||||
module (...)
|
module (...)
|
||||||
local modenv = getfenv()
|
local modenv = getfenv()
|
||||||
|
|
||||||
--- Start an rrdtool server in pipe mode.
|
--- Start an rrdtool server in pipe mode. Results in an rrdtool coprocess.
|
||||||
--
|
--
|
||||||
-- +----------+ +-----------+
|
-- +----------+ +-----------+
|
||||||
-- | | fd[4] ---> fd[3] | |
|
-- | | fd[4] ---> fd[3] | |
|
||||||
|
@ -49,22 +52,28 @@ function start()
|
||||||
fd[5]:setblocking(false)
|
fd[5]:setblocking(false)
|
||||||
return setmetatable({pid = pid, fdr = fd[5], fdw = fd[4]}, {__index = modenv})
|
return setmetatable({pid = pid, fdr = fd[5], fdw = fd[4]}, {__index = modenv})
|
||||||
elseif pid == 0 then -- child
|
elseif pid == 0 then -- child
|
||||||
fd[4]:close()
|
|
||||||
fd[5]:close()
|
|
||||||
nixio.dup(fd[3], nixio.stdin)
|
nixio.dup(fd[3], nixio.stdin)
|
||||||
nixio.dup(fd[6], nixio.stdout)
|
nixio.dup(fd[6], nixio.stdout)
|
||||||
|
for i = 3,6 do
|
||||||
|
fd[i]:close()
|
||||||
|
end
|
||||||
nixio.execp('rrdtool', '-')
|
nixio.execp('rrdtool', '-')
|
||||||
|
nixio.syslog('err', 'Unable to launch rrdtool')
|
||||||
|
-- Send SIGTERM to parent process, quite drastic I know.
|
||||||
|
nixio.kill(pid, nixio.const.SIGTERM)
|
||||||
else -- error
|
else -- error
|
||||||
nixio.syslog("err", "Unable to fork(): " .. err)
|
nixio.syslog('err', 'Unable to fork(): ' .. err)
|
||||||
return nil, code, err
|
return nil, code, err
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Stop the rrdtool server.
|
--- Stop the rrdtool server.
|
||||||
-- @param rrd.server (RS) object
|
-- @param rrd.server (RS) object
|
||||||
-- @return true
|
-- @return waitpid return values
|
||||||
|
-- @see nixio.waitpid
|
||||||
function stop(RS)
|
function stop(RS)
|
||||||
RS.fdr:close()
|
RS.fdr:close()
|
||||||
RS.fdw:close()
|
RS.fdw:close()
|
||||||
return nixio.kill(RS.pid, nixio.const.SIGKILL)
|
nixio.kill(RS.pid, nixio.const.SIGTERM)
|
||||||
|
return nixio.waitpid(RS.pid)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue