Pomocí 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
Původní stdout duplikujeme na fd 3 (3>&1
), abychom jej mohli obnovit za slowprocess.sh
(>&3
), zatímco stdout pro zbytek (...)
subshell přejde do kanálu na read -t 3
.
Případně, pokud chcete použít timeout
(zde za předpokladu GNU timeout
):
timeout --foreground 3 sh -c './slowprocess.sh;exit'
by se vyhnul slowprocess.sh
zabíjeni (;exit
je nezbytný pro sh
implementace, které se optimalizují provedením posledního příkazu v procesu shellu).
Zde je řešení využívající pouze všudypřítomné nástroje shellu.
To by mělo být snadno provedeno rozvětvením pomalého procesu a sleep
na pozadí a čeká na dokončení prvního, kromě wait
vestavěný shell čeká na všechny úlohy dokončit, nikoli pouze pro první.
Místo toho rozvětvete pomalý proces a sleep
na pozadí je nechte oba nahlásit svůj stav pomocí kanálu a přečíst první stav, který z kanálu vyjde.
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"