Как убить все процессы кроме конкретного

13

На моем локальном сервере запущено много процессов Java, и в то же время я использую Eclipse. Теперь, когда мне нужно перезапустить свои процессы (я запускаю процессы через скрипт оболочки), перед каждым запуском мне нужно убить старые процессы с помощью:

Метод 1: - kill -9 $Pid (для каждого процесса один за другим, что занимает много времени)

Способ 2: - killall -9 java(для всех процессов - легко, но Eclipse будет убит слишком без необходимости)

В случае метода 2 Eclipse также будет убит, чего я никогда не хочу. Есть ли выход из этого? Бьюсь об заклад, должно быть: P

Изменить: я использую Ubuntu 15.04.

Atiq
источник
вы используете openjdk?
Maythux
нет, это Java-7-оракул
Atiq
проверьте мой ответ
Maythux

Ответы:

17

Попробуйте эту команду:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

это будет искать все процессы, содержащие Java и выполнение затмения, а затем убить их

Maythux
источник
3
++ 1 для не используя -9без разбора. Вы должны когда-нибудь дать процессу возможность изящно выйти.
Rmano
pgrepлучше, чем ps | grepв противном случае вы рискуете убить сам оператор grep.
16
2
@abligh Проблема в том, что pgrepвы не можете различить, какие процессы выполняют затмение, потому что даже pgrep -lпросто сообщат java. @ Maythux, просто для справки, egrepустарел и не должен использоваться, поскольку grep -Eделает то же самое, хотя вам даже не нужно, grep -Eпоскольку вы соответствуете фиксированной строке; так просто grep -v "eclipse"(или если вы хотите быть модным [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos
@kos: непроверено:pkill '/java\(.*eclipse\)\@!'
до
@abligh Что \@!? Если это Perl-ism, то он не сработает, потому что pkillподдерживает только ERE, я попытался свести всю эту задачу к одной команде, уже используемой pkillс отрицательными взглядами, и по этой причине это не удалось.
Кос
12

С помощью awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

Команда убивает все javaпроцессы, но не процесс eclipse.

AB
источник
3
Более элегантно (и быстрее), чем ответ @maythux ИМХО ... ;-)
Фабби,
Я согласен с Фабби, приятно!
Кос
1

Как насчет :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'ищет javaв полной командной строке процессы и перечисляет их

  • grep -Po '^[^ ]+(?!.*eclipse)'ищет среди найденных процессов и получает идентификаторы процессов, которых нет eclipseв их полных командных строках

  • xargs kill убьет процессы.

heemayl
источник
+1 за короткое и элегантное решение. Обратите внимание, что было бы возможно иметь еще более эффективное (только одна команда :) pkillрешение, если бы оно pgrep/pkillподдерживало регулярные выражения perl, которые вы используете на 2-м шаге выше. К сожалению pgrep/ pkillподдерживает только расширенные регулярные выражения (как egrep/grep -E).
Ариэльф
@arielf Вы абсолютно правы ... это было бы наиболее эффективно, если бы pgrep/ pkillподдерживал PCRE ..
Heemayl
0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

Используйте jps, чтобы убедиться, что вы ищете только команды java, а не все команды, которые имеют путь java.

Четан Нарсуде
источник
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Анкур Кумар
источник
1
Было бы лучше объяснить команды, а не просто дать загадочную командную строку. Кроме того, как насчет моей продолжительной команды "orkjavagoob.sh"
вальтинатор