Quando si tenta di interrompere definitivamente un processo, quale opzione per "uccidere" è necessario utilizzare?


26

Ricevo molti messaggi misti dalle persone e mi chiedevo se non ci fosse davvero molta differenza in quello che usi.

kill 'x'
killall 'x'
kill -9 'x'

Queste sono alcune opzioni che mi è stato detto di usare finora, ma alcune persone dicono che uccidere -9 è solo eccessivo, uccidere da solo non funziona, ecc.

Qualcuno ha qualche consiglio su quale dovrebbe essere usato nel caso più standard di terminare un processo (e quindi anche il suo stato)?

[modifica] Sto cercando cosa usare quando si desidera interrompere l'esecuzione del processo in modo da poterne eseguire uno nuovo, dall'inizio


1
Vedi anche la lettera del modulo UUK9 che mette in guardia contro gli abusi SIGKILL.
jw013,

1
Per elencare tutti i diversi segnali, insieme al loro numero: kill -le per tradurre un numero nel nome del segnale corrispondente, ad es . kill -l 9Tornerà KILL.

Risposte:


24

Esistono numerosi segnali la cui disposizione predefinita è di terminare il processo. Il segnale di terminazione finale è SIGKILL poiché non può essere gestito e il processo non ha altra scelta che morire. Ciò significa anche che se lo si invia, il processo è privato dell'opportunità di ripulire. Pertanto, le buone maniere richiedono di inviare un segnale come SIGTERM che può essere gestito per primo e solo se il processo non termina dopo un po 'di tempo inviarlo SIGKILL.

Si noti che SIGINT e SIGQUIT non sono buoni candidati per l'interruzione arbitraria del processo. A causa del fatto che possono essere generati dalla tastiera del terminale, molte applicazioni li usano per scopi speciali. Ad esempio, l'interprete di Python utilizza SIGINT per generare KeyboardInterruptun'eccezione (anche nelle sessioni interattive di Python in cui ritorna semplicemente al prompt) e JVM utilizza SIGQUIT per scaricare le tracce dello stack. SIGINT e SIGQUIT rimangono efficaci per la maggior parte delle utility della riga di comando standard come findo cat.

Durante l'arresto del sistema, la maggior parte dei sistemi UNIX e Linux invia SIGTERM a tutto il processo, seguito da 5 secondi di attesa, seguito da SIGKILL. Questo è il modo consigliato per chiudere in sicurezza un processo arbitrario.

Si noti inoltre che anche SIGKILL potrebbe non interrompere un processo bloccato in attesa ininterrotta fino a quando il processo non si avvia.


1
Risposta eccellente. Hai un riferimento per la kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;raccomandazione?
l0b0

+1 tipo di risposta. E che dire di SIGHUP?
Alois Mahdal,

2
@AloisMahdal: SIGHUPviene dal giorno in cui le linee dial-up erano comuni. Quel segnale è stato inviato per indicare che la linea ha riattaccato. Successivamente, quando questo era meno comune SIGHUPveniva talvolta utilizzato dai demoni per rileggere il file di configurazione senza riavviare il processo. In questi tempi moderni SIGHUPviene usato raramente. Molti demoni avranno il loro modo di reinizializzare (cioè, apachectl gracefulo rndc reconfig. Per cose che non dovresti usare i [init.d|smf|upstart|launchd]controlli dove possibile.
bahamat

13

Dovresti iniziare con il più gentile e intensificare da lì. Questo significa SIGINT, SIGTERM, SIGQUIT, SIGKILL. Sebbene la maggior parte delle persone salti SIGINT e SIGQUIT.


Inoltre, alcune applicazioni (come JDK) gestiscono SIGQUIT in modo diverso. Probabilmente non userei SIGQUIT senza sapere come l'applicazione specifica lo gestisce.
dimo414,
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.