如何停止Bash中运行的后台心跳循环
解决方案
你可以通过以下几种方式停止后台运行的心跳循环:
方案1:启动时记录PID,停止时直接销毁(推荐)
后台进程启动后,Bash会自动将最近一个后台进程的PID存入内置变量$!,你只需要在启动时保存该值,停止时销毁对应进程及其附属子进程即可:
- 修改启动代码,保存心跳进程PID
# 启动心跳循环并记录PID (while true do sleep $interval echo '{"op":1,"d":null}' > ws0 done) & HEARTBEAT_PID=$!
- 需要停止心跳时,执行以下命令销毁整个进程组(避免残留sleep子进程)
# 负号表示销毁对应PID的整个进程组,会同时杀掉循环内的sleep进程 kill -- -$HEARTBEAT_PID
方案2:通过标记文件实现优雅退出(无强制杀进程风险)
如果不想用强制杀进程的方式,可以在循环内增加停止标记判断,无需记录PID也能安全停止:
- 修改心跳循环代码
# 提前清除残留的停止标记 rm -f /tmp/shellcord_heartbeat_stop (while true do # 每次循环前先判断是否需要退出 if [ -f /tmp/shellcord_heartbeat_stop ]; then rm -f /tmp/shellcord_heartbeat_stop exit 0 fi sleep $interval echo '{"op":1,"d":null}' > ws0 done) &
- 需要停止心跳时,只需创建对应标记文件,进程最多等待
$interval秒就会自动退出
touch /tmp/shellcord_heartbeat_stop
应急方案:未记录PID时查找并销毁进程
如果你没有提前记录PID,可以用pgrep匹配进程特征找到PID后销毁:
# 查找匹配心跳循环特征的进程PID HEARTBEAT_PID=$(pgrep -f 'while true do sleep.*echo {"op":1') # 销毁进程组 kill -- -$HEARTBEAT_PID
内容的提问来源于stack exchange,提问作者dev_null
相关产品推荐
相关产品推荐

