Qual è la differenza tra "killall" e "pkill"?

88

Dopo aver usato solo kill <some_pid> sui sistemi Unix per molti anni, ho imparato pkill da un giovane collaboratore 1 più giovane di Linux .

Presto ho accettato Linux-way, pgrep -ing e pkill -ing per molti giorni e notti, attraverso rallentamenti e condizioni di gara. Tutto andava bene.

Ma ora non vedo altro che killall . How-to sembra menzionare solo killall , e non sono sicuro che si tratti di una sorta di sviluppo parallelo, o se killall è un successore di pkill o qualcos'altro.

Sembra funzionare come pkill più mirato, ma sono sicuro che mi manchi qualcosa.

Può una persona con Ubuntu / Debian 2 spiegare quando (o perché) killall dovrebbe essere usato, specialmente se dovrebbe essere usato preferibilmente a pkill (quando pkill spesso sembra più facile, perché posso essere più scontroso con la corrispondenza dei nomi, almeno per impostazione predefinita).

Quando parli di killall , non sto pensando al comando che su alcuni sistemi Unix (Solaris, AIX,?) ucciderebbe tutti i processi dell'utente. Ecco una descrizione di quella versione, da una manpage per IBM AIX :

  

Il comando killall annulla tutto   processi che hai iniziato, tranne   quelli che producono il processo del killall.   Questo comando fornisce un comodo   mezzi per cancellare tutti i processi   creato dalla shell che controlli.   Quando viene avviato da un utente root, il   il comando killall annulla tutto   processi cancellabili eccetto quelli   processi che l'hanno avviato. Se diversi   I segnali sono specificati, solo l'ultimo   uno è efficace.

1 "collega" è un aggiornamento gratuito da "collaboratore", così potrebbe pure.
2 Inizialmente pensavo che fosse una cosa Linux o Debian , ma alcune fonti stanno dicendo che Linux killall è derivato da Unix con sapore BSD.

    
posta belacqua 22.02.2011 - 08:31

4 risposte

64

Penso che tu possa vedere killall in how-to, perché di default richiede il nome preciso del processo, mentre pkill fa corrispondenze di pattern di base. Pertanto, killall è più sicuro per gli utenti di copiare e incollare ciecamente.

Pkill e killall hanno entrambi opzioni di distinzione. Killall ha una bandiera che corrisponde per età di processo, pkill ha una bandiera per uccidere solo i processi su una data tty. Etcetera fino alla nausea. Nessuno dei due è migliore , hanno solo specialità diverse.

Vedo dalle loro pagine man che killall proviene dal pacchetto psmisc , che ha diverse utility per la gestione dei processi, ma in particolare non contenere ps . È il pacchetto procps che ha ps, top, kill e pkill (tra gli altri). Avrei scommesso che Procps in origine non aveva pkill, quindi psmisc ha graffiato un prurito e ha inventato killall.

La pagina man di pkill / pgrep dice che sono stati introdotti in Solaris 7. Come dici, jgbelacqua , il killall di Solaris non era quello fornito da psmisc, quindi Solaris aveva probabilmente solo il pacchetto procps. Qualcuno voleva uno strumento per la ricerca di pattern matching, quindi pkill e pgrep. Che sia stato sviluppato dal procps dev o aggiunto in seguito, non lo so. Indipendentemente da ciò, è entrato e diventato parte dei * nix ovunque.

Altre fonti:

risposta data djeikyb 22.02.2011 - 09:06
7

Fai attenzione con "killall". Su alcuni sistemi (non ricordo quale), killall uccide tutti i processi tutti . Ignora silenziosamente gli argomenti e interrompe completamente il sistema.

    
risposta data phessler 30.07.2012 - 10:26
3

se attivi / etc / bash_completion, dopo killall <part_of_process_name> e premi tab - auto completa il nome del processo dall'elenco dei processi in esecuzione

    
risposta data jet 22.02.2011 - 13:28
2

Se osservi le opzioni su entrambi i programmi, vedrai che entrambi fanno la stessa cosa, ma in modi diversi.

pkill eseguirà la corrispondenza su vari attributi di un processo (CMD, PID, PPID, UID ...) e invierà il segnale specificato a ogni processo che corrisponde. (Per CMD, viene usata un'espressione regolare, per altri è una stringa). pkill non è interattivo, ma migliore per i programmi batch.

killall eseguirà la corrispondenza sul nome del processo (comm) o utente (utente), non sull'intera stringa di comando. L'argomento è usato come una stringa semplice e deve corrispondere all'intero valore "comm" (c'è anche un'opzione --regexp per cambiarlo). killall ha --interactive e --younger-than delle opzioni, che pkill non ha.

C'è anche un killall5 di SysV days ed è stato portato su altre varianti UNIX (apparentemente sotto il pacchetto di Ubuntu 'sysutils'). Questo si comporta in modo diverso alla vecchia maniera. Questo è stato spesso utilizzato internamente agli script di init per arrestare o passare alla modalità utente singolo.

    
risposta data Arcege 22.02.2011 - 14:24

Leggi altre domande sui tag