子プロセスがまだ出力を生成しているかどうかを検出します。そうしないと、指定されたタイムアウト後に終了できるシェルツールはありますか?
バックアップ用にGmailを使用しますofflineimap
が、非常に不安定です。 IMAP 条件やその他の理由により、定期的に処理が停止します。進行状況を確認するには、プロセスを継続的に再起動する必要があります。したがって、私が現在使用している理由は次のとおりです。
(ulimit -t 300 ; offlineimap)
流通中。関係なく、5分ごとにツールを再起動してください。
これは、実際にいくつかのタスクを実行しているときにプロセスを早期に終了するか、プロセスがすでにブロックされている状態で4分待つため、やや満足できません。私は次のようなものが欲しいです。
offlineimap > output.log &
stillmakingoutput? --timeout 60 output.log || kill $!
カスタム実行/モニタリングスクリプトを使用することは可能ですが、この状況に対する一般的なアプローチはありませんか?
答え1
したがって、プロセスがまだ機能していることを確認するために、ログファイルのサイズを確認する「小さい」タイムアウトスクリプトを使用して動作しました。きれいではありませんが役に立ちます。
#!/bin/sh
TIMEOUT=$1
FILE=$2
PID=$3
if [ -z "$PID" ]
then
echo $0 timeout file pid
echo " e.g. 60 /tmp/log 16325"
exit
fi
echo "stalekill: timeout=$TIMEOUT file=$FILE pid=$PID"
sleep 1
SIZE=0
while true
do
sleep 3
NEWSIZE=$(stat -c%s "$FILE")
if [ "$NEWSIZE" -eq "$SIZE" ]
then
echo "stalekill '$FILE' unchanged; $SIZE"
sleep $TIMEOUT
NEWSIZE=$(stat -c%s "$FILE")
if [ "$NEWSIZE" -eq "$SIZE" ]
then
kill $PID || sleep 2 && kill -9 $PID
exit
fi
echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
else
echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
fi
SIZE=$NEWSIZE
done
呼び出し方法は次のとおりです(ループ)。
./offlineimap.py >> ./log.txt 2>&1 & stalekill 25 ./log.txt $!
タイミングがあまりにも技術的ではなく、プロセスが自分で終了しているかどうかを確認するのも良いですが、基本的に作業を行います。
しかし、それにもかかわらず、誰かがこの仕事のために異なるか、より標準化された解決策を知っている場合:accepted answer tick still available
。
答え2
試してみてくださいhttp://pyropus.ca/software/getmail/。各 IMAP アカウントにタイムアウトを設定できます。
答え3
一度見てみたいかもしれません監視装置これはあなたのニーズに適している可能性があります。