Come uccidere tutti i processi tranne uno specifico


13

Sul mio server locale sono in esecuzione molti processi Java e allo stesso tempo utilizzo Eclipse. Ora, quando ho bisogno di riavviare i miei processi (avvio processi attraverso uno script di shell), prima di ogni avvio ho bisogno di uccidere i vecchi processi attraverso:

Metodo 1: - kill -9 $Pid (per ogni processo uno per uno, che richiede tempo)

Metodo 2: - killall -9 java(per tutti i processi - facile, ma Eclipse verrà ucciso troppo inutilmente)

Nel caso del Metodo 2 anche Eclipse verrà ucciso, cosa che non voglio mai. C'è un modo per uscirne? Scommetto che ci devono essere: P

Modifica: sto usando Ubuntu 15.04.


stai usando openjdk?
Maythux,

no è java-7-oracle
Atiq

controlla la mia risposta
Maythux,

Risposte:


17

Prova a questo comando:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

questo cercherà tutti i processi che contengono Java ed eseguendo l'eclissi, quindi li ucciderà


3
++ 1 per non usare -9indiscriminatamente. Dovresti mai dare a un processo la possibilità di uscire con garbo.
Rmano,

pgrepè meglio di ps | grepcome altrimenti rischi di uccidere la dichiarazione grep stessa.
circa

2
@abligh Il problema è pgrepche non sei in grado di distinguere quali processi eseguono l'eclissi, perché anche pgrep -lsolo riferiranno java. @ Maythux, solo per riferimento, egrepè deprecato e non dovrebbe essere usato, poiché grep -Efa esattamente lo stesso, anche se non è nemmeno necessario grep -Epoiché stai abbinando una stringa fissa; quindi solo grep -v "eclipse"(o se vuoi essere sofisticato [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos,

@kos: non testato:pkill '/java\(.*eclipse\)\@!'
circa il

@abligh Che cos'è \@!? Se questo è un pkillperlismo non funzionerà, perché supporta solo ERE, ho cercato di ridurre l'intera attività a un singolo comando già utilizzato pkillcon lookahead negativi e che non è riuscito per questo motivo.
kos,

12

utilizzando awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

Il comando uccide tutti i javaprocessi, ma non il processo eclipse.


3
Più elegante (e più veloce) della risposta di @maythux IMHO ... ;-)
Fabby

Sono d'accordo con Fabby, bello!
kos,

1

Che ne dite di :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'cerca javanella riga di comando completa dei processi e li elenca

  • grep -Po '^[^ ]+(?!.*eclipse)'cerca tra i processi cercati e ottiene gli ID dei processi che non hanno eclipsenelle loro linee di comando complete

  • xargs kill ucciderà i processi.


+1 per una soluzione breve ed elegante. Si noti che sarebbe stato possibile avere una soluzione ancora più efficiente (solo un comando :) pkillse pgrep/pkillsupportato perl regex's che si utilizza nel 2 ° passaggio sopra. Sfortunatamente pgrep/ pkillsupporta solo regexps estesi (come egrep/grep -E).
Ari

@arielf Hai perfettamente ragione.. sarebbe stato molto più efficace se pgrep/ pkillsupporta PCRE ..
heemayl

0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

Usa jps per assicurarti di cercare solo i comandi java e non tutti i comandi che hanno java nel loro percorso.


0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

1
Sarebbe stato più bello spiegare i comandi, piuttosto che dare una stringa di comando criptica. Inoltre, per quanto riguarda il mio comando di lunga data "orkjavagoob.sh"
waltinator,
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.