Uccidi solo un processo Java


16

Di solito eseguo poche applicazioni Java, una per server in esecuzione localmente e l'altra per alcuni IDE come NetBeans. E di volta in volta, dopo molte ridistribuzioni, il mio server si blocca su OutOfMemoryException quindi devo riavviare il processo Java.

Quindi lo faccio, pkill -9 javama questo uccide anche il mio IDE in esecuzione che non voglio. Quindi, come posso uccidere solo le applicazioni collegate al server in esecuzione e non le altre? Presumo che tutte stiano funzionando con lo stesso processo, ma ci deve essere un modo per distinguerle.


2
guarda la tua tabella dei processi (tramite topo ps) e scegli quella giusta e uccidila per PID (uccidi -9 PID_number).
corsa il

Oh sì, posso vederlo ora. Quindi ho solo bisogno di terminare il processo con il diritto PID. Grazie mille
Petr Mensik,

Devo automatizzare questo. Come ottenere il PID per il programma specifico?
Nikhil VJ,

Risposte:


22

Per uccidere un processo associato a più processi, è necessario ucciderlo utilizzando l'ID processo associato a quel processo.

Per ottenere l'id processo di quel processo java eseguito

ps -A |grep java

l'output di questo comando fornirà l'elenco dei processi java in esecuzione sul sistema. Annotare l'ID processo (PID) di quel processo che si desidera eliminare ed eseguire

kill -9 PID

Se vuoi uccidere TUTTI i processi Java con un solo comandops ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi,

11

IMO la soluzione migliore è:

pkill -9 -f <nameOfYourJavaAplication>

Perfetto. Ero solito ps -fC javatrovare nameOfYourJavaAplication(in -Dprogram.name)
cactuschibre il

8

Invece di usare pse grep, puoi usare psil -Cflag di 'per selezionare tutti i comandi elencati con il nome' java '. È inoltre possibile utilizzare psil -fflag per stampare il nome completo del comando di ciascun processo elencato. In questo modo, puoi vedere cosa sta effettivamente facendo ogni processo Java. Ecco il comando per intero: ps -fC java.

È inoltre possibile utilizzare pgrepper elencare tutti i processi Java. pgrep -a javarestituirà il PID e la riga di comando completa di ciascun processo Java.

Una volta ottenuto il PID del comando che si desidera uccidere, utilizzare killcon la -9bandiera (SIGKILL) e il PID del processo java che si desidera uccidere. Java non si ferma sempre quando riceve un segnale 'SIGTERM' (i processi sono autorizzati a gestire 'SIGTERM'), quindi spesso è necessario inviarlo con il segnale 'SIGKILL', che fa inizializzare il programma senza avvertirlo.

Ad esempio, se ps -fC javaritorna

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

o psgrep -a javaritorna

9014 java IDE
11775 java TestProgram

e desideri uccidere java TestProgram, dovresti correre kill -9 11775.


1

Se vuoi che uno script trovi e uccida il tuo programma (specifico) in esecuzione usando un modello dalla riga di comando del programma (e non solo tutte le cose Java che hai eseguito), allora:

pgrep -f pattern # shows the PID
pkill -f pattern

Da /unix//a/31111/249209


Si noti che "pkill" è già stato menzionato nella risposta di Marek R del 13 febbraio 13
Jeff Schaller

0

jpse jcmdsono strumenti specializzati nella visualizzazione di sole informazioni sui processi Java e PID.

Puoi esplorare le loro opzioni per un output più dettagliato.


Questi si elencano solo sul mio computer.
Alexis Wilke,

Quindi, sei sicuro che ci siano altri processi Java in esecuzione ?!
Muhammad Gelbana,

Sì. Avevo Cassandra o Elassadra in esecuzione durante il test del tuo comando.
Alexis Wilke,

0

Ecco uno script che puoi usare per automatizzare il processo.

Sostituisci la <PROCESS_NAME>parte con qualunque cosa Java stia eseguendo.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Nota: non ho inserito il -9. Non dovrei essere richiesto a meno che non catturi segnali e SIGTERM(impostazione predefinita) fallisca. Vorrei anche suggerire di utilizzare il nome del segnale che semplifica la lettura:

kill -TERM ${process}

AVVERTIMENTO

Prima di eseguire kill ...assicurarsi che la $processvariabile venga impostata come previsto. Il ps -efdiverso può tra Unix in modo awkpotrebbe essere necessario per stampare un parametro diverso.

Nota

Il <PROCESS_NAME>potrebbe essere modificato in una variabile. Ricorda solo che se devi digitarlo ogni volta sulla tua riga di comando, è probabile che tu faccia degli errori di tanto in tanto. Trovo più facile avere più copie dello script con il nome corretto.

Anche importante: notare le virgolette singole per lo awkscript. Ciò significa che è necessario chiudere e riaprire la stringa con la variabile in mezzo. Qualcosa del genere dovrebbe funzionare (non testato):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
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.