根据日志输出关键字重启服务

根据日志输出关键字重启服务

当 systemctl 状态或日志文件中出现特定文本输出时,我尝试重新启动服务。

此示例中的完整行是:

Aug 27 01:05:16 SSD plexdrive410[1321]: [USR/LOCAL/BIN/PLEXDRIVE410] [2018-08-27 01:05] WARNING: Could not update/save object 4PASA4U3Gj8mTvllAAIgEqHdMFHER3q (screens.jpg)

关键词永远包含

WARNING: Could not update/save object

我尝试寻找答案,但找不到答案,我感谢任何指点!




我尝试使用的更新脚本:

感谢您的撰写和解释。第一次会反复重启SERVICE。

然后我添加了 sleep 30,但是每次脚本运行时,无论包含所需正则表达式的行如何,它都会重新启动服务文件。

这样的脚本是:

https://pastebin.com/Vd4bF18c

答案1

你会做类似的事情:

#!/bin/bash

regex="plexdrive.*Could not update\/save object"

journalctl -f -n 0 |
while read line
do
    if [[ "$line" =~ $regex ]]; then
        systemctl restart PLEX_SERVICE
    fi
done

journalctl获取系统日志的输出。-f使用跟随模式,以便该命令位于此处并为您提供新的日记条目。-n 0告诉它不要给你任何以前的日记条目。

输出通过管道传输到while read line.这会无休止地从输出流中读取journalctl,并将每一行放入 shell 变量中line

=~是巴什的正则表达式操作员。在这里,它只是检查该行是否包含plexdrive以及 之后的某个位置Could not update/save object。如果表示的正则表达式regex匹配,则它将运行该行systemctl restart PLEX_SERVICE

答案2

他是上面脚本的一个稍微改进的版本,我用它来捕获 JVM OOM 错误。使用 shellcheck 进行验证。

#!/bin/bash

regex="java.lang.OutOfMemoryError: Java heap space"
sysd_svc=$( systemctl | grep PLEX | awk '{print $1}' )

echo "Info, service '$sysd_svc' will be restarted on match with '$regex'"

while read -r line
do
        # note we DONT quote $regex because we're using ~=
        if [[ "$line" =~ $regex ]]; then
                echo "Info, restarting as line matched : $line"
                #systemctl restart "$sysd_svc"
        else
                echo "Info, line didn't match: $line"
        fi

done < <( journalctl -f -n 0 )

相关内容