В сценарии удара я хочу сделать следующее (в псевдокоде):
if [ a process exists with $PID ]; then
kill $PID
fi
Каково соответствующее выражение для условного оператора?
Чтобы проверить существование процесса, используйте
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
У вас есть два пути:
Давайте начнем с поиска конкретного приложения в моем ноутбуке:
[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", как описано в других ответах.
Команда ps
с -p $PID
может сделать вот что:
$ ps -p 3531
PID TTY TIME CMD
3531 ? 00:03:07 emacs
Я думаю, что это плохое решение, которое открывает возможности для гонок. Что, если процесс остановится между вашим тестом и вашим призывом убить? Тогда убить не удастся. Так почему бы просто не попробовать kill во всех случаях и проверить его возвращаемое значение, чтобы узнать, как оно прошло?