Snippet di Bash per aver ucciso un processo fino a quando non è morto?


8

Sto cercando di scrivere un robusto script bash e in esso creo un processo in background. Alla fine della sceneggiatura, voglio ucciderlo. Ho il PID.

Stavo pensando a qualcosa del genere

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

Qualche suggerimento per qualcosa di meglio? Eventuali problemi con questo approccio?


Non volevi dire ps -ef?
user1686,

1
grawity: questo è solo lo stile BSD rispetto alle opzioni UNIX, ma ef sembra adattarsi meglio alle opzioni UNIX. Vorrei andare con 'ps ao pid' me stesso
Kyle Brandt il

while [[ ps ef $PID ]]è un errore di sintassi. Suppongo che intendevi while ps ef $PID.
Dennis,

Risposte:


10

Il problema con l'uccisione ripetuta di un processo è che hai una condizione di competizione con la creazione di un nuovo processo. Non è particolarmente probabile, ma è possibile che il processo venga chiuso e un nuovo processo venga avviato con lo stesso PID mentre dormi.

Perché devi interrompere ripetutamente il processo? Se è perché il processo verrà chiuso, ma potrebbe essere necessario del tempo per uscire dopo aver ricevuto il segnale, è possibile utilizzare wait:

 kill $PID
 wait $PID

In un sistema ideale, non dovresti mai ripetere un killproblema kill -9 $PID. Se è necessario, potresti prendere in considerazione la possibilità di risolvere qualsiasi cosa tu stia eseguendo, quindi non è necessario. Nel frattempo, probabilmente non colpirai le condizioni della gara e potrai difenderti (per esempio) controllando il timestamp di / proc / $ PID / appena prima di terminare il processo. Questo è un brutto scherzo, però.


1
Questo non funziona se il PID non appartiene a un processo figlio, ovvero questo script sta cercando di controllare l'esecuzione di un processo che ha avuto origine altrove. Ricevo bash: wait: pid 32137 is not a child of this shellquando provo. :(
Justin Force,

9

Per tutti quelli che raccomandano il passaggio da kill $PIDa kill -9 $PID, dovrei ricordarti dell'uso inutile di kill -9 .

No no no Non usare kill -9.

Non dà al processo la possibilità di pulire in modo chiaro:

  1. chiudere le connessioni socket

  2. ripulire i file temporanei

  3. informare i suoi figli che sta andando via

  4. resettare le sue caratteristiche terminali

e così via e così via e così via.

In genere, invia 15 e attendi un secondo o due e, se non funziona, invia 2 e, se non funziona, invia 1. In caso contrario, RIMUOVI IL BINARIO perché il programma si comporta male!

Non usare kill -9. Non tirare fuori la mietitrebbia solo per mettere in ordine il vaso di fiori.

Ora, non sono d'accordo con "rimuovi la parte binaria", ma la progressione sembra meno dannosa di una semplice kill -9.

Concordo anche con la cura delle condizioni di gara sulla creazione di nuovi processi con lo stesso PID menzionato qui .


0

Prima fai la tua normale uccisione, Dormi x numero di secondi, quindi uccidi -9 se è ancora in giro. Inoltre, questa sembra una strana situazione in cui ti sei imbattuto, potrebbe voler spiegarci il problema più grande.


Concordato. Se non risponde e si chiude dopo un SIGTERM (il segnale inviato per impostazione predefinita da kill), probabilmente non risponderà al 2 °, 3 °, 4 °, ...., quindi il prossimo corso di azione dovrebbe essere SIGKILL (kill - 9). Ovviamente dovresti assicurarti che la X in "sleep X seconds" sia abbastanza lunga da consentire al processo di eseguire una normale operazione di cancellazione della scrivania, anche se il sistema è pesantemente caricato - potrebbe richiedere una frazione di un secondo normalmente, ma decine di secondi quando il sistema sta battendo.
David Spillett,

0

In genere vuoi provare kill $PIDprima,

quindi lascialo dormire un po 'per vedere se uscirà con grazia.

In caso contrario, eseguire kill -9 $PIDper sbarazzarsi forzatamente di esso.


-1

perché non solo

kill -9 $PID


2
Perché vuoi dare ai processi la possibilità di ripulire e morire bene, che è ciò che fa il segnale TERM (il segnale predefinito). Il segnale KILL ("-9") non dà ai processi quella possibilità.
ktower,

Buon punto, ma il poster originale diceva che voleva solo ucciderlo.
chris,
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.