自动化Killall然后Killall 9级(Automating Killall then Kil

2019-06-26 22:43发布

有时候我想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.

所以,这是在做这个的最好方法? 有什么办法,我可以改善这个脚本?

Answer 1:

避免killall如果可以的话,因为没有在所有UNIX平台上一致地实施。 Proctools' pkillpgrep是优选的:

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它可能是在等待着什么。 找出它的等待(硬件中断?打开文件?),并解决这个问题,你可以让它关闭干净。



Answer 2:

如果不了解确切的过程做什么,我会说这可能是不理想的,因为你可能会遇到这样的情况,你是杀害的过程真的是做了一些有益的关闭/清理工作。 迫使其打倒kill -9可能会短路的工作,并可能导致腐败,如果你的过程实际上写入数据。

假设没有数据损坏的危险,它的确定短路关机,可你刚才kill -9过程中的第一次,并用它做。 你可以访问你正在杀死明白是怎么回事,可能会阻止关机的发生过程中的开发者? 该进程可能已经阻止了正当理由,INT和期限。



Answer 3:

这是不可能的,但它有可能在有3秒钟的等待,一个新的进程可能接管该PID和第二杀就杀吧。



文章来源: Automating Killall then Killall level 9