有时我想killall
某个流程,但运行killall
不起作用。因此,当我尝试再次启动该过程时,它会失败,因为前一个会话仍在运行。然后我必须单调乏味地运行killall -9
。为了简化我的生活,我创建了一个realkill
脚本,它是这样的:
PIDS=$(ps aux | grep -i "$@" | awk '{ print $2 }') # Get matching pid's.
kill $PIDS 2> /dev/null # Try to kill all pid's.
sleep 3
kill -9 $PIDS 2> /dev/null # Force quit any remaining pid's.
那么,这是最好的方式吗?我可以通过哪些方式改进此脚本?
答案 0 :(得分:5)
如果可以,请避免使用killall
,因为在所有UNIX平台上都没有一致的实现。 Proctools' pkill
和pgrep
更可取:
for procname; do
pkill "$procname"
done
sleep 3
for procname; do
# Why check if the process exists if you're just going to `SIGKILL` it?
pkill -9 "$procname"
done
(编辑)如果你有被杀的应该重启的进程,你可能不想盲目地杀死它们,所以你可以先收集PID:
pids=()
for procname; do
pids+=($(pgrep "$procname"))
done
# then proceed with `kill`
那就是说,如果可以的话,你应该尽量避免使用SIGKILL
。它不会给软件提供自我清理的机会。如果一个程序在收到SIGTERM
之后不会立即退出,它可能正在等待某事。找出它正在等待什么(硬件中断?打开文件?)并修复它,你可以让它干净利落。
答案 1 :(得分:2)
如果不了解这个过程到底做了什么,我会说这可能不太理想,因为你可能遇到的情况是你要杀死的进程真正做了一些有用的关闭/清理工作。使用kill -9
强制执行此操作可能会使该工作短路,如果您的流程实际上正在写入数据,则可能会导致损坏。
假设没有数据损坏的危险并且可以将关闭短路,那么您是否可以第一次kill -9
该过程并完成它。您是否有权访问您正在查杀的进程的开发人员,以了解可能会阻止关闭的进程?该过程可能有充分的理由阻止了INT和TERM。
答案 2 :(得分:2)
这不太可能,但有可能在3秒的等待中,一个新进程可以接管该PID,第二次杀死就会杀死它。