You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本监听journalctl在线/离线事件时变量异常及功能实现求助

问题分析与修复方案

核心问题:错误的条件判断强制覆盖变量

你的脚本中[[ $status="offline" ]]是赋值操作而非比较操作。这会在每次循环时把status强制设为offline——哪怕你通过online事件将变量改为online,下一行的判断语句也会立刻把它重置回offline,这就是online事件触发后变量状态不更新的根本原因。

其他优化点

  1. 避免子shell变量隔离:管道启动的while循环会在子shell中运行,子shell内的变量修改无法传递到父shell。改用进程替换< <(journalctl -fqn0)的方式,能让循环在当前shell执行。
  2. 简化grep写法:用grep -q配合here-string替代echo | grep,减少冗余且更高效。
  3. 初始化变量:提前给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)

测试验证

  1. 运行修正后的脚本
  2. 发送offline事件:logger "trigger offline",此时journalctl捕获事件,status设为offline,脚本开始重启NetworkManager
  3. 发送online事件:logger "trigger online",status更新为online,脚本停止重启操作

内容的提问来源于stack exchange,提问作者Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:11:37