Я обычно запускаю несколько приложений Java, одно для локального сервера, а другое для какой-то IDE, такой как NetBeans. И время от времени, после многих перераспределений, мой сервер зависает в OutOfMemoryException, поэтому мне нужно завершить процесс Java для перезагрузки.
Так и есть, pkill -9 java
но это также убивает мою работающую IDE, чего я не хочу. Итак, как мне убить только приложение, связанное с запущенным сервером, а не с другими? Я предполагаю, что все они работают под одним и тем же процессом, но должен быть какой-то способ их отвлечь.
top
илиps
), выберите правильную и уничтожьте ее с помощью PID (kill -9 PID_number).PID
. Большое спасибоОтветы:
Чтобы убить процесс, связанный с несколькими процессами, вам нужно убить его, используя идентификатор процесса, связанный с этим процессом.
Чтобы получить идентификатор процесса запуска Java-процесса
вывод этой команды выдаст список Java-процессов, запущенных в вашей системе. Запишите ID процесса (PID) того процесса, который вы хотите убить и запустить
источник
ps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
ИМО лучшее решение это:
источник
ps -fC java
находитьnameOfYourJavaAplication
(в-Dprogram.name
)Вместо того чтобы использовать
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
возвращаетили
psgrep -a java
возвращаетсяи ты хочешь убить
java TestProgram
, ты должен бежатьkill -9 11775
.источник
Если вы хотите, чтобы скрипт обнаруживал и убивал вашу (определенную) работающую программу, используя шаблон из командной строки программы (а не только все, что вы запускали в Java), то:
С /unix//a/31111/249209
источник
jps
иjcmd
инструменты, специализирующиеся на отображении только информации о процессах Java и PID.Вы можете изучить их варианты для более подробного вывода.
источник
Вот скрипт, который можно использовать для автоматизации процесса.
Замените
<PROCESS_NAME>
часть тем, что выполняет Java.Примечание: я не ставил
-9
. Я не должен требовать, если вы не захватываете сигналы иSIGTERM
(по умолчанию) не удается. Я бы также предложил вам использовать имя сигнала, чтобы его было легче читать:ПРЕДУПРЕЖДЕНИЕ
Перед выполнением
kill ...
убедитесь, что$process
переменная установлена так, как ожидалось.ps -ef
Может , различались юниксы так ,awk
возможно , потребуется напечатать другой параметр.Заметка
<PROCESS_NAME>
Может быть изменено в переменную. Просто помните, что если вам придется каждый раз вводить его в командной строке, вы, вероятно, время от времени допускаете ошибки. Мне проще иметь несколько копий сценария с правильным именем.Также важно: обратите внимание на одинарные кавычки для
awk
сценария. Это означает, что вам нужно закрыть и снова открыть строку с переменной между ними. Примерно так должно работать (не проверено):источник