tengo un problema análogo al descrito aquí: Prevent fork() from copying socketsos.execute sin heredar de los padres FDS
Básicamente, dentro de mi script Lua estoy desove otro script que:
- no lo hace requerirá la comunicación con mi guión de cualquier manera
- sigue corriendo detrás de mi guión había terminado
- es un programa de 3 ª parte, el código de las que no tengo control sobre
El problema es que mi script Lua abre un socket TCP para escuchar en un puerto específico y después de que dejar de fumar y pesar una explícita server:close()
el niño (o más específicamente sus hijos) se mantiene en el zócalo y mantiene el puerto abrir (en estado ESCUCHAR) impidiendo que mi secuencia de comandos se ejecute nuevamente.
Aquí es código de ejemplo que muestra el problema:
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()
Si ejecuto el script de arriba y echo quit | nc localhost 9999
todo funciona bien - programa se cierra y el puerto está cerrado.
Sin embargo, si hago echo exec | nc localhost 9999
, el programa se cierra pero el puerto está bloqueado por el generado sleep
(confirmado por netstat -lpn
) hasta que se cierra.
Cómo abordar esto de la manera más simple posible, preferiblemente sin agregar dependencias adicionales.
¡Bien hecho! Donde hay voluntad, hay una forma :-) Me alegro de que hayas vuelto con una actualización también. –