如何安全地终止进程以便输出重定向不会中止?

如何安全地终止进程以便输出重定向不会中止?

我正在编写一些自动化脚本,其中我需要终止一些进程。

以前我通常会用来kill -9 pid杀死进程,但有一次,我注意到当我用来kill -9杀死一些tcpdump进程时:

例如:

tcpdump -i eth0 -w output.pcap

抓到的包没有放进去output.pcap,里面是空的。但如果我使用的话kill,效果很好。

对于某些进程,例如./prog >> test_log,恐怕如果我使用kill -9杀死进程,输出将不会重定向到test_log

我还担心如果我kill不使用-9kill命令使用可能会失败。

谁能告诉我如何正确使用,kill以便杀死不会导致输出文件出现问题,并且我能够毫无问题地杀死进程?

答案1

如果进程不写入终端而是使用重定向(或者甚至显式写入文件时),则缓冲可能是一个问题。查看stdbufunbuffer( expect) 或在此处搜索它们。

您的tcpdump问题可以通过该标志来解决(或减少)-U

一般来说,你应该这样杀死:

kill $PID; sleep $wait; kill -9 $pid &>/dev/null

kill/kill -TERM使进程有机会干净地完成(包括例如刷新缓冲区和关闭文件描述符),而kill -KILL只是从内存和进程列表中删除进程,这对于当时可能正在进行的非原子操作始终是一个风险。

答案2

您应该首先发出等待终止命令15(如果没有终止的话)kill 2,等等。

一般来说,正常运行,除了例外,如果一个程序在kill 15,2,1之后没有结束,这并不是最好的标志。尽管你不能期望它立即结束。

其次,这取决于您杀死的具体程序。有些程序会捕获并清理,有些程序应该这样做但没有,有些程序没有任何东西需要清理,并留下操作系统来清理。 ETC。

您还应该(始终)检查是否有其他信号可以发送到应用程序,或者它是否是守护进程,您通常有一个启动/停止脚本等。

另请参阅:

相关内容