У меня проблема, аналогичная описанной здесь: Запретить fork() копирование сокетов
По сути, внутри моего Lua-скрипта я создаю еще один скрипт, который:
- в любом случае не требует связи с моим скриптом
- продолжает работать после завершения моего скрипта
- это сторонняя программа, код которой я не контролирую
Проблема в том, что мой сценарий Lua открывает сокет TCP для прослушивания определенного порта, и после его закрытия и несмотря на явный server:close()
дочерний элемент (или, точнее, его дочерние элементы) удерживает сокет и сохраняет порт open (в состоянии 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
) до тех пор, пока он не выйдет.
Как мне решить эту проблему самым простым способом, желательно без добавления каких-либо дополнительных зависимостей.