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"