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 sleep 或 kill -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`
我写了一个简单的 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 sleep 或 kill -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`