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"