有时我想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.
那么,这是最好的方法吗?我可以通过哪些方式改进这个脚本?
Avoid killall
如果可以的话,因为在所有 UNIX 平台上并没有一致的实现。程序工具 pkill
and 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
它可能正在等待什么。找出它在等待什么(硬件中断?打开文件?)并修复它,然后你就可以让它干净地关闭。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)