Uccidi un processo se va in silenzio per un certo periodo di tempo


9

Ho un'utilità che ha la brutta abitudine di stare zitta e di stare lì, so già da quanto tempo fa questo processo, quindi sto usando timeoutper combattere questo, ma a volte lo fa prima di quel momento. Esiste uno strumento simile a timeoutquello che uccide il processo se smette di indirizzare l'output su stdout?

Risposte:


8

Con zsh, potresti fare:

zmodload zsh/system
coproc your-command
while :; do
  sysread -t 10 -o 1 <&p && continue
  if (( $? == 4 )); then
    echo "Timeout" >&2
    kill $!
  fi
  break
done

L'idea è di usare l' -topzione di sysreadleggere your-commanddall'output con un timeout.

Nota che rende your-commandl'output di una pipe. Può essere che your-commandinizi a bufferizzare il suo output quando non va su un terminale, nel qual caso potresti scoprire che non emette nulla da un po 'di tempo, ma solo a causa di quel buffering, non perché è bloccato in qualche modo.

Puoi aggirare il problema usando stdbuf -oL your-commandper ripristinare il buffering di linea (se il tuo comando usa stdio) o usa zptyinvece dicoproc falsificare un output del terminale.

Con bash, dovresti fare affidamento su dde GNU timeoutse disponibile:

coproc your-command
while :; do
  timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
  if (($? == 124)); then
    echo Timeout >&2
    kill "$!"
  fi
done

Invece di coproc, puoi anche usare la sostituzione di processo:

while :; do
  timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
  if (($? == 124)); then
    echo Timeout >&2
    kill "$!"
  fi
done 3< <(your-command)

(che non funzionerà zsho ksh93perché $!non contiene il pid di your-commandlì).


1
Ciao! Grazie, è possibile che tu possa commentare così posso capire cosa sta facendo?
Benjojo,

0

Reindirizzerei STDOUT su un file e quindi utilizzerei il test di data e ora di monit per riavviare il processo se il mtime del file è maggiore di una soglia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.