mam problem analogiczny do opisanego tutaj: Prevent fork() from copying socketsos.execute bez dziedziczenie FDS rodzica
Zasadniczo, w moim skrypcie Lua mam tarła inny skrypt, który:
- nie wymagają komunikowania się z mojego skryptu albo sposób
- kontynuuje pracę po mój skrypt skończył
- jest 3rd Program partii, kod którego nie mam kontroli nad
Problemem jest to, że mój skrypt Lua otwiera gniazdo TCP nasłuchuje na określonym porcie i po to rzucić i mimo wyraźny server:close()
dziecko (a dokładniej jego dzieci) posiada na gniazdka i utrzymuje port otwórz (w stanie LISTEN), zapobiegając ponownemu uruchomieniu skryptu.
Oto przykład kodu, który pokazuje problem:
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()
Jeśli uruchomić powyższy skrypt i echo quit | nc localhost 9999
wszystko działa dobrze - Program zostanie zamknięty i port jest zamknięty.
Jeśli jednak wykonam echo exec | nc localhost 9999
, program zostanie zamknięty, ale port zostanie zablokowany przez zarodnikowany sleep
(potwierdzony przez netstat -lpn
) do momentu jego wyjścia.
Jak rozwiązać ten problem w najprostszy możliwy sposób, najlepiej bez dodawania żadnych dodatkowych zależności.
Dobra robota! Gdzie jest wola, jest sposób :-). Cieszę się, że wróciłeś z aktualizacją. –