如何编写进程成功结束时退出的Bash脚本While循环
修复Bash脚本的进程检测循环
你的原脚本存在一个关键问题:进程数量变量VAR只在循环开始前计算一次,循环内不会重新获取最新的进程状态,导致即使目标进程已经结束,脚本也无法检测到并退出。
以下是两种修正方案:
方案一:循环内重新统计进程数
在每次循环中重新计算目标进程的数量,确保检测的是实时状态:
while true; do # 重新统计匹配"tail"的进程数(去掉原代码里多余的*,避免shell解析错误) VAR=$(ps -ef | grep -i tail | grep -v grep | wc -l) if [ "$VAR" -eq 0 ]; then echo "Sending MAils ...." exit 0 fi # 添加休眠减少CPU占用 sleep 1 done
方案二:用pgrep简化检测逻辑
pgrep是专门用于查找进程ID的工具,比管道组合更简洁高效:
# 当匹配"tail"的进程存在时,循环继续;进程结束则退出循环 while pgrep -i tail > /dev/null; do sleep 1 done echo "Sending MAils ...." exit 0
注意事项
- 原代码中的
tail*写法错误:*会被shell解析为当前目录下以tail开头的文件名,而非正则匹配,直接写tail即可匹配包含该关键词的进程。 - 添加
sleep 1是为了避免脚本高频循环占用过多CPU资源。
内容的提问来源于stack exchange,提问作者MohammedNour Al-Rawabdeh
相关产品推荐
相关产品推荐

