当命令输出含'continue'关键词时终止该命令的脚本故障排查
问题分析与解决方案
原脚本存在两个关键问题导致无法正常运行:
- kill命令语法错误:
kill -$pid是错误写法,减号后应跟信号编号/名称(比如kill -9 $pid用于强制终止),若使用默认终止信号(TERM),直接写kill $pid即可。 - 输出缓冲延迟:多数命令默认对文件输出使用块缓冲,导致"continue"字样已经输出但未立即写入日志,grep轮询无法及时检测到。
修正方案一:修复日志轮询脚本
# 用stdbuf强制命令输出为行缓冲,确保日志实时更新 stdbuf -oL -eL Command_to_run >> "logfile" 2>&1 & pid=$! # 轮询日志,直到检测到关键词 while ! grep -q "continue" "$logfile"; do sleep 0.5 # 缩短轮询间隔,提升响应速度 done # 终止目标进程 kill $pid
stdbuf -oL -eL:强制标准输出(-oL)和标准错误(-eL)使用行缓冲,让命令输出的内容实时写入日志文件。- 调整
sleep间隔为0.5秒,比原脚本的1秒更快响应关键词出现。
修正方案二:直接捕获输出(无需轮询日志)
这种方法跳过日志文件轮询,直接捕获命令输出并实时检测,效率更高:
# 启动命令并同时保存日志到文件 Command_to_run 2>&1 | tee -a logfile & pid=$! # 监听输出,匹配到"continue"后立即退出 grep -q "continue" # 终止进程 kill $pid
tee -a logfile:既把命令输出打印到终端(可选),又追加写入日志文件。grep -q "continue":会持续读取命令输出,一旦匹配到关键词就立即退出,无需循环轮询。
内容的提问来源于stack exchange,提问作者Girish
相关产品推荐
相关产品推荐

