当 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,但是每次脚本运行时,无论包含所需正则表达式的行如何,它都会重新启动服务文件。
这样的脚本是:
答案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 )