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.