Avec 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
Nous dupliquons la sortie standard d'origine sur fd 3 (3>&1
) afin que nous puissions le restaurer pour slowprocess.sh
(>&3
), tandis que stdout pour le reste du (...)
le sous-shell va au tuyau vers read -t 3
.
Sinon, si vous souhaitez utiliser timeout
(ici en supposant que GNU timeout
):
timeout --foreground 3 sh -c './slowprocess.sh;exit'
éviterait slowprocess.sh
être tué (le ;exit
est nécessaire pour sh
implémentations qui optimisent en exécutant la dernière commande du processus shell).
Voici une solution utilisant uniquement des outils shell omniprésents.
Cela devrait être facilement fait en bifurquant le processus lent et un sleep
en arrière-plan et attendant que le premier se termine, sauf que le wait
shell intégré attend tous travaux à terminer plutôt que seulement pour le premier.
Donc, à la place, bifurquez le processus lent et un sleep
en arrière-plan, demandez-leur de signaler leur statut via un tuyau et de lire le premier statut qui sort du tuyau.
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"