bash: 睡眠进程没有被杀死

bash: sleep process not getting killed

我写了一个简单的 bash 脚本,它除了睡觉什么都不做。

#!/bin/bash

echo "Sleeping..."
sleep 180s

在我 运行 脚本之后,我在我的系统上看到两个进程 运行ning:

user 22880  0.0  0.0  12428  1412 pts/28   S+   20:12   0:00 /bin/bash ./sleep.sh
user 22881  0.0  0.0   7196   356 pts/28   S+   20:12   0:00 sleep 180s

我通过使用 kill -15 22880 给 ID 为 22880 的进程一个 SIGTERM 来终止进程。但是,在此之后,我仍然看到睡眠命令 运行ning 在 180 秒后退出。

user 22881  0.0  0.0   7196   356 pts/28   S    20:12   0:00 sleep 180s

为什么会这样?我需要做什么才能不离开 sleep 180s 进程 运行ning?

kill -15 22880 将向执行脚本的 shell 发送信号,但不会向 sleep 命令发送信号。要将信号发送到进程 group 中的每个进程,您应该能够指定一个 negative 进程 ID。

kill -15 -22880

或者,确保脚本在退出前终止其 children。

trap 'kill $(jobs -p)' EXIT
echo "Sleeping..."
sleep 180s & wait

如果在接收到信号时将sleep留在前台,shell必须等到它退出后才能运行触发陷阱; sleep 是不间断的。解决方法是在后台 运行 它,然后 wait 在它上面。 wait,作为 shell built-in,可以被中断,因此陷阱 运行 立即停止并杀死任何仍在进行中的后台进程。

你也可以使用 killall sleepkill -9/15 $(pidof sleep)

9用于终止进程,15用于终止进程

bash$ ps -ef|grep sleep
pratik   24775  2695  0 23:44 pts/0    00:00:00 sleep 600
pratik   24778 24690  0 23:44 pts/29   00:00:00 grep --color=auto sleep
bash$ killall sleep 
bash$ ps -ef|grep sleep
pratik   24792 24690  0 23:44 pts/29   00:00:00 grep --color=auto sleep
bash$
bash$ ps -ef|grep sleep
pratik   24978  2695  0 23:52 pts/0    00:00:00 sleep 600
pratik   24981 24690  0 23:52 pts/29   00:00:00 grep --color=auto sleep
bash$ kill -15 $(pidof sleep)
bash$ ps -ef|grep sleep
pratik   24986 24690  0 23:52 pts/29   00:00:00 grep --color=auto sleep`