Come posso terminare un processo per nome invece che per PID?


349

A volte, quando provo ad avviare Firefox, dice "è già in esecuzione un processo Firefox". Quindi devo fare questo:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

Quello che mi piacerebbe è un comando che farebbe tutto questo per me. Richiederebbe una stringa di input e grepper essa (o qualsiasi altra cosa) nell'elenco dei processi e ucciderebbe tutti i processi nell'output:

jeremy@jeremy-desktop:~$ killbyname firefox

Ho provato a farlo in PHP ma exec('ps aux')sembra mostrare solo i processi che sono stati eseguiti exec()nello script PHP stesso (quindi l'unico processo che mostra è se stesso.)


Quando visualizzo la finestra che dice che Firefox è già in esecuzione, di solito devo solo aspettare un secondo e posso eseguire di nuovo Firefox (ovviamente potrebbe non essere sempre così).
nuoritoveri,

1
Questo è il modo più sicuro come dice JohnB in questa risposta: stackoverflow.com/questions/6381229/...
tecnoshopbq


Questa è una vecchia domanda, ma potresti per favore cambiare la risposta accettata? Quello che hai segnato fallisce con molti processi, come quelli gestiti dalla JVM.
Luís de Sousa,

Per tutti coloro che fanno riferimento a questo argomento, nel commento sopra, Luis fa riferimento alla risposta in basso che propone il pkill -f "Process name"comando ...
Digger

Risposte:


505
pkill firefox

Ulteriori informazioni: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Usare pgrep per capire cosa stai uccidendo prima di aggirare i processi di uccisione è una buona cosa. Soprattutto quando si utilizza -f.
Akrikos,

pkill non è molto amichevole. non puoi dargli i nomi nello stesso modo in cui li prende killall.
Polpo,

2
pkill -U <username>è abbastanza utile. Ho un server web Solaris , il vero demone del server web, è configurato come un servizio con il proprio utente. Pertanto, specificare dall'utente è un modo semplice / facile per attivare un riavvio.
Raystorm,

6
Per forzare l'uccisione: pkill -9 firefox
Justas,

Funziona al massimo la metà delle volte. È necessaria almeno la -fbandiera per una soluzione omnibus.
Luís de Sousa,

112

Inoltre è possibile utilizzare:

pkill -f "Process name"

Per me, ha funzionato perfettamente. Era quello che stavo cercando. pkill non funziona con il nome senza la bandiera.

Quando -fè impostato, l'intera riga di comando viene utilizzata per la corrispondenza dei motivi.


2
appositamente per eseguire qualcosa con il vino l' -fopzione è davvero necessaria. ad es.pkill -f "EvilWindowsServer.exe"
CodeBrauer

Questa dovrebbe essere la risposta accettata. La prima risposta fallisce con molti tipi di programmi, ad esempio quelli in esecuzione su una JVM.
Luís de Sousa,

1
Ho dovuto aggiungere anche la -fbandiera per aver ucciso un processo in background che eseguiva uno script Python.
Mason

nel mio caso, avevo bisogno di 2 bandiere:pkill -f -9 PROCESSNAME
Slavik,

opera in centos7.thank
sirmagid,

64

Puoi uccidere i processi per nome conkillall <name>

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.

I segnali possono essere specificati per nome (es. -HUP o -SIGHUP ) o per numero (es. -1 ) o per opzione -s .

Se il nome del comando non è un'espressione regolare (opzione -r ) e contiene una barra (/), i processi che eseguono quel determinato file verranno selezionati per l'uccisione, indipendentemente dal loro nome.

Ma se non vedi il processo con ps aux, probabilmente non avrai il diritto di ucciderlo ...


6
Per forzare la chiusura di un programma che non risponde, inviare KILL anziché TERM:killall -s KILL firefox
Martin Hansen,

45

Un'alternativa un po 'più lunga:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
questo funziona sotto busybox per i tuoi dispositivi embedded :)
nwgat

25

Il modo più semplice per fare è verificare innanzitutto che si ottengano gli ID processo corretti con:

pgrep -f [part_of_a_command]

Se il risultato è come previsto. Vai con:

pkill -f [part_of_a_command]

19

