プロセスが一定時間静かになった場合、プロセスを強制終了します


9

私は静かにしてそこに留まるという厄介な癖のあるユーティリティを持っています。これはプロセスにどれくらいの期間これを行うのかすでに知っているのでtimeout、これと戦うために使用していますが、その前にそれを行うこともあります。timeoutstdoutへの出力の送信を停止した場合、プロセスを強制終了する同様のツールはありますか?

回答:


8

を使用するとzsh、次のことができます。

zmodload zsh/system
coproc your-command
while :; do
  sysread -t 10 -o 1 <&p && continue
  if (( $? == 4 )); then
    echo "Timeout" >&2
    kill $!
  fi
  break
done

タイムアウト付きで出力から読み取る-tオプションを使用するという考えです。sysreadyour-command

your-commandの出力をパイプにすることに注意してください。your-command端末に移動しないときに出力のバッファリングを開始する場合があります。その場合、しばらくの間何も出力されないことがありますが、それはバッファリングが原因であり、何らかの理由でハングしているためではありません。

を使用stdbuf -oL your-commandして行バッファリングを復元するか(コマンドでstdioを使用する場合)、またはのzpty代わりにcoprocを使用して端末出力を偽造することで回避できます。

を使用する場合、利用可能であればGNU bashに依存する必要がddありtimeoutます。

coproc your-command
while :; do
  timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
  if (($? == 124)); then
    echo Timeout >&2
    kill "$!"
  fi
done

の代わりにcoproc、プロセス置換を使用することもできます。

while :; do
  timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
  if (($? == 124)); then
    echo Timeout >&2
    kill "$!"
  fi
done 3< <(your-command)

(それは動作しないzshか、そこにpidが含まれていないksh93ため)。$!your-command


1
こんにちは!おかげで、これをコメントして、これが何をしているのか理解できますか?
Benjojo 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.