首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIGTERM不终止脚本

SIGTERM不终止脚本
EN

Stack Overflow用户
提问于 2020-05-25 15:27:01
回答 1查看 559关注 0票数 0

我试着理解这个剧本:

代码语言:javascript
复制
#!/usr/bin/env sh

trap "pkill -f sleep" term

sleep 1000

运行脚本后,我想通过发送一个SIGTERM来停止它

代码语言:javascript
复制
# run script in the background
$ ./signals.sh &
[1] 5389

# check if script is running
$ ps aux | grep 'signals.sh\|sleep' | grep -v grep
sergioro  5389  0.0  0.0 216520  3112 pts/0    S    09:07   0:00 sh ./signals.sh
sergioro  5390  0.0  0.0 214984   708 pts/0    S    09:07   0:00 sleep 1000

# send SIGTERM to script
$ pkill -fe signals.sh
sh killed (pid 5389)

# why hasn't the script stopped after receiving SIGTERM?
$ ps aux | grep 'signals.sh\|sleep' | grep -v grep
sergioro  5389  0.0  0.0 216520  3112 pts/0    S    09:07   0:00 sh ./signals.sh
sergioro  5390  0.0  0.0 214984   708 pts/0    S    09:07   0:00 sleep 1000

# send SIGTERM to `sleep` command
$ pkill -fe sleep
sleep killed (pid 5390)
Terminated

# script has stopped
$ ps aux | grep 'signals.sh\|sleep' | grep -v grep

我的问题是如何通过将SIGTERM发送到脚本本身而不是发送到sleep命令来停止脚本?为什么脚本中的trap不终止睡眠命令?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 15:44:42

外壳只能在trap完成后才能处理sleep

这可以实现您预期的目标:

代码语言:javascript
复制
#!/usr/bin/env sh

trap "pkill -f sleep" term

sleep 1000 & wait

参见手册页的信号部分,特别是最后一段:

如果bash正在等待命令完成并接收设置了陷阱的信号,则在命令完成之前不会执行该陷阱。当bash通过等待内置等待等待异步命令时,接收已设置陷阱的信号将导致等待内置立即返回,退出状态大于128,然后立即执行

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62005644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档