Как проверить, существует ли идентификатор процесса (PID)

В сценарии удара я хочу сделать следующее (в псевдокоде):

if [ a process exists with $PID ]; then

    kill $PID 

fi

Каково соответствующее выражение для условного оператора?

169
задан codeforester 21 April 2018 в 03:52
поделиться

4 ответа

Чтобы проверить существование процесса, используйте

kill -0 $pid

Но, как сказал @unwind, если вы все равно собираетесь его убить, просто

kill $pid

или у вас будет состояние гонки.

Если вы хотите игнорировать текстовый вывод kill и делать что-то на основе кода выхода, вы можете

if ! kill $pid > /dev/null 2>&1; then
    echo "Could not send SIGTERM to process $pid" >&2
fi
170
ответ дан 23 November 2019 в 20:49
поделиться

У вас есть два пути:

Давайте начнем с поиска конкретного приложения в моем ноутбуке:

[root@pinky:~]# ps fax | grep mozilla
 3358 ?        S      0:00  \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
16198 pts/2    S+     0:00              \_ grep mozilla

Все примеры теперь будут искать PID 3358.

Первый способ: Выполните команду "ps aux" и найдите PID во втором столбце. В этом примере я ищу firefox, а затем его PID:

[root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
3358

Таким образом, ваш код будет таким:

if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
    kill $PID 
fi

Второй способ: Просто ищите что-нибудь в каталоге /proc/$PID. В этом примере я использую "exe", но вы можете использовать что угодно другое.

[root@pinky:~]# ls -l /proc/3358/exe 
lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash

Так что ваш код будет таким:

if [ -f /proc/$PID/exe ]; then
    kill $PID 
fi

BTW: что не так с kill -9 $PID || true ?


EDIT:

После размышлений об этом в течение нескольких месяцев... (около 24...) первоначальная идея, которую я здесь предложил, - это хороший хак, но очень непортативный. Хотя он учит некоторым деталям реализации Linux, он не будет работать на Mac, Solaris или *BSD. Он может даже не работать на будущих ядрах Linux. Пожалуйста - используйте "ps", как описано в других ответах.

11
ответ дан 23 November 2019 в 20:49
поделиться

Команда ps с -p $PID может сделать вот что:

$ ps -p 3531
  PID TTY          TIME CMD
 3531 ?        00:03:07 emacs
33
ответ дан 23 November 2019 в 20:49
поделиться

Я думаю, что это плохое решение, которое открывает возможности для гонок. Что, если процесс остановится между вашим тестом и вашим призывом убить? Тогда убить не удастся. Так почему бы просто не попробовать kill во всех случаях и проверить его возвращаемое значение, чтобы узнать, как оно прошло?

8
ответ дан 23 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: