Trovare l'ID di un processo e ucciderlo


16

Quando mai ho bisogno di uccidere un processo in background che faccio ps -e | grep <process_name>

Che stampa qualcosa del genere 1766 ? 00:00:13 conky, quindi uso l'ID del processo in killquesto modo kill 1766.

C'è un modo per semplificarlo? Renderlo più veloce? ridurre la quantità di battitura?


1
Ho ottenuto la risposta che desidero, ma aspetterò un po 'prima di accettare, in modo che la community possa beneficiare delle varie opzioni disponibili.
Gautam,

Sentiti libero di rendere questa domanda più generica, se possibile, in modo che più persone possano beneficiare delle risposte
Gautam,

Risposte:


18

(TL, DR: pgrep, pkill)

Molte varianti unix vengono fornite con pgrepe il suo compagno pkill: Solaris , Linux (parte delle utility di processo standard , potrebbe essere assente dai sistemi Linux incorporati), FreeBSD , OpenBSD , NetBSD , ... ma solo da MacPorts su OS X , non AIX , e solo recentemente in HP-UX . L' pgreputilità mostra l'ID processo dei processi abbinati per nome, utente e alcuni altri criteri. L'argomento a pgrepviene interpretato come una regexp che deve corrispondere a parte del nome dell'eseguibile del processo (a meno che non si passi un'opzione per cambiarlo). Se chiami pkillinvece dipgrep, l'utilità invia un segnale invece di visualizzare gli ID di processo.

Un'altra utilità simile è pidof . Su Linux , è fornito da SysVinit o BusyBox (quindi lo troverai spesso su un sistema Linux incorporato che non ha pgrep); ci sono anche porte su altre varianti unix. L' pidofutilità ha meno opzioni, per lo più corrisponde solo a nomi di file eseguibili interi. La sua utility complementare killallinvia un segnale ai programmi corrispondenti¹.

¹ Attenzione che killallha un significato diverso su Solaris e possibilmente su altre varianti unix; non digitare killallcome root su Solaris.


Caspita la tua risposta è molto dettagliata, molto più approfondita, grazie. Modifica la domanda in modo che corrisponda alla risposta, se possibile.
Gautam,

@GautamK Non credo che la domanda debba essere ampliata. Se lo fai, sentiti libero di modificarlo da solo.
Gilles 'SO- smetti di essere malvagio' il

Delle risposte con il maggior numero di voti La tua risposta fornisce maggiori dettagli, quindi la accetto
Gautam

8
  • killall ProcessName (c'è uno svantaggio con questo comando in quanto non si conosce sempre il nome del processo di un programma).
  • pidof ProccessName e kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Prova questa linea e riutilizzala nella storia della tua bash, o meglio crea un alias per essa.

Il secondo pidofsembra un po 'più semplice, ma richiede comunque 2 passaggi
Gautam,

Posso cercare / creare un comando a una riga che lo faccia in un unico passaggio (con un nome di processo approssimativo) ma che richiederebbe di digitare una riga lunga (che è più difficile dei due passaggi precedenti), oppure è possibile digitare una volta e riutilizzarlo dalla storia.
Hanan N.

@GautamK Ho aggiornato la risposta con l'opzione di comando singolo.
Hanan N.

6

Mentre Hanan ha dei buoni suggerimenti, aggiungerò pgrep/ pkill. Consentono un controllo molto più preciso su quale processo trovi ed espressioni regolari se non conosci il processo preciso che dovrai uccidere.

PS Hanan pidofpuò essere alimentato killdirettamente con i backtick:

kill `pidof processname`

pkillera esattamente quello che cercavo, la maggior parte delle volte conosco il nome del processo, principalmente il suo conkyo firefoxo chromeo qualcosa del genere. Grazie
Gautam il

1

Cosa ne pensi di questo -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Esempio:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Aggiornare:

Siamo spiacenti, questo ovviamente non soddisfa il requisito della tipizzazione meno un buon modo per farlo sarebbe quello di aggiungere una functional vostro .bashrc, .profileo qualsiasi altra cosa lo script di avvio. La funzione può essere qualcosa del genere:

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Una volta aggiunto, puoi semplicemente passare il nome del processo:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
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.