web-dev-qa-db-ja.com

特定のテキストを出力する場合にプロセスを再起動するシェルスクリプト

pythonプログラムがあります。これは通常、ネットワークの問題が原因でいくつかの異なる例外でクラッシュします。それを機能させる唯一の方法は、再起動することです。シェルスクリプトを記述してプロセスを実行し、出力のいずれかがErrorであるかどうかを継続的に確認し、そうであればプロセスを終了してコマンドを再起動します(呼び出して./command.sh)?

これが他の言語(python/Perlなど)であれば問題ありません。

3
Callum Rogers

pythonは例外をスローするとリターンコード!= 0で終了するため、このシェルスクリプトを実行するだけです。

while ! ./command.sh ; do : ; done

もちろん、常にコマンドを実行するだけの場合は、次のように記述します。

while true ; do ./command.sh ; done

(これは./command.sh分岐せずに終了します)

3
jmuc

通常のクラッシュからted(Torrent Episode Downloader)を回復するのと似たようなことをしました。以下は私が使用したスクリプトです。今後の編集で説明します。

編集:仕組み

Tedにはログファイルがあります。 30分ごとに新しいエピソードをチェックするため、そのログにはタイムスタンプがあります。これは30分以内です。もちろん、その間にtedがクラッシュした場合、タイムスタンプはありません。

編集:どのように役立つか

問題のあるプログラムの出力をファイルにリダイレクトできます。このファイルをチェックする、私のようなスクリプトを作成します。不正な文字列が見つかった場合、アプリケーションを再起動します(そして出力ファイルを削除します)。スクリプトを無限ループで実行するか、cronを使用できます。 cronを使用することを選択したので、プロセス汚染が少なくなり、とにかくチェックを頻繁に行う必要がなくなりました。

#!/bin/bash
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 [email protected].
# Use permitted under MIT license:
# http://www.opensource.org/licenses/mit-license.php (NO WARRANTY IMPLIED)

teddir='/home/confus/ted'   # Location of the ted executable
logpath='/home/confus/.Torrent Episode Downloader/log.txt' # Location of ted's log

# Get the process id for ted so it can be killed later
pid=$(lsof "$teddir/ted.jar" | grep -m1 Java )
set -- $pid
pid=$2
echo "Ted is running unter pid: $pid."

# Check if the log is recent
search=$(date "+%b %d, %Y @ {0,1}%l:[0-9]{2} %p")
search=$(cat "$logpath" | grep -oE "$search")

# If ted is running and the log is not recent, kill crashed process and
#+restart it.
if [ -n "$pid" ] && [ ! -n "$search" ]; then
    echo "Killig $pid."
    kill "$pid" || exit 1
    echo "Restarting ted..."
    cd "$teddir"
    /usr/bin/Java -jar ted.jar noTray
fi

exit 0

私の場合、クラッシュ後もtedのアクティブなプロセスが残っていましたが、tedは何もしていませんでした。プロセスを強制終了します。その後、もちろんpidパーツをスキップできます。

追伸悪いコードかもしれませんし、そうでないかもしれません。もっと良い方法があるかもしれませんが、それは機能し、私は非常に短い時間でそれをまとめました。

2
con-f-use