Скрипт для Linux, чтобы завершить процесс Java
Описание проблемы:
Я пытаюсь написать скрипт для Linux, который будет завершать работающую Java-программу, запущенную в консоли.
Вот процесс, который запущен как jar:
[rapp@s1-dlap0 ~]$ ps -ef | grep java
rapp 9473 1 0 15:03 pts/1 00:00:15 java -jar wskInterface-0.0.1-SNAPSHOT-jar-with-dependencies.jar
rapp 10177 8995 0 16:00 pts/1 00:00:00 grep java
[rapp@s1-dlap0 ~]$
Как мне автоматически завершить этот процесс с помощью скрипта? Буду признателен за любые советы или примеры кода.
4 ответ(ов)
Вы можете просто использовать pkill -f следующим образом:
pkill -f 'java -jar'
ИЗМЕНЕНИЕ: Чтобы остановить конкретный процесс Java, запущенный с вашим jar-файлом, используйте следующую команду с регулярным выражением:
pkill -f 'java.*lnwskInterface'
Если вы просто хотите завершить все процессы Java, то вам достаточно выполнить команду:
killall java
Однако, если вам нужно завершить именно процесс wskInterface, то вы уже на верном пути, просто нужно извлечь идентификатор процесса (PID):
PID=`ps -ef | grep wskInterface | awk '{ print $2 }'`
kill -9 $PID
Это должно сработать, хотя, возможно, есть и более простой способ...
Если у вас запущено несколько процессов Java и вы хотите завершить их одним командным вызовом, попробуйте использовать следующую команду:
kill -9 $(ps -ef | pgrep -f "java")
Замените "java" на любой другой идентификатор строки процесса, чтобы завершить другие процессы.
Будьте осторожны с использованием сигнала -9, так как он принудительно завершает процессы без возможности корректного освобождения ресурсов. Лучше использовать kill без -9 в начале, чтобы дать процессам шанс завершиться корректно.
Проблема, с которой вы столкнулись, может быть связана с тем, как pkill обрабатывает аргументы или работает с процессами. Вы сделали правильный шаг, что решили обойтись без pkill, и использовали другой подход для завершения процесса. Ваш сценарий работает следующим образом:
ps auxвыводит все запущенные процессы.grep -v -e 'grep 'исключает из результата строки, содержащиеgrep, чтобы не захватить саму команду поиска.grep MainAppфильтрует процессы, содержащиеMainAppв своем выводе.tr -s " "сжимает последовательные пробелы, чтобы облегчить дальнейшую обработку.cut -d " " -f 2извлекает идентификаторы процессов (PID).xargs kill -9завершает найденные процессы с помощью сигналаSIGKILL.
Ваша команда выглядит вполне рабочей. Однако, имейте в виду, что использование kill -9 (сигнал KILL) завершает процессы немедленно, без возможности корректного завершения. Это может привести к потере данных или некорректному состоянию приложения. Обычно рекомендуется использовать kill без -9, чтобы дать приложению шанс корректно завершиться. Например, вы можете сначала попробовать:
(ps aux | grep -v -e 'grep ' | grep MainApp | tr -s " " | cut -d " " -f 2 | xargs kill) || true
Если у вас по-прежнему возникают проблемы с pkill, проверьте, правильно ли вы указываете имя процесса, и нет ли дополнительных параметров, которые могут влиять на его выполнение.
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?
Как создать файл в Linux из терминала? [закрыто]
Автоматический вход в Docker через Bash-скрипт