4

RiotShield (League of Legends のサードパーティ プレイヤー スクレーパー) の出力を監視してクラッシュを監視する小さな bash スクリプトを作成しようとしています。ログにキーワードが見つかった場合は、プロセスを強制終了して再起動する必要があります。

これが私のbashスクリプトです。

#!/bin/bash
crash[1]="disconnected"
crash[2]="38290209"
while true; do
    list=$(tail log.log)
    #clear
    echo "Reading Log"
    echo "========================================"
    echo $list
    for item in ${list//\\n/ }
    do
            for index in 1 2
            do
                    c=${crash[index]}
                    #echo "Crash Word:" $c
                    if [[ "$c" == *"$item"* ]]; then
                            echo "RiotShield has crashed."
                            echo "Killing RiotShield."
                            kill $(ps aux | grep '[R]iotShield.exe' | awk '{print $2}')
                            echo "RiotShield killed!"
                            echo "Clearing log."
                            echo > log.log
                            echo "Starting RiotShield"
                            (mono RiotShield.exe >> log.log &)

                    fi
            done

    done

    sleep 10
done

私のクラッシュ配列は、クラッシュしたときにログに表示されることがわかっているキーワードです。38290209 は、League of Legends での私のサモナー ID であり、サモナー名の検索を実行した瞬間に、ID がログに表示されるため、テスト目的でのみそこにあります。

問題は切断されていても 38290209 がログに表示されない

if [[ "$c" == *"$item"* ]]; then

起動し、RiotShield プロセスを強制終了してから再起動します。

クラッシュのキーワードが増えると、クラッシュ配列の長さが長くなるので、それだけではできません

if [[ "$c" == "*disconnected*" ]]; then

よろしくお願いします SOF

編集:

作業コードの追加:

#!/bin/bash
crash[1]="disconnected"
crash[2]="error"
while true; do
    list=$(tail log.log)
    clear
    echo "Reading Log"
    echo "========================================"
    echo $list
    for index in 1 2
    do
            c=${crash[index]}
            #echo "Crash Word:" $c
            if [[ $list == *$c* ]]; then
                    echo "RiotShield has crashed."
                    echo "Crash Flag: " $c
                    echo "Killing RiotShield."
                    kill $(ps aux | grep '[R]iotShield.exe' | awk '{print $2}')
                    echo "RiotShield killed!"
                    echo "Clearing log."
                    echo > log.log
                    echo "Starting RiotShield"
                    (mono RiotShield.exe >> log.log &)
                    fi
            done
    sleep 10
done
4

1 に答える 1

4

式のオペランドが間違っていると思います。そのはず:

if [[ $item == *$c* ]]; then

$cキーワード ( ) が行 ( ) に存在するかどうかを確認するためです$item

また、次のようにして行を項目に分割する必要がある理由がわかりません${list//\\n/ }。行全体を一致させることができます。

また、 内では二重引用符は必要ないことに注意してください[[

于 2013-02-04T17:02:54.267 に答える