GNU/Linux >> Znalost Linux >  >> Linux

časový limit bez procesu zabíjení v bash

Pomocí 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

Původní stdout duplikujeme na fd 3 (3>&1 ), abychom jej mohli obnovit za slowprocess.sh (>&3 ), zatímco stdout pro zbytek (...) subshell přejde do kanálu na read -t 3 .

Případně, pokud chcete použít timeout (zde za předpokladu GNU timeout ):

timeout --foreground 3 sh -c './slowprocess.sh;exit'

by se vyhnul slowprocess.sh zabíjeni (;exit je nezbytný pro sh implementace, které se optimalizují provedením posledního příkazu v procesu shellu).


Zde je řešení využívající pouze všudypřítomné nástroje shellu.

To by mělo být snadno provedeno rozvětvením pomalého procesu a sleep na pozadí a čeká na dokončení prvního, kromě wait vestavěný shell čeká na všechny úlohy dokončit, nikoli pouze pro první.

Místo toho rozvětvete pomalý proces a sleep na pozadí je nechte oba nahlásit svůj stav pomocí kanálu a přečíst první stav, který z kanálu vyjde.

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. Definování proměnné s exportem nebo bez exportu

  2. Čtěte řádek po řádku v bash skriptu

  3. Proces na pozadí v linuxu

  1. Bash:počkejte s časovým limitem

  2. Procesy zabíjení v Raspbianu

  3. Jak odpojit relaci ssh bez zabití běžícího procesu?

  1. How To Echo A Bang!?

  2. Použití případových prohlášení v Bash

  3. Špičkové využití paměti procesem