最近我养成了杀死进程的习惯
fuser -k -n tcp $PORT
这几乎不能杀死错误的进程。我更喜欢这个而不是摆弄一个可能仍然存在或不存在或可能包含或不包含正确 pid 的 pidfile(好吧,我在这里有点戏剧性:-)
然而,我偶然发现的典型停止脚本仍然使用 pidfile。
我是否缺少 pidfile 方法的重要功能或 fuser 的错误功能approach
。我最好的猜测是fuser
不可用。虽然从搜索引擎结果来看,bsd、debian、suse、centos、aix、solaris 似乎都有。
fuser
命令选项是特定于-n <file|udp|tcp>
Linux 的,而基于 PID 文件的解决方案在许多 Unix 变体中是传统的,因此保证非常便携。至少在 Debian 中,该
fuser
命令位于psmisc
包中,该包被指定为“可选”,因此不能期望它始终存在于所有系统中。除了 telcoM 提到的内容之外,这种方法还有两个潜在的问题,它们都与名为
SO_REUSEPORT
.此套接字选项允许多个进程(所有进程都必须设置该选项)绑定到同一个端口,并将传统上由主进程完成的连接的负载平衡卸载到内核。
由此产生的两个潜在问题是:
对于使用基于进程的并行性(例如 NGinx)并使用此选项的服务器,连接到套接字的 PID 通常是主进程的子进程,而不是主进程本身。在这种情况下,您的
fuser
方法将杀死所有子进程,但不会向主进程发送任何信号,这可能根本不会终止服务(如果主进程只是重新启动子进程),或者可能导致它被关闭以导致问题的方式(代码可能假设子进程死亡表示致命错误,并使用与主进程本身接收信号不同的退出路径)。这可能会杀死您想要的其他程序。这种情况不太可能是一件坏事(关于您可以杀死的唯一“其他”程序可能是恶意软件),但值得考虑。