假设:一个进程绑定到 Linux 上的一个端口,然后使用 TERM 或 KILL 信号终止该进程。有没有办法让端口仍然绑定,或者内核会清理并保证端口将解除绑定。
答案1
如果原始进程生成子进程,则子进程有可能在父进程退出后保持套接字打开。如果父进程是唯一打开套接字的进程,则它应该在终止时清理。现有进程将关闭所有打开的文件描述符,其中包括其所有套接字。
一旦发起关闭,套接字可能仍处于 TIME_WAIT 状态。TCP 尝试保证传输的所有数据均已送达。当套接字关闭时,它会进入 TIME_WAIT 状态以实现此保证。如果它们是 TCP 套接字,则有多个变量可能需要一些时间,例如完成握手或套接字是否配置了 SO_LINGER 选项。
以下是来自 Unix Socket FAQ 的解释 TIME_WAIT 的链接: http://www.developerweb.net/forum/showthread.php?t=2941
答案2
我知道有时如果我运行 apachectl stop,apache 进程实际上不会完全终止,我必须运行 killall -9 httpd 来获取一个干净的端口进行绑定。