我有类似于这里所描述的一个问题: Prevent fork() from copying socketsos.execute没有继承父母的FDS
基本上,我的Lua脚本中,我产卵另一个脚本:
- 不需要与我的脚本通信两种方式
- 继续我的剧本已经完成
- 后运行是一个第三方程序,代码我没有控制权
的问题是,我的Lua脚本打开一个TCP套接字来侦听特定端口上,它的退出后尽管明确server:close()
孩子(或者更具体地说其子女)持有到插座和保持端口打开(处于LISTEN状态),防止我的脚本再次运行。
这里的示例代码演示该问题:
require('socket')
print('listening')
s = socket.bind("*", 9999)
s:settimeout(1)
while true do
print('accepting connection')
local c = s:accept()
if c then
c:settimeout(1)
local rec = c:receive()
print('received ' .. rec)
c:close()
if rec == "quit" then break end
if rec == "exec" then
print('running ping in background')
os.execute('sleep 10s &')
break
end
end
end
print('closing server')
s:close()
如果我运行上面的脚本和echo quit | nc localhost 9999
一切正常 - 程序退出和港口关闭。
但是,如果我做echo exec | nc localhost 9999
程序退出,但端口被产生的sleep
(如netstat -lpn
确认)阻塞,直到它退出。
如何解决这个以最简单的方式,最好是不添加任何额外的依赖。
干得好!有意愿的地方,有一个方法:-)很高兴你也回来了一个更新。 –