Tôi có một vấn đề tương tự như một trong những mô tả ở đây: Prevent fork() from copying socketsos.execute mà không kế thừa FDS mẹ của
Về cơ bản, bên trong kịch bản Lua tôi đang đẻ trứng khác kịch bản đó:
- không yêu cầu liên lạc với tập lệnh của tôi theo cách tương tự
- tiếp tục chạy sau khi tập lệnh của tôi hoàn thành
- là chương trình của bên thứ ba, mã mà tôi không kiểm soát được
Vấn đề là kịch bản Lua của tôi mở một cổng TCP để nghe trên một cổng cụ thể và sau khi thoát và mặc dù rõ ràng server:close()
đứa trẻ (hoặc cụ thể hơn là con của nó) giữ trên ổ cắm và giữ cổng mở (trong trạng thái LISTEN) ngăn không cho tập lệnh của tôi chạy lại.
Đây là mã ví dụ chứng tỏ vấn đề:
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()
Nếu tôi chạy kịch bản trên và echo quit | nc localhost 9999
tất cả mọi thứ hoạt động tốt - chương trình chia tay và cổng được đóng lại.
Tuy nhiên nếu tôi làm echo exec | nc localhost 9999
thì thoát chương trình nhưng cổng bị chặn bởi số sleep
được sinh ra (như được xác nhận bởi netstat -lpn
) cho đến khi thoát.
Làm cách nào để giải quyết điều này theo cách đơn giản nhất có thể, tốt nhất là không thêm bất kỳ phụ thuộc bổ sung nào.
Làm tốt lắm! Trường hợp có một ý chí, có một cách :-) Vui mừng bạn đã trở lại với một bản cập nhật, quá. –