Bashで終了していないプロセスのタイムアウト

Bashで終了していないプロセスのタイムアウト

メインスクリプトが実行中でタイムアウト内に完了しない場合は、完了したかどうかに応じてメインスクリプトで「何かを実行する」2番目の「遅いプロセス」を開始したいと思います。注:「遅いプロセス」がタイムアウトの前に完了した場合は、フルタイムアウトを待ちたくありません。

「遅いプロセス」が続き、パフォーマンスに関する統計とフォレンジックを収集できることを願っています。

使用を調べた停止するしかし、完了すると、私のスクリプトは終了します。

次の簡単な例を考えてみましょう。

メインディレクトリ

result=`timeout 3 ./slowprocess.sh`
if [ "$result" = "Complete" ]
then
 echo "Cool it completed, do stuff..."
else
 echo "It didn't complete, do something else..."
fi

遅いプロセス.sh

#!/bin/bash
start=`date +%s`
sleep 5
end=`date +%s`
total=`expr $end - $start`
echo $total >> /tmp/performance.log
echo "Complete"

ここではタイムアウトを使用してスクリプトが終了するため、何も起こりません/tmp/performance.log。終わりたいのですが、3秒で終わらなくても次のステップに進みたいslowprocess.shです。main.sh

ベストアンサー1

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>&1stdoutはパイプに移動します。slowprocess.sh>&3(...)read -t 3

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

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

終了するのを防ぎます(これはslowprocess.shシェルプロセスで最後のコマンドを実行し、最適化された実装に;exit必要です)。sh

おすすめ記事