有时我想对某个进程进行killall,但是无法运行killall。因此,当我尝试再次启动该过程时,它失败了,因为上一个 session 仍在运行。然后,我必须繁琐地在其上运行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' 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后不会立即退出,则可能是在等待某些东西。找出等待的内容(硬件中断?打开文件?)并解决该问题,然后可以使其完全关闭。

10-07 18:51