GNU/Linux >> Linux の 問題 >  >> Linux

bashでプロセスを強制終了せずにタイムアウト

ksh/bash/zsh の場合:

{
  (./slowprocess.sh >&3 3>&-; echo "$?") |
    if read -t 3 status; then
      echo "Cool it completed with status $status, do stuff..."
    else
      echo "It didn't complete, do something else..."
    fi
} 3>&1

元の stdout を fd 3 (3>&1) に複製します。 ) slowprocess.sh で復元できるようにします (>&3 )、残りの (...) の標準出力 サブシェルは read -t 3 へのパイプに行きます .

または、 timeout を使用する場合 (ここでは GNU timeout を想定しています) ):

timeout --foreground 3 sh -c './slowprocess.sh;exit'

slowprocess.sh を避ける 殺された (;exit sh には必要です シェル プロセスで最後のコマンドを実行することによって最適化する実装)。


これは、ユビキタスなシェル ツールのみを使用したソリューションです。

これは、遅いプロセスと sleep をフォークすることで簡単に実行できます。 wait シェル組み込みは all を待機します

代わりに、遅いプロセスと sleep を fork します。 バックグラウンドで、両方にパイプを介してステータスを報告させ、パイプから出てくる最初のステータスを読み取ります。

fifo=$(mktemp -u)  # if not on Linux, adapt to what your OS provides
mkfifo -m 600 "$fifo"
{ ./slowprocess.sh; echo z >"$fifo"; } &
sh -c 'sleep 3; echo a' >"$fifo" &
sleep_pgid=$!
read status <$fifo
case $status in
  a) echo "That process is taking a long time"; read ignored <$fifo;;
  z) echo "Done already"; kill -INT -$sleep_pgid;;
esac
rm "$fifo"

Linux
  1. ゾンビを殺す、Linuxスタイル

  2. バンをエコーする方法!?

  3. 同じが実行されている場合はプロセスを確認しますか?

  1. Bashでのケースステートメントの使用

  2. エクスポートありまたはエクスポートなしの変数の定義

  3. Bashスクリプトで1行ずつ読む

  1. Linux でのバックグラウンド プロセス

  2. Bash:タイムアウトで待機

  3. Raspbian でのプロセスの強制終了