pythonプログラムがあります。これは通常、ネットワークの問題が原因でいくつかの異なる例外でクラッシュします。それを機能させる唯一の方法は、再起動することです。シェルスクリプトを記述してプロセスを実行し、出力のいずれかがError
であるかどうかを継続的に確認し、そうであればプロセスを終了してコマンドを再起動します(呼び出して./command.sh
)?
これが他の言語(python/Perlなど)であれば問題ありません。
pythonは例外をスローするとリターンコード!= 0で終了するため、このシェルスクリプトを実行するだけです。
while ! ./command.sh ; do : ; done
もちろん、常にコマンドを実行するだけの場合は、次のように記述します。
while true ; do ./command.sh ; done
(これは./command.sh
分岐せずに終了します)
通常のクラッシュから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パーツをスキップできます。
追伸悪いコードかもしれませんし、そうでないかもしれません。もっと良い方法があるかもしれませんが、それは機能し、私は非常に短い時間でそれをまとめました。