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

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

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

nkint@zefiro:~$ ps aux | grep javankint   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 somethingnkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto javankint@zefiro:~$ kill -9 2705

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

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

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

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

killall -9 java

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

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

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.

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

#! /bin/bash# Kill Java process# Determine the pidPID=`ps -C java -o pid=`kill -9 $PID

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

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

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

Это использует jps чтобы идентифицировать процесс java.

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

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

Я создал это, так как мой модифицированный сервер minecraft иногда выходит из строя, а java зависает и не закрывается, мне это надоело, и я написал сценарий sh, который определит, запущена ли java, и попытается убить их всех. Вот код, если кто-то этого хочет.

#!/bin/shecho "-----------------------------------"echo "Checking to see if \e[96mJava\e[0m is \e[32mrunning!\e[0m" echo "-----------------------------------"sleep 3if pgrep -x "java" > /dev/nullthen    echo "-----------------------------------"    echo "\e[96mJava\e[0m is \e[32mrunning:\e[0m Attempting To Kill"    echo "-----------------------------------"    sleep 2    killall SGKILL javaelse    echo "------------------------------------"    echo "\e[96mJava\e[0m Detection \e[91mFailed:\e[0m Ending Script"    echo "------------------------------------"    sleep 1    exitfisleep 1if pgrep -x "java" > /dev/nullthen    echo "-----------------------------------------"    echo "Could not kill \e[96mJava\e[0m, Are you a \e[31mSudo User?\e[0m"    echo "-----------------------------------------"    sleep 2else    echo "------------------------------"    echo "\e[96mJava\e[0m was killed \e[32mSuccsessfully!\e[0m"    echo "------------------------------"    exitfi#Created By Nocturnal_Toker