GNU/Linux >> Tutoriels Linux >  >> Linux

délai d'attente sans tuer le processus dans bash

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"

Linux
  1. Tuer des zombies, style Linux

  2. Comment faire écho à un coup ! ?

  3. Vérifier le processus si le même est en cours d'exécution ?

  4. Lire ligne par ligne dans le script bash

  5. Vérifier si une variable existe dans une liste dans Bash

Comment utiliser la commande echo sans retour à la ligne

Historique bash sans numéro de ligne

À quoi sert $# dans Bash

Comment expirer un groupe de commandes dans Bash

Comment détacher une session ssh sans tuer un processus en cours d'exécution ?

Utilisation maximale de la mémoire d'un processus