Убить только один процесс Java

17

Я обычно запускаю несколько приложений Java, одно для локального сервера, а другое для какой-то IDE, такой как NetBeans. И время от времени, после многих перераспределений, мой сервер зависает в OutOfMemoryException, поэтому мне нужно завершить процесс Java для перезагрузки.

Так и есть, pkill -9 javaно это также убивает мою работающую IDE, чего я не хочу. Итак, как мне убить только приложение, связанное с запущенным сервером, а не с другими? Я предполагаю, что все они работают под одним и тем же процессом, но должен быть какой-то способ их отвлечь.

Петр Менсик
источник
2
посмотрите на таблицу процессов (через topили ps), выберите правильную и уничтожьте ее с помощью PID (kill -9 PID_number).
Раш
О да, теперь я это вижу. Так что мне просто нужно убить процесс с правами PID. Большое спасибо
Петр Менсик
Мне нужно автоматизировать это. Как получить PID для конкретной программы?
Nikhil VJ

Ответы:

23

Чтобы убить процесс, связанный с несколькими процессами, вам нужно убить его, используя идентификатор процесса, связанный с этим процессом.

Чтобы получить идентификатор процесса запуска Java-процесса

ps -A |grep java

вывод этой команды выдаст список Java-процессов, запущенных в вашей системе. Запишите ID процесса (PID) того процесса, который вы хотите убить и запустить

kill -9 PID
P4cK3tHuNt3R
источник
Если вы хотите уничтожить ВСЕ Java-процессы одной командойps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Андрей Караиванский
11

ИМО лучшее решение это:

pkill -9 -f <nameOfYourJavaAplication>
Марек Р
источник
Отлично. Я имел обыкновение ps -fC javaнаходить nameOfYourJavaAplication-Dprogram.name)
cactuschibre
8

Вместо того чтобы использовать psи grep, вы можете использовать ps«s -Cфлаг , чтобы выбрать все команды , перечисленные с именем„Java“. Вы также можете использовать ps«s -fфлаг , чтобы напечатать полное имя команды каждый из перечисленного процесса. Таким образом, вы можете увидеть, что на самом деле делает каждый Java-процесс. Вот команда в полном объеме: ps -fC java.

Вы также можете использовать, pgrepчтобы перечислить все процессы Java. pgrep -a javaвернет PID и полную командную строку каждого процесса Java.

Когда у вас есть PID команды, которую вы хотите убить, используйте killс -9флагом (SIGKILL) и PID процесса Java, который вы хотите убить. Java не всегда останавливается, когда получает сигнал 'SIGTERM' (процессам разрешено обрабатывать 'SIGTERM'), поэтому отправка ему сигнала 'SIGKILL', который заставляет init завершить работу программы без предварительного предупреждения, часто необходима.

Например, если ps -fC javaвозвращает

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

или psgrep -a javaвозвращается

9014 java IDE
11775 java TestProgram

и ты хочешь убить java TestProgram, ты должен бежать kill -9 11775.


источник
1

Если вы хотите, чтобы скрипт обнаруживал и убивал вашу (определенную) работающую программу, используя шаблон из командной строки программы (а не только все, что вы запускали в Java), то:

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

С /unix//a/31111/249209

Нихил В.Ю.
источник
Обратите внимание, что «pkill» уже упоминалось в ответе Марека Р. от ​​13 февраля 13 года
Джефф Шаллер
0

jpsи jcmdинструменты, специализирующиеся на отображении только информации о процессах Java и PID.

Вы можете изучить их варианты для более подробного вывода.

Мухаммед Гелбана
источник
Те только перечисляют себя на моем компьютере.
Алексис Уилке
Тогда вы уверены, что запущены другие процессы Java?
Мухаммед Гелбана
Да. У меня работали Кассандра или Элассадра, когда я проверял вашу команду.
Алексис Уилке
0

Вот скрипт, который можно использовать для автоматизации процесса.

Замените <PROCESS_NAME>часть тем, что выполняет Java.

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

Примечание: я не ставил -9. Я не должен требовать, если вы не захватываете сигналы и SIGTERM(по умолчанию) не удается. Я бы также предложил вам использовать имя сигнала, чтобы его было легче читать:

kill -TERM ${process}

ПРЕДУПРЕЖДЕНИЕ

Перед выполнением kill ...убедитесь, что $processпеременная установлена ​​так, как ожидалось. ps -efМожет , различались юниксы так , awkвозможно , потребуется напечатать другой параметр.

Заметка

<PROCESS_NAME>Может быть изменено в переменную. Просто помните, что если вам придется каждый раз вводить его в командной строке, вы, вероятно, время от времени допускаете ошибки. Мне проще иметь несколько копий сценария с правильным именем.

Также важно: обратите внимание на одинарные кавычки для awkсценария. Это означает, что вам нужно закрыть и снова открыть строку с переменной между ними. Примерно так должно работать (не проверено):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Алексис Уилке
источник