最近,我养成了用
fuser -k -n tcp $PORT很难杀死错误的过程。我更喜欢这样,而不是摆弄一个pidfile,它可能仍然存在,也可能不存在,或者可能包含正确的pid (好吧,我在这里有点戏剧化:-)
然而,我遇到的典型的停止脚本仍然使用pidfile。
我是否遗漏了pidfile方法的一个重要特性,还是fuser approach的一个错误特性。我最好的猜测是,fuser是不可用的。尽管从搜索引擎结果来看,bsd、debian、suse、centos、aix、solaris似乎都有。
发布于 2018-08-27 15:21:08
fuser命令选项-n <file|udp|tcp>是Linux特有的,而基于PID文件的解决方案在许多Unix变体中都是传统的,因此保证了非常可移植。
至少在Debian中,fuser命令在psmisc包中,它被指定为“可选的”,因此不能期望它总是出现在所有系统中。
发布于 2018-08-27 19:36:23
这种方法有两个潜在的问题,超出了telcoM提到的范围,它们都与一个名为SO_REUSEPORT的套接字选项有关。
该套接字选项允许多个进程(所有这些进程都必须设置该选项)绑定到同一个端口,并将传统上由主进程完成的连接负载平衡卸载到内核。
由此产生的两个潜在问题是:
fuser方法将杀死所有子进程,但不会向主进程发送任何信号,而主进程可能根本不会终止服务(如果主进程刚刚重新启动子进程),或者可能以导致问题的方式关闭服务(代码可能假定子进程的死亡表明了致命的错误,并使用了与主进程接收信号本身不同的退出路径)。https://unix.stackexchange.com/questions/465100
复制相似问题