如何实现Bash脚本未满足grep条件时超时退出?(Pusher CLI场景)
解决Bash脚本超时+匹配退出的方案
我来帮你搞定这个需求!针对用Pusher CLI ping IoT设备的场景,我们可以通过后台运行命令+实时监听输出+超时终止的组合来实现你的需求。下面是完整的脚本和详细解释:
完整脚本示例
#!/bin/bash # -------------------------- 配置区 -------------------------- # 替换成你需要匹配的目标字符串(比如设备在线的标识) TARGET_MATCH="device is online" # 设置超时时间(单位:秒) TIMEOUT=20 # 替换成你的实际Pusher ping命令(比如包含设备ID、密钥等参数) PUSHER_CMD="pusher ping --device-id abc123" # ----------------------------------------------------------- # 启动Pusher命令,将输出通过管道传递给监听循环,同时后台运行 $PUSHER_CMD | while read -r output_line; do # 可选:打印实时输出,方便调试 # echo "[实时输出] $output_line" # 检查当前行是否匹配目标模式 if echo "$output_line" | grep -q "$TARGET_MATCH"; then echo "✅ 匹配到目标条件,立即退出脚本" # 终止后台运行的Pusher进程(避免它继续占用资源) pkill -P $$ pusher exit 0 fi done & # 记录后台Pusher相关进程的PID PUSHER_BACKGROUND_PID=$! # 等待指定的超时时间 sleep $TIMEOUT # 如果执行到这里,说明超时未匹配 echo "⚠️ 超时警告:在$TIMEOUT秒内未匹配到目标条件" # 强制终止Pusher后台进程 kill $PUSHER_BACKGROUND_PID 2>/dev/null exit 1
关键部分解释
后台运行与输出监听
- 我们把
$PUSHER_CMD放到后台运行,同时用while read循环实时读取它的输出,这样不会阻塞主脚本的执行。 grep -q用于静默匹配,只要输出中包含TARGET_MATCH的内容,就触发退出逻辑。
- 我们把
超时处理
- 主脚本通过
sleep $TIMEOUT等待指定时间,如果在这段时间内没有匹配到目标,就会执行后续的超时提示和进程终止操作。
- 主脚本通过
进程终止
- 当匹配成功或超时后,我们需要主动终止Pusher CLI的进程,避免它在后台持续运行。这里用了两种方式:
pkill -P $$ pusher:终止当前脚本($$是当前脚本PID)的子进程中名为pusher的进程,更精准。kill $PUSHER_BACKGROUND_PID:直接终止后台进程的PID,作为兜底方案。
- 当匹配成功或超时后,我们需要主动终止Pusher CLI的进程,避免它在后台持续运行。这里用了两种方式:
使用注意事项
- 请根据你的实际需求修改
TARGET_MATCH、TIMEOUT和PUSHER_CMD这三个配置项。 - 如果Pusher CLI的命令输出有特殊字符,可能需要调整
read命令的参数(比如加上-d ''处理无换行的输出,不过一般ping类命令都是按行输出的)。 - 测试时可以先把
echo "[实时输出] $output_line"的注释去掉,方便观察脚本的执行过程。
内容的提问来源于stack exchange,提问作者Brandon Shega
相关产品推荐
相关产品推荐

