Убить процессы Java

25

Я работаю над вычислительно тяжелым кодом, который - пока - много сбоев, но я все еще работаю над ним :) Когда он падает, я не могу закрыть окно GUI; Я должен открыть оболочку и убить -9 процесс.

Это процесс Java, и его легко найти:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

Теперь это простая, но довольно механическая задача. Поэтому обычно я жду около 7-8 процессов, чтобы завершиться сбоем, а затем kill -9каждый из них.

Я хочу сделать это автоматически. Я думаю, что должно быть легко передать некоторые команды, чтобы получить идентификатор (n-1) результатов ps aux | grep javaи убить его, но я понятия не имею, с чего начать.

Кто-нибудь может дать мне какие-нибудь советы?

nkint
источник

Ответы:

22

Еще несколько трубок доставят вас туда, куда вы хотите. Вот как я это сделаю:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

Вот что происходит:

grep -v 'grep' исключает процесс grep из результатов.

awk '{print $2}' печатает только 2-й столбец вывода (в данном случае PID)

$(...)это подстановка команды. В основном результат от внутренней команды будет использоваться в качестве аргументаkill

Это имеет преимущество более точного контроля над тем, что убито. Например, если вы находитесь в общей системе, вы можете изменить условия поиска, чтобы она пыталась уничтожить только ваши собственные процессы Java.

декан
источник
49

Если вы хотите убить все процессы, которые названы, javaвы можете использовать следующую команду:

killall -9 Java

Эта команда отправляет сигналы процессам, идентифицированным по их имени.

Милан Тодорович
источник
killall javaне работал для меня по какой-то случайной причине, которую я не смог решить. -9Параметр позаботилась об этом. Спасибо.
Пол Нельсон Бейкер
5
9 SIGKILL. Программа не может игнорировать это, и в основном говорит: прекратить себя сейчас.
Милан Тодорович
Пользователи IntelliJ могут обнаружить, что их IDE не работает, не говоря уже о Tomcat и многих других приложениях. Это грубый метод, который не рекомендуется использовать в любой системе, в которой используются сервисы или приложения для повышения производительности java.
tresf
3

Откройте текстовый редактор и сохраните этот короткий сценарий bash в своем домашнем каталоге как killjava.

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

Затем chmod u+x ~/killjavaв терминале, чтобы вы могли выполнить файл.

Тогда вы можете просто позвонить ~/killjavaиз терминала, и ваш Java-процесс будет мертвым. Вы можете подумать, на какие другие ресурсы это повлияет ваше уничтожение Java-процесса (например, на соединения с базой данных). Например, возможно, kill -15было бы более уместным - см. Объяснение здесь .

Клайв ван Хильтен
источник
2

Вот альтернативный подход, основанный на предыдущем ответе @ Дина.

Это использует jps для идентификации процесса Java.

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass - это класс в вашей запущенной Java-программе, который содержит метод main.

Паван
источник