Скрипт для 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-скрипт