Як вбити всі процеси, крім конкретних


13

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

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

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

У випадку 2-го методу також буде вбито затемнення, чого я ніколи не хочу. Чи є вихід з цього? Б'юсь об заклад, що повинно бути: P

Редагувати: я використовую ubuntu 15.04.


ви використовуєте openjdk?
Maythux

ні, це java-7-oracle
Atiq

перевіри мою відповідь
Maythux

Відповіді:


17

Спробуйте скористатися цією командою:

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

це дозволить шукати всі процеси, що містять Java, і виключаючи затемнення, а потім вбивати їх


3
++ 1 для НЕ використовуючи -9без розбору. Ви коли-небудь повинні дати процесу вийти граціозно.
Рмано

pgrepкраще, ніж ps | grepяк інакше, ви ризикуєте вбити саму заяву.
abligh

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

@abligh Що \@!? Якщо це Perl-ism, це не спрацює, оскільки pkillпідтримує лише ERE, я намагався звести це завдання до однієї команди, яка вже використовується pkillз негативними lookaheads, і це не вдалося з цієї причини.
кос

12

Використання awk

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

Команда вбиває всі javaпроцеси, але не процес eclipse.


3
Більш елегантний (і швидший), ніж відповідь від @maythux IMHO ... ;-)
Fabby

Я згоден з Фабі, приємно!
кос

1

Як щодо :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'здійснює пошук javaу повному командному рядку процесів та списку їх

  • grep -Po '^[^ ]+(?!.*eclipse)'шукає серед пошукових процесів і отримує ідентифікатори процесів, які не містять eclipseу своїх повних командних рядках

  • xargs kill вб'є процеси.


+1 для короткого та елегантного рішення. Зауважте, що було б можливо мати ще більш ефективне (лише одна команда :) pkillрішення, якби pgrep/pkillпідтримувались perge regex'es, які ви використовуєте на другому кроці вище. На жаль 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"
waltinator
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.