GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Timeout ohne Killing-Prozess in Bash

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"

Linux
  1. Variable mit oder ohne Export definieren

  2. Wie kann man einen untergeordneten Prozess nach einem bestimmten Timeout in Bash beenden?

  3. Bash/sh 'if else'-Anweisung

  4. Bash-Verlauf ohne Zeilennummern

  5. Überprüfen Sie, ob eine Variable in einer Liste in Bash vorhanden ist

So verwenden Sie den Echo-Befehl ohne Zeilenumbruch

Bash:Warte mit Timeout

Was ist die Verwendung von $ # in Bash

Wie man eine Gruppe von Befehlen in Bash ausschaltet

Killing-Prozesse in Raspbian

Maximale Speicherauslastung eines Prozesses