Я работаю над вычислительно тяжелым кодом, который - пока - много сбоев, но я все еще работаю над ним :) Когда он падает, я не могу закрыть окно 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
и убить его, но я понятия не имею, с чего начать.
Кто-нибудь может дать мне какие-нибудь подсказки?
Еще несколько трубок доставят вас туда, куда вы хотите. Вот как я это сделаю:
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.
Если вы хотите уничтожить все процессы с именем java
, вы можете использовать следующую команду:
killall -9 java
blockquote>Эта команда отправляет сигналы процессы, идентифицированные по их названию.
Откройте текстовый редактор и сохраните этот короткий скрипт 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
будет более уместным - см. Объяснение здесь .
Вот альтернативный подход, основанный на предыдущем ответе @ Дина.
Используется jps для идентификации процесса Java.
kill $(jps | grep <MainClass> | awk '{print $1}')
MainClass - это класс в вашей работающей Java-программе, который содержит метод main.