求助:开发接收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做无限循环,你可以根据实际任务改成自己的逻辑,比如遍历文件、重复执行某个命令等
测试步骤
- 把上面的代码保存成
sig_exit.sh文件 - 给脚本添加执行权限:
chmod +x sig_exit.sh - 运行脚本:
./sig_exit.sh - 打开另一个终端窗口,用
kill -USR1 <脚本PID>发送信号(或者直接用脚本提示里的命令,替换成实际运行的PID) - 此时脚本会立刻打印PID并退出
简化写法(不用函数)
如果你的需求很简单,也可以不用单独定义函数,直接把命令写在trap里,更简洁:
#!/bin/bash trap 'echo "收到SIGUSR1,PID: $$"; exit 0' SIGUSR1 echo "脚本启动,PID: $$" while true; do sleep 1 done
内容的提问来源于stack exchange,提问作者user11321022
相关产品推荐
相关产品推荐

