我写了一个简单的 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
我给一个SIGTERM
到带有 id 的进程22880
通过使用kill -15 22880
这会杀死该进程。然而,在此之后,我仍然看到 sleep 命令正在运行,该命令在 180 秒后退出。
user 22881 0.0 0.0 7196 356 pts/28 S 20:12 0:00 sleep 180s
为什么会发生这种情况?我需要做什么才能不离开sleep 180s
进程运行?
kill -15 22880
会向执行脚本的 shell 发送信号,但不会向执行脚本的 shell 发送信号sleep
命令。向进程中的每个进程发送信号group,您应该能够指定一个negative进程ID。
kill -15 -22880
或者,确保脚本在退出之前杀死其子级。
trap 'kill $(jobs -p)' EXIT
echo "Sleeping..."
sleep 180s & wait
如果你走sleep
在前台收到信号时,shell 必须等到其退出后才能运行陷阱;sleep
是不间断的。解决方法是在后台运行它,然后wait
on it. wait
作为内置 shell,可以中断,以便陷阱立即运行并终止任何仍在进行的后台进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)