Bash脚本监听journalctl在线/离线事件时变量异常及功能实现求助
问题分析与修复方案
核心问题:错误的条件判断强制覆盖变量
你的脚本中[[ $status="offline" ]]是赋值操作而非比较操作。这会在每次循环时把status强制设为offline——哪怕你通过online事件将变量改为online,下一行的判断语句也会立刻把它重置回offline,这就是online事件触发后变量状态不更新的根本原因。
其他优化点
- 避免子shell变量隔离:管道启动的
while循环会在子shell中运行,子shell内的变量修改无法传递到父shell。改用进程替换< <(journalctl -fqn0)的方式,能让循环在当前shell执行。 - 简化grep写法:用
grep -q配合here-string替代echo | grep,减少冗余且更高效。 - 初始化变量:提前给
status设置默认值,避免未定义状态引发的异常。
修正后的脚本
#!/bin/bash # 初始化status变量为默认值 status="online" # 使用进程替换避免子shell问题 while read line do # 匹配offline触发事件 if grep -q "trigger offline" <<< "$line" then status="offline" fi # 匹配online触发事件 if grep -q "trigger online" <<< "$line" then status="online" fi sleep 3 logger "Status is $status" # 正确的条件比较:使用==判断相等 if [[ $status == "offline" ]] then # 重启NetworkManager的逻辑 logger "Restarting NetworkManager..." systemctl restart NetworkManager fi done < <(journalctl -fqn0)
测试验证
- 运行修正后的脚本
- 发送offline事件:
logger "trigger offline",此时journalctl捕获事件,status设为offline,脚本开始重启NetworkManager - 发送online事件:
logger "trigger online",status更新为online,脚本停止重启操作
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

