Bash脚本中,用户用Ctrl+Z转入后台前能否执行自定义操作?
Bash脚本中Ctrl+Z信号处理问题解答
为什么捕获SIGSTOP的trap不生效?
- Ctrl+Z触发的是SIGTSTP信号,不是你脚本里指定的SIGSTOP
- SIGSTOP是Linux内核规定的不可捕获、不可忽略、不可阻塞的信号,进程根本没法通过
trap拦截它,内核会直接强制暂停进程,不会给用户态代码执行自定义操作的机会
正确实现方式:捕获SIGTSTP
要实现按下Ctrl+Z后先执行自定义操作再转入后台,需要捕获SIGTSTP信号,并且在处理函数末尾手动给自己发送SIGSTOP信号(因为捕获SIGTSTP后,内核不会自动暂停进程)。修改后的脚本如下:
#!/bin/bash trap foo SIGINT SIGTERM SIGHUP SIGQUIT trap bar SIGTSTP foo() { echo "Interrupted" # 这里可以添加自定义清理逻辑 } bar() { echo "Sending to background..." # 手动发送SIGSTOP让进程暂停 kill -STOP $$ } sleep 30
运行这个脚本后按Ctrl+Z,就会先打印指定信息,再进入后台暂停状态。
补充说明:SIGTSTP是终端提供的“可交互暂停”信号,允许进程自定义处理逻辑;而SIGSTOP是用于强制暂停进程的系统信号,完全由内核控制,用户态无法干预。
内容的提问来源于stack exchange,提问作者algalg
相关产品推荐
相关产品推荐

