로그 출력 키워드를 기반으로 서비스를 다시 시작합니다.

로그 출력 키워드를 기반으로 서비스를 다시 시작합니다.

systemctl status 또는 로그 파일에 특정 텍스트 출력이 나타나면 서비스를 다시 시작하려고 합니다.

이 예의 전체 행은 다음과 같습니다.

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각 행을 쉘 변수에 넣습니다 line.

=~배쉬의 것이에요정규식운영자. 여기서는 행에 plexdriveand 그 뒤 어딘가에 포함되어 있는지 확인합니다 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 )

관련 정보