有时我想要某个过程的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.
那么,这是最好的方式吗?我可以通过哪些方式改进此脚本?
解决方法:
如果可以,请避免使用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后不会立即退出,它可能正在等待某事.找出它正在等待什么(硬件中断?打开文件?)并修复它,你可以让它干净利落.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。