Я работаю над сложным в вычислительном отношении кодом, который - на данный момент - часто выходит из строя, но я все еще работаю над ним :) Когда он выходит из строя, я не могу закрыть окно графического интерфейса; я должен открыть оболочку и завершить процесс -9.
Теперь это простая, но довольно механическая задача. Поэтому обычно я жду сбоя примерно 7-8 процессов, а затем kill -9 каждый из них.
Я хочу сделать это автоматически. Я думаю, что должно быть легко передать некоторые команды, чтобы получить идентификатор (n-1) результатов ps aux | grep 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.
Затем chmod u+x ~/killjava в терминале, чтобы вы могли выполнить файл.
Тогда вы можете просто позвонить ~/killjava из терминала, и ваш Java-процесс будет полностью остановлен. Возможно, вы захотите рассмотреть, на какие другие ресурсы повлияет ваше уничтожение процесса Java таким образом (например, подключения к базе данных). Например, возможно kill -15 было бы более уместно - см. Объяснение здесь.
Я создал это, так как мой модифицированный сервер 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