killall non uccide tutto e raramente uccide, a cosa serve allora il comando?


12

Di tanto in tanto uso il killallcomando per terminare i processi. Il motivo per cui dico per caso è che in alcuni casi non ha funzionato per me.

Un esempio recente è stato con thunderbird in cui c'erano circa 5 istanze in memoria, quindi ho deciso di utilizzare il killallcomando. Ha ucciso 2 processi e 3 sono rimasti ancora in memoria. Ho provato di nuovo e i 3 erano ancora lì.

Quindi ho usato manualmente il kill -9comando per uccidere ciascuno dei singoli processi tramite i loro pid. Ha funzionato

Uso principalmente il kill -9comando mentre funziona. Il killallcomando mi ha deluso così tante volte che non mi preoccupo di usarlo. Ma ci deve essere un motivo per cui non funziona. Lo sto usando male?

So che ci sono altri comandi come, pkillma sarei grato di capire perché il killallcomando non funziona come previsto. Ho anche cercato di uccidere solo un processo ed è un affare incostante. Ma il kill -9comando funziona ogni volta.

Qualche idea?

PS: sudonon fa differenza

Risposte:


22

Dalla pagina man di killall

killall invia un segnale a tutti i processi che eseguono uno dei comandi specificati. Se non viene specificato il nome del segnale, viene inviato SIGTERM.

Quando fai un kill -9, stai inviando il segnale SIGKILL. Se vuoi inviare un SIGKILL con killall, devi farlo

killall -s SIGKILL <PROCESSNAME>

Una buona spiegazione della differenza tra SIGKILL e SIGTERM (e perché dovresti provare prima SIGTERM)

Da http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

L'invio di segnali ai processi utilizzando kill su un sistema Unix non è un nuovo argomento per la maggior parte degli amministratori di sistema, ma molte volte mi è stato chiesto della differenza tra kill e kill -9.

Ogni volta che usi kill su un processo, in realtà stai inviando un segnale al processo (in quasi tutte le situazioni - entrerò presto in quello). Le applicazioni C standard hanno un file header che contiene i passaggi che il processo dovrebbe seguire se riceve un segnale particolare. Puoi ottenere un intero elenco dei segnali disponibili sul tuo sistema controllando la pagina man per kill.

Considera un comando come questo:

kill 2563

Questo invierebbe un segnale chiamato SIGTERM al processo. Una volta che il processo riceve l'avviso, possono accadere alcune cose diverse:

  • il processo potrebbe interrompersi immediatamente
  • il processo potrebbe interrompersi dopo un breve ritardo dopo la pulizia delle risorse
  • il processo può continuare a funzionare indefinitamente

L'applicazione può determinare cosa vuole fare una volta ricevuto un SIGTERM. Mentre la maggior parte delle applicazioni pulirà le loro risorse e si fermerà, alcune potrebbero non farlo. Un'applicazione può essere configurata per fare qualcosa di completamente diverso quando si riceve un SIGTERM. Inoltre, se l'applicazione si trova in uno stato non valido, ad esempio in attesa di I / O del disco, potrebbe non essere in grado di agire sul segnale inviato.

La maggior parte degli amministratori di sistema ricorre di solito al segnale più brusco quando un'applicazione non risponde a un SIGTERM:

kill -9 2563

-9 indica al comando kill che si desidera inviare il segnale n. 9, che si chiama SIGKILL. Con un nome del genere, è ovvio che questo segnale ha un po 'più di peso.

Sebbene SIGKILL sia definito nello stesso file di intestazione del segnale di SIGTERM, non può essere ignorato dal processo. In effetti, il processo non è nemmeno reso consapevole del segnale SIGKILL poiché il segnale va direttamente all'init kernel. A quel punto, init interromperà il processo. Il processo non ha mai l'opportunità di catturare il segnale e agire su di esso.

Tuttavia, il kernel potrebbe non essere in grado di terminare correttamente il processo in alcune situazioni. Se il processo è in attesa di I / O di rete o del disco, il kernel non sarà in grado di fermarlo. Neanche i processi di zombi catturati in un sonno ininterrotto possono essere fermati dal kernel. È necessario un riavvio per cancellare quei processi dal sistema.

Quando hai inviato killall (SIGTERM) ai processi thunderbird, hai richiesto l'arresto di tali processi. Alcuni di questi processi non funzionavano correttamente (probabilmente perché avevi bisogno di ucciderli in primo luogo), quindi non potevano agire sul segnale SIGTERM.


Qualche speculazione sul perché ha ucciso solo alcune delle istanze di tuoni?
Meer Borg,

@Doogfar Vedi il mio commento modificato (o la pagina che ho collegato)
tgm4883

Grazie, spiega anche perché il mio Thunderbird corrotto, uccidere -9 era troppo duro
Meer Borg

Ancora non funziona sempre.
Craig Hicks,

4

killallaccetta la maggior parte della stessa sintassi di kill. In particolare, non è necessario scrivere nulla di fantasia per killallfare l'equivalente di kill -9. Funziona bene:

killall -9 thunderbird

(Naturalmente, come discusso, di solito dovresti essere riluttante a usare killall -9o, equivalentemente killall -KILL, a meno che altre misure non siano già state provate senza successo.)


Non funziona sempre, quindi ci deve essere qualcos'altro.
Craig Hicks,
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.