Bash:睡眠进程不会被终止 [英] bash: sleep process not getting killed

查看:13
本文介绍了Bash:睡眠进程不会被终止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

#!/bin/bash

echo "Sleeping..."
sleep 180s

运行该脚本后,我看到系统上正在运行两个进程:

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 22880SIGTERM赋给ID为22880的进程,它将终止该进程。然而,在此之后,我仍然看到在180秒后退出的睡眠命令正在运行。

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

为什么会发生这种情况?我需要做什么才能不让sleep 180s进程继续运行?

推荐答案

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

kill -15 -22880

或者,确保该脚本在退出前终止其子级。

trap 'kill $(jobs -p)' EXIT
echo "Sleeping..."
sleep 180s & wait
如果在收到信号时将sleep留在前台,则外壳必须等到退出后才能运行陷阱;sleep是不可中断的。解决方法是在后台运行它,然后在其上运行waitwait是内置的外壳程序,可以被中断,以便陷阱立即运行并终止所有仍在进行中的后台进程。

这篇关于Bash:睡眠进程不会被终止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