パイプを介してデータが渡されないときにタイムアウトを実装する方法は?監視装置として機能し、次のように使用できます。
process1 | watchdog --timeout 60 | process2
データパイプが入っていないときに監視プロセスを終了したいです。
ありがとうございます!
ベストアンサー1
まず、あなたの質問の監視パイプは、process1
デッドパイプに書き換えようとしない限り終了しません。したがって、ウォッチドッグは何らかの方法で明示的にprocess1を終了する必要があります。
これに加えて、非常に単純なwatchdog.sh
シェルスクリプトがあります。コンソールで対話的にテストできます。と入力すると、./watchdog.sh
入力した内容がすべてコピーされ、5秒間何も入力しないと停止します。
#!/bin/bash
# first arg is timeout (default: 5)
T="${1:-5}"
PID=$$
exec tee >(bash -c '
while true ; do
bytes=$(timeout '$T' cat | wc -c)
if ! [ "$bytes" -gt 0 ] ;then
break
fi
done
## add something like "killall process1", for now we just kill this tee command
kill -9 '$PID)
スクリプトは実際にはTと2 * Tの間でタイムアウトします(そうでなければより複雑になります)。最初に述べたように、killメソッドを何とか追加できますprocess1
。
以下はテストの例です。
プロセス1.sh:
#!/bin/bash
echo "here we are ..."
sleep 2
echo "still alive ..."
sleep 20
echo "too late ..."
そして、次のように実行します(タイムアウト時にprocess1.shを終了する醜い方法を含む)。
(./process1.sh & echo $! >/tmp/pid; wait) |(./watchdog.sh 5; kill `cat /tmp/pid`)