我正在编写一些自动化脚本,其中我需要终止一些进程。
以前我通常会用来kill -9 pid
杀死进程,但有一次,我注意到当我用来kill -9
杀死一些tcpdump
进程时:
例如:
tcpdump -i eth0 -w output.pcap
抓到的包没有放进去output.pcap
,里面是空的。但如果我使用的话kill
,效果很好。
对于某些进程,例如./prog >> test_log
,恐怕如果我使用kill -9
杀死进程,输出将不会重定向到test_log
。
我还担心如果我kill
不使用-9
kill命令使用可能会失败。
谁能告诉我如何正确使用,kill
以便杀死不会导致输出文件出现问题,并且我能够毫无问题地杀死进程?
答案1
如果进程不写入终端而是使用重定向(或者甚至显式写入文件时),则缓冲可能是一个问题。查看stdbuf
和unbuffer
( 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。
您还应该(始终)检查是否有其他信号可以发送到应用程序,或者它是否是守护进程,您通常有一个启动/停止脚本等。
另请参阅: