【发布时间】:2011-06-17 15:53:29
【问题描述】:
我有一个类似于此处描述的问题: Prevent fork() from copying sockets
基本上,在我的 Lua 脚本中,我生成了另一个脚本:
- 无论哪种方式都不需要与我的脚本通信
- 在我的脚本完成后继续运行
- 是第 3 方程序,我无法控制其代码
问题是我的 Lua 脚本打开了一个 TCP 套接字来监听特定端口,并且在它退出并且 尽管 一个显式的 server:close() 之后,孩子(或者更具体地说是它的孩子)持有socket 并保持端口打开(处于 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 确认)阻塞,直到它退出。
如何以最简单的方式解决这个问题,最好不要添加任何额外的依赖项。
【问题讨论】:
标签: sockets shell lua exec fork