Как зафиксировать результат системного вызова в переменной оболочки? - PullRequest
5 голосов
/ 03 апреля 2009

Мы хотим создать скрипт, который запускается каждую ночь (убивает и перезапускает процесс Java). Для этого нам нужно захватить номер процесса (поскольку может быть запущено более одного процесса Java). Приведенная ниже команда в основном используется для получения номера процесса, возможно, с регулярным выражением в конце grep. Если не появятся лучшие предложения.

root#ps -e |grep  'java'
18179 pts/0    00:00:43 java

Мы хотим знать, как проанализировать приведенный выше вывод и передать его в переменную оболочки, чтобы мы могли использовать команду kill, как показано ниже.

kill -9 ${processid}
wait 10

Примечание 1. Причина, по которой мы не можем полагаться на обычную команду остановки службы, заключается в том, что процессы иногда не хотят умирать. И мы должны использовать команду kill вручную.

Ответы [ 7 ]

4 голосов
/ 03 апреля 2009

Есть несколько вариантов решения этой проблемы. Если вы используете bash, то переменная оболочки '$!' будет содержать PID последнего разветвленного дочернего процесса. Итак, после запуска вашей Java-программы сделайте что-то вроде:

echo $! > /var/run/my-process.pid

Затем, после того, как ваш скрипт инициализации остановит процесс Java:

# Get the pidfile.
pid=$(cat /var/run/my-process.pid)

# Wait ten seconds to stop our process.
for count in $(1 2 3 4 5 6 7 8 9 10); do
    sleep 1
    cat "/proc/$pid/cmdline" 2>/dev/null | grep -q java
    test $? -ne 0 && pid="" && break
done

# If we haven't stopped, kill the process.
if [ ! -z "$pid" ]; then
    echo "Not stopping; terminating with extreme prejudice."
    kill -9 $pid
fi

Обязательно удалите pid-файл, когда закончите.

3 голосов
/ 03 апреля 2009
ps aux | grep java | awk '{print $1}' | xargs kill -9

Вот объяснение:

ps aux дает вам список всех процессов

grep java дает вам все процессы, чьи имена и аргументы командной строки содержат строку "java"

awk '{print $1}' анализирует вывод команды grep в столбцы по пробелам и перепечатывает только первый столбец

xargs kill -9 передает каждый из результатов команды awk в качестве параметров команде kill -9

2 голосов
/ 21 мая 2011

Я понимаю, что это старый, но как насчет:

pidof java | xargs kill
1 голос
/ 03 апреля 2009

Если вы делаете то, что предлагаете, вы можете в конечном итоге захватить сам grep и убить его (поскольку ваша команда grep содержит строку java, которую вы ищете). Вы можете обойти это, исключив grep (используя другой grep!):

pid=`ps -e | fgrep java | fgrep -v grep | awk '{print $1}'`
# check pid has a value
# kill $pid

Вам также может понравиться ps -e -opid,args.

Лучшая альтернатива - использовать pgrep(1) или pkill(1), если они есть в вашей системе. Нет больше труб, сида, ауков, порезов, ксаргов:

pkill -9 java
1 голос
/ 03 апреля 2009

Вы можете легко получить PID или список PID в переменную с помощью обратных галочек и вырезать (или awk, если хотите), чтобы получить только поле PID:

[user@host ~]$ ps -e | grep java | cut -d' ' -f1
12812
12870
13008
13042
13060

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

JAVA_PROCS=`ps -e | grep java | cut -d' ' -f1`

Вы можете перебирать процессы, чтобы убить их при желании:

for proc in $JAVA_PROCS; do
    kill -9 $proc; 
done

Конечно, если вы извлекаете только один процесс, вам не нужно итерировать, и вы можете просто запустить его как:

kill -9 $JAVA_PROCS
0 голосов
/ 03 апреля 2009

Я использую что-то вроде этого:

kill $(ps -A | grep java | cut -b 1-5)
0 голосов
/ 03 апреля 2009

убивает его:

ps -e | grep java | cut -f1 -d' ' | xargs kill -9

сохранение PID в переменной:

export JAVAPID=`ps -e | grep 'java' | cut -f1 -d' '`

проверка работоспособности:

echo $JAVAPID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...