Вбийте лише один процес Java


17

Зазвичай я запускаю кілька додатків Java, один для локального сервера, а інший для деяких IDE, таких як NetBeans. І час від часу, після багатьох перестановок, мій сервер застряг на OutOfMemoryException, тому мені потрібно вбити процес Java, щоб перезавантажити.

Так я це роблю, pkill -9 javaале це також вбиває мій запуск IDE, якого я не хочу. Тож як я вбиваю лише додаток, пов’язаний із запущеним сервером, а не інші? Я припускаю, що всі вони працюють під одним процесом, але повинен бути спосіб їх перешкодити.


2
подивіться на таблицю процесів (через topабо ps) і виберіть потрібну та вбийте її за допомогою PID (вбийте -9 PID_кілька).
пік

О так, я зараз це бачу. Тому мені просто потрібно вбити процес з правом PID. Велике спасибі
Петро Менсик

Мені потрібно це автоматизувати. Як отримати PID для конкретної програми?
Nikhil VJ

Відповіді:


24

Для вбивства процесу, пов'язаного з декількома процесами, вам потрібно вбити це за допомогою ідентифікатора процесу, пов'язаного з цим процесом.

Щоб отримати ідентифікатор процесу цього Java-процесу

ps -A |grep java

Вихід з цієї команди дасть перелік java-процесів, що працюють у вашій системі. Запишіть ідентифікатор процесу (PID) того процесу, якого ви хочете вбити та запустити

kill -9 PID

Якщо ви хочете вбити ВСІ Java процеси однією командоюps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Андрій Караїванський


8

Замість використання psі grep, ви можете використовувати прапор ps', -Cщоб вибрати всі команди, перелічені з назвою' java '. Ви також можете використовувати прапор ps'', -fщоб надрукувати повне ім'я команди кожного перерахованого процесу. Таким чином, ви можете побачити, що насправді робить кожен процес Java. Ось команда в повному обсязі: ps -fC java.

Ви також можете використати pgrepдля переліку всіх процесів Java. pgrep -a javaповерне PID та повний командний рядок кожного Java-процесу.

Після того як ви PID команди ви хочете вбити, використовувати killз -9(SIGKILL) прапор і PID процесу Java ви хочете , щоб вбити. Java не завжди зупиняється, коли отримує сигнал "SIGTERM" (процесам дозволено обробляти "SIGTERM"), тому надсилання їй сигналу "SIGKILL", який змушує init вбивати програму, не попереджуючи її, часто необхідна.

Наприклад, якщо ps -fC javaповертається

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

або psgrep -a javaповертається

9014 java IDE
11775 java TestProgram

і ти хочеш вбити java TestProgram, ти повинен бігти kill -9 11775.


1

Якщо ви хочете, щоб сценарій знаходив і вбивав вашу (конкретну) запущену програму за допомогою шаблону з командного рядка програми (а не лише кожної речі Java, яку ви запустили), тоді:

pgrep -f pattern # shows the PID
pkill -f pattern

З /unix//a/31111/249209


Зауважте, що про "pkill" вже згадувалося у відповіді Марека Р від 13
Джефф Шаллер

0

jpsі jcmdє інструментами, спеціалізованими для відображення лише інформації про процеси Java та PID.

Ви можете вивчити їх параметри для більш детального виводу.


Ті лише перераховують себе на моєму комп’ютері.
Алексіс Вілке

Тоді ви впевнені, що працюють інші Java-процеси ?!
Мухаммед Гельбана

Так. У мене під час тестування вашої команди працювали Кассандра чи Еласдра.
Алексіс Вілке

0

Ось сценарій, який можна використовувати для автоматизації процесу.

Замініть <PROCESS_NAME>деталь тим, що виконується Java.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Примітка: я не поставив -9. Мені не слід вимагати, якщо ви не приймаєте сигнали і SIGTERM(за замовчуванням) не вдається. Я б також запропонував вам використовувати ім'я сигналу, що полегшує читання:

kill -TERM ${process}

УВАГА

Перед виконанням kill ...переконайтеся, що $processзмінна встановлена ​​так, як очікувалося. ps -efМоже , розрізнялися Юнікси так , awkможливо , буде потрібно надрукувати інший параметр.

Примітка

Зміни <PROCESS_NAME>можна змінити в змінну. Просто пам’ятайте, що якщо вам доведеться вводити його в командному рядку кожен раз, ви, ймовірно, будете помилятися раз у раз. Мені легше мати декілька копій сценарію з правильною назвою.

Також важливо: зверніть увагу на одиничні цитати awkсценарію. Це означає, що вам потрібно закрити і знову відкрити рядок зі змінною між ними. Щось подібне має спрацювати (неперевірено):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.