Strano, ma non ho visto la soluzione in questo modo:

kill -9 `pidof firefox`

può anche uccidere più processi (più pid) come:

kill -9 `pgrep firefox`

Preferisco pidofpoiché ha un output a riga singola:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Quando eseguo questo, ho ricevuto l'errore kill: invalid number 'pidof myprogram'. Cosa c'è di male qui?
Brethlosze,

questo mi ha appena salvato la vita oggi ... Non voglio scrivere altro ma sono contento di averlo trovato qui. grazie uomo.
MilMike,

1
Arrivando in ritardo, ma nel caso qualcun altro si chieda ... @Brethlosze, metti singoli tick, mentre il comando richiede backtick.
extra

Grazie! ..
Sarò

13

Uccidi tutti i processi che hanno snippetnel percorso di avvio. Puoi uccidere tutte le app avviate da una directory inserendo / directory / come snippet. Questo è abbastanza utile quando avvii più componenti per la stessa applicazione dalla stessa directory dell'app.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Preferirei pgrep se disponibile


1
Questa è una combinazione frequente di antipattern. Usa una regex che non corrisponde a se stessa (o al nome dello script contenente) ed evita un inutilegrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
Tripleee,

1
evitando inutili grep non stai evitando errori di battitura e la possibilità di usare il comando in processi automatizzati che parametrizzano il <snippet>
Mike

Questo è davvero il modo migliore per farlo!
Abhinandan Dubey,

Sarebbe bello capire perché le [s]opere di @ tripleee in termini di non corrispondenza con il processo awk stesso?
andig

Perché la regex [x]ycorrisponde alla stringa xyma non viceversa. Questa è una FAQ comune. Il collegamento è a una pagina di oltre 20 anni fa che spiega questo in modo più dettagliato; e questa era una domanda ricorrente già allora.
tripla

11

Su Mac non riuscivo a trovare pgrep e pkill e nemmeno killall funzionava, quindi ho scritto un semplice script da una riga:

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Se esiste un modo più semplice per farlo, ti preghiamo di condividere.


1
Lol. Questo è un comando folle per tale compito. Non importa. Hai chiamato quella semplice linea singola? : D Simple is killall
m3nda

@ erm3nda :-) Accetto. Guardando indietro sembra folle. Non riesco a ricordare perché allora killall non funzionasse sul mio Mac.
Dhiraj,

Ciò è molto utile quando si desidera interrompere un determinato processo Java come "jboss". In tal caso, killall non aiuta.
Jan M


6

Per uccidere con grep:

kill -9 `pgrep myprocess`

5

più corretto sarebbe:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
Perché exportuna variabile che userai solo una volta nello stesso processo?
triplo il


3

Mi ponevo la stessa domanda, ma il problema con le risposte attuali è che non controllano in modo sicuro i processi da uccidere, quindi ... potrebbe portare a terribili errori:) ... specialmente se diversi processi corrispondono allo schema .

Come disclaimer, non sono un professionista e c'è sicuramente spazio per miglioramenti.

Quindi ho scritto un piccolo script sh:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

Se esegui GNOME, puoi usare il monitor di sistema (Sistema-> Amministrazione-> Monitor di sistema) per terminare i processi come faresti con Windows. KDE avrà qualcosa di simile.


2

Il killcomando predefinito accetta i nomi dei comandi in alternativa al PID. Vedi kill (1) . Un problema che si verifica spesso è che bashfornisce il proprio killche accetta numeri di lavoro, come kill %1, ma non nomi di comandi. Ciò ostacola il comando predefinito. Se la prima funzionalità ti è più utile della seconda, puoi disattivare la bashversione chiamando

enable -n kill

Per maggiori informazioni vedi kille enablevoci in bash (1) .


Come ho riattivato l'azione di enable -n kill?
Brethlosze,

1
@hyprfrcbenable kill
The Vee,



0

awk oneliner, che analizza l'intestazione psdell'output, quindi non è necessario preoccuparsi dei numeri di colonna (ma dei nomi di colonna). Supporta regex. Ad esempio, per uccidere tutti i processi, il cui nome eseguibile (senza percorso) contiene la parola "firefox" provare

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
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.