如何设置^Z(Control-Z)挂起进程时直接输出被停止进程的PID
实现Control-Z挂起进程时直接显示PID的配置方法
问题复现
执行bash test.sh启动脚本后按下Control+Z组合键,默认终端输出如下,不直接展示被挂起进程的PID:
^Z [1]+ Stopped bash test.sh
常规需要额外执行ps $(jobs -p)才能获取对应PID,可通过以下配置实现挂起瞬间直接打印PID。
推荐配置方案(最贴合需求)
方案保留默认Control-Z的挂起逻辑,仅追加PID打印输出,不会影响原有作业控制(jobs、fg、bg等命令均可正常使用):
- 第一步:编辑当前用户的bash配置文件,执行命令:
vim ~/.bashrc
- 第二步:将以下配置追加到文件末尾:
# 自定义Control-Z挂起逻辑,自动输出被挂起进程PID ctrlz_suspend() { # 给当前前台进程组发送SIGTSTP信号,和默认Ctrl+Z行为完全一致 kill -TSTP -- -$(ps -o pgid= $$ | tr -d ' ') 2>/dev/null # 短暂等待进程状态更新 sleep 0.1 # 读取最新被挂起进程的PID local spid=$(jobs -p | tail -n1) [ -n "$spid" ] && echo -e "\n*被挂起进程PID: $spid*" } # 取消默认的Ctrl+Z挂起按键绑定 stty susp undef # 将Ctrl+Z绑定到自定义函数 bind -x '"\C-z": ctrlz_suspend'
- 第三步:执行以下命令让配置立即生效:
source ~/.bashrc
配置生效后,再按Control+Z挂起前台进程,输出效果如下:
^Z *被挂起进程PID: 26729* [1]+ Stopped bash test.sh
轻量替代方案
如果不想修改按键绑定,也可以通过配置提示符触发命令,在每次回到命令行时自动打印带PID的作业列表:
- 编辑
~/.bashrc,追加以下内容:
# 每次输出命令提示符前,打印带PID的作业列表 PROMPT_COMMAND='jobs -l'
- 执行
source ~/.bashrc生效。
该方案的缺点是默认的无PID挂起提示仍然会显示,带PID的作业信息会在进程挂起后、首次出现命令提示符时展示。
内容的提问来源于stack exchange,提问作者user19264607
相关产品推荐
相关产品推荐

