我有一个类似于这里描述的问题:Prevent fork() from copying sockets
基本上,在我的Lua脚本中,我正在生成另一个脚本,它:
以下是演示问题的示例代码:
如果我运行上面的脚本并且执行
但是如果我执行
我该如何以最简单的方式解决这个问题,最好不要添加任何额外的依赖项。
- 不需要与我的脚本进行通信
- 在我的脚本完成后继续运行
- 是第三方程序,我无法控制其代码
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
确认),直到它退出。我该如何以最简单的方式解决这个问题,最好不要添加任何额外的依赖项。