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

求助:开发接收SIGUSR1信号后打印PID并退出的Bash循环脚本

解决Bash脚本捕获SIGUSR1信号并退出的问题

嘿,刚学Bash三四天就碰到这个需求太正常啦,我来给你一步步实现这个脚本!核心就是用Bash的trap命令来捕获SIGUSR1信号,然后触发打印PID并退出的动作。

完整脚本示例

#!/bin/bash

# 定义处理SIGUSR1信号的函数
handle_sigusr1() {
    echo "收到SIGUSR1信号,当前脚本PID: $$"
    exit 0
}

# 绑定SIGUSR1信号到我们的处理函数
trap handle_sigusr1 SIGUSR1

# 启动循环(这里用无限循环做示例,你可以替换成自己的业务逻辑)
echo "脚本已启动,PID: $$"
echo "可以用这个命令终止我:kill -USR1 $$"
while true; do
    # 这里放你的循环任务,比如休眠1秒模拟后台运行
    sleep 1
done

关键部分解释

  • $$:这是Bash的特殊内置变量,会自动替换为当前脚本的进程ID,完美满足你打印PID的需求
  • trap handle_sigusr1 SIGUSR1:这句命令告诉Bash,当接收到SIGUSR1信号时,执行我们定义的handle_sigusr1函数
  • 循环部分:示例里用while true做无限循环,你可以根据实际任务改成自己的逻辑,比如遍历文件、重复执行某个命令等

测试步骤

  1. 把上面的代码保存成sig_exit.sh文件
  2. 给脚本添加执行权限:chmod +x sig_exit.sh
  3. 运行脚本:./sig_exit.sh
  4. 打开另一个终端窗口,用kill -USR1 <脚本PID>发送信号(或者直接用脚本提示里的命令,替换成实际运行的PID)
  5. 此时脚本会立刻打印PID并退出

简化写法(不用函数)

如果你的需求很简单,也可以不用单独定义函数,直接把命令写在trap里,更简洁:

#!/bin/bash
trap 'echo "收到SIGUSR1,PID: $$"; exit 0' SIGUSR1

echo "脚本启动,PID: $$"
while true; do
    sleep 1
done

内容的提问来源于stack exchange,提问作者user11321022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:52:48