Mit 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
Wir duplizieren die ursprüngliche Standardausgabe auf fd 3 (3>&1 ), damit wir es für slowprocess.sh wiederherstellen können (>&3 ), während für den Rest von (...) stdout ausgegeben wird Subshell geht in die Pipe zu read -t 3 .
Alternativ, wenn Sie timeout verwenden möchten (hier unter der Annahme von GNU timeout ):
timeout --foreground 3 sh -c './slowprocess.sh;exit'
würde slowprocess.sh vermeiden getötet werden (die ;exit ist für sh erforderlich Implementierungen, die durch Ausführen des letzten Befehls im Shell-Prozess optimiert werden).
Hier ist eine Lösung, die nur allgegenwärtige Shell-Tools verwendet.
Dies sollte einfach durch Verzweigen des langsamen Prozesses und einem sleep erfolgen im Hintergrund und warten, bis der erste fertig ist, außer dass der wait shell builtin wartet auf alle Jobs zu beenden und nicht nur für den ersten.
Forken Sie stattdessen den langsamen Prozess und eine sleep Lassen Sie beide im Hintergrund ihren Status über eine Pipe melden und den ersten Status lesen, der aus der Pipe kommt.
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"