Bashスクリプトはバックグラウンドでプログラムを実行し、プログラムの標準出力をファイルにリダイレクトします。過去x秒間標準出力に書き込まれなかった場合にプログラムを終了するにはどうすればよいですか?
prog > out.txt &
PID=$!
...
wait $PID
他のプログラムを介して出力の連続性をチェックすることを想像してみてください。unbuffer
出力バッファリングを無効にする必要があるかもしれません。
unbuffer prog | ... > out.txt &
答え1
/usr/bin/inotifywait
このオプションなしでスクリプトで使用できるため、-m
最初の書き込みイベントで監視が停止します。このオプションを使用すると、-t 10
プロセスはコードで終了します。2
#!/usr/bin/env bash
my_prog > out.txt &
my_prog_pid="$!"
my_watch_status=0
while [ "$my_watch_status" != "2" ]; do
/usr/bin/inotifywait -qq -t 10 -e modify out.txt 2>/dev/null &
wait $!
my_watch_status="$?"
done
kill -9 "$my_prog_pid"
exit <my exit_code>
- オプション(「非常に静かな」)と標準エラーリダイレクトは、標準エラーの診断情報と標準出力のイベント情報を抑制するように
-qq
設計されています。/dev/null
inotifywait
- 書き込みが行われるたびに
out.txt
(10秒の期間内)、新しい10秒の監視期間が開始されます。 kill -9
、また〜として知られる信号を殺すmy_prog
、秩序ある退場に対するあなたの可能な要求を認識しないようにします。正常終了するには、kill "$my_prog_pid"
単純終了を使用します。- 指定された期間内に書き込み変更が行われない場合にのみ、スクリプトは終了し、オプションで終了
my_prog
コードで終了します。out.txt
- 実行中は、時間範囲が完璧な10秒ではないことに注意してください。監視の設定に時間がかかるため、実際の時間枠は10秒を少し超えています(ファイルの場合は「ミリ秒」と思います)。 1つのファイルしか監視しないため、これは重要ではありませんが、大きなツリー(何千ものファイルを含むディレクトリ構造を想像してください)を繰り返し監視することは非常に重要になる可能性があります。 10秒の時間枠がアプリケーションにとって重要な場合は、ここで提案されている方法以外の方法を調べて、すべての時間枠の範囲または最悪のシナリオで毎回監視をリセットする必要がないようにすることができます。この期間内に書き込みイベントが発生した場合。
答え2
次のように見えます。
#!/bin/bash
while read line -t 10
do
echo $line
done
if [ $? -gt 128 ]
then
echo "Timeout occurred"
killall -SIGKILL procces
fi