You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:02:37