0

Скрипт для Linux, чтобы завершить процесс Java

18

Описание проблемы:

Я пытаюсь написать скрипт для 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 ответ(ов)

1

Вы можете просто использовать pkill -f следующим образом:

pkill -f 'java -jar'

ИЗМЕНЕНИЕ: Чтобы остановить конкретный процесс Java, запущенный с вашим jar-файлом, используйте следующую команду с регулярным выражением:

pkill -f 'java.*lnwskInterface'
0

Если вы просто хотите завершить все процессы Java, то вам достаточно выполнить команду:

killall java

Однако, если вам нужно завершить именно процесс wskInterface, то вы уже на верном пути, просто нужно извлечь идентификатор процесса (PID):

PID=`ps -ef | grep wskInterface | awk '{ print $2 }'`
kill -9 $PID

Это должно сработать, хотя, возможно, есть и более простой способ...

0

Если у вас запущено несколько процессов Java и вы хотите завершить их одним командным вызовом, попробуйте использовать следующую команду:

kill -9 $(ps -ef | pgrep -f "java")

Замените "java" на любой другой идентификатор строки процесса, чтобы завершить другие процессы.

Будьте осторожны с использованием сигнала -9, так как он принудительно завершает процессы без возможности корректного освобождения ресурсов. Лучше использовать kill без -9 в начале, чтобы дать процессам шанс завершиться корректно.

0

Проблема, с которой вы столкнулись, может быть связана с тем, как pkill обрабатывает аргументы или работает с процессами. Вы сделали правильный шаг, что решили обойтись без pkill, и использовали другой подход для завершения процесса. Ваш сценарий работает следующим образом:

  1. ps aux выводит все запущенные процессы.
  2. grep -v -e 'grep ' исключает из результата строки, содержащие grep, чтобы не захватить саму команду поиска.
  3. grep MainApp фильтрует процессы, содержащие MainApp в своем выводе.
  4. tr -s " " сжимает последовательные пробелы, чтобы облегчить дальнейшую обработку.
  5. cut -d " " -f 2 извлекает идентификаторы процессов (PID).
  6. 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, проверьте, правильно ли вы указываете имя процесса, и нет ли дополнительных параметров, которые могут влиять на его выполнение.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь