Это немного трудно подобрать, но если вы посмотрите на следующие 2 справочные страницы, вы увидите следующие заметки:
убить (1)
$ man 1 kill
...If sig is 0,then no signal is sent, but error checking is still performed....
убить (2)
$ man 2 kill
...If sig is 0,then no signal is sent, but error checking is still performed;
this can be used to check for the existence of a process ID or process
group ID....
Таким образом, сигнал 0 на самом деле ничего не отправит на PID вашего процесса, но проверит, есть ли у вас разрешения для этого.
Где это может быть полезно?
Одно очевидное место было бы, если бы вы пытались определить, есть ли у вас разрешения на отправку сигналов запущенному процессу через kill. Вы можете проверить перед отправкой фактического killсигнала, который вы хотите, обернув проверку, чтобы убедиться, что это kill -0 <PID>было сначала разрешено.
пример
Скажем, процесс запускался пользователем root следующим образом:
$ sudo sleep 2500&[1]15693
Теперь в другом окне, если мы запустим эту команду, мы можем подтвердить, что этот PID работает.
$ pgrep sleep
15693
Теперь давайте попробуем эту команду, чтобы увидеть, есть ли у нас доступ для отправки этих сигналов PID через kill.
Я также добавил бы, что это можно использовать для сценариев с несколькими процессами, чтобы увидеть, является ли процесс еще живым.
prateek61
1
@Slm хорошая находка. Используя эту логику прямо сейчас в сценарии, я пишу, спасибо.
111 ---
12
Prateek61 прав. Вы не можете использовать pgrep, psанализируя или test -e /proc/$PIDв портативных записках, но kill -0работает везде. Если вы получили PID, который может быть устаревшим - например, /var/runзапись - это переносной способ проверить, все еще ли запущен процесс.
Уоррен Янг
1
В дополнение к сообщению о том, что PID активен, он также эффективно сообщает, выполняет ли он процесс с вашего UID, поскольку у вас нет разрешения на отправку сигналов на другие UID (если вы не root). Это делает ложные срабатывания из-за повторного использования PID менее вероятными.
Бармар
Провальный kill -0 $(pgrep sleep)могут не обязательно означают , что вы как раз слабые , он возвращает ложь , если нет sleepкоманды работает, или если есть более чем один и есть один , вы не можете убить, или если один из Снов умирают между pgrep и убийством команды запускаются.
Стефан Шазелас
22
kill -0(или его более переносимый вариант POSIX kill -s 0) проходит процесс отправки сигнала, но фактически не отправляет его. Это особенность лежащего в основе C API, которую команда shell предоставляет простым способом.
kill -s 0 -- "$pid"таким образом, проверяется, существует ли запущенный процесс с заданным PID (или PGID, если $pidон отрицательный), и будет ли текущий процесс иметь разрешение на отправку (любому из процессов в группе процессов в случае отрицательного $pid) сигнала. В основном это способ проверить, жив ли процесс (или группа процессов).
Имейте в виду, что даже если есть запущенный процесс с ожидаемыми PID и разрешениями, это не обязательно тот процесс, который вы ожидаете. Возможно, что ожидаемый вами процесс умер раньше, и его PID был повторно использован для несвязанного процесса. Правильный способ контролировать процессы - позволить родителю делать это - PID процесса не используется повторно до тех пор, пока его родитель не подтвердит его смерть (вот почему существуют зомби ), поэтому родительский процесс может надежно идентифицировать своих детей по их PID.
блок ... do something ...выполняется, если /path/to/file.pidзапущен процесс с сохраненным в нем идентификатором PID, и - если фрагмент не работает от имени пользователя root - если идентификатор PID выполняется под тем же пользователем.
Стандарт POSIX определяет роль 0сигнала:
Если sig равно 0 (нулевой сигнал), выполняется проверка ошибок, но сигнал фактически не отправляется. Нулевой сигнал может быть использован для проверки правильности pid.
(kill (3p), POSIX.1-2008 - аналогичная формулировка в POSIX.1-2001)
Обратите внимание, что POSIX определяет оба стиля kill -0и kill -s 0стиль командной строки (kill (1p)).
В отличие от интерфейса kill syscall, killкоманда не может использоваться для надежной проверки на наличие PID, принадлежащих другим пользователям (как обычным пользователям), например:
$ kill -0123
kill: kill 123 failed: no such process
$ echo $?1
trap
командой Бэша и 0 по сравнению с сигналом 0 изkill
: Что такое сигнал 0 в команде прерывания?kill -0 $pid
сценарий оболочки? а также что делает kill 0 на самом деле? ,Ответы:
Это немного трудно подобрать, но если вы посмотрите на следующие 2 справочные страницы, вы увидите следующие заметки:
убить (1) убить (2)Таким образом, сигнал 0 на самом деле ничего не отправит на PID вашего процесса, но проверит, есть ли у вас разрешения для этого.
Где это может быть полезно?
Одно очевидное место было бы, если бы вы пытались определить, есть ли у вас разрешения на отправку сигналов запущенному процессу через
kill
. Вы можете проверить перед отправкой фактическогоkill
сигнала, который вы хотите, обернув проверку, чтобы убедиться, что этоkill -0 <PID>
было сначала разрешено.пример
Скажем, процесс запускался пользователем root следующим образом:
Теперь в другом окне, если мы запустим эту команду, мы можем подтвердить, что этот PID работает.
Теперь давайте попробуем эту команду, чтобы увидеть, есть ли у нас доступ для отправки этих сигналов PID через
kill
.Так что это работает, но вывод выдаёт сообщение от
kill
команды, что у нас нет прав. Ничего страшного, просто поймайте STDERR и отправьте/dev/null
.Полный пример
Итак, мы могли бы сделать что-то вроде этого
killer.bash
:Теперь, когда я запускаю вышеупомянутое как пользователь без полномочий root:
Однако, когда он запускается с правами root:
источник
pgrep
,ps
анализируя илиtest -e /proc/$PID
в портативных записках, ноkill -0
работает везде. Если вы получили PID, который может быть устаревшим - например,/var/run
запись - это переносной способ проверить, все еще ли запущен процесс.kill -0 $(pgrep sleep)
могут не обязательно означают , что вы как раз слабые , он возвращает ложь , если нетsleep
команды работает, или если есть более чем один и есть один , вы не можете убить, или если один из Снов умирают между pgrep и убийством команды запускаются.kill -0
(или его более переносимый вариант POSIXkill -s 0
) проходит процесс отправки сигнала, но фактически не отправляет его. Это особенность лежащего в основе C API, которую команда shell предоставляет простым способом.kill -s 0 -- "$pid"
таким образом, проверяется, существует ли запущенный процесс с заданным PID (или PGID, если$pid
он отрицательный), и будет ли текущий процесс иметь разрешение на отправку (любому из процессов в группе процессов в случае отрицательного$pid
) сигнала. В основном это способ проверить, жив ли процесс (или группа процессов).Имейте в виду, что даже если есть запущенный процесс с ожидаемыми PID и разрешениями, это не обязательно тот процесс, который вы ожидаете. Возможно, что ожидаемый вами процесс умер раньше, и его PID был повторно использован для несвязанного процесса. Правильный способ контролировать процессы - позволить родителю делать это - PID процесса не используется повторно до тех пор, пока его родитель не подтвердит его смерть (вот почему существуют зомби ), поэтому родительский процесс может надежно идентифицировать своих детей по их PID.
источник
Он
kill -0 $pid
сообщает вам, существует ли процесс с$pid
.Во фрагменте
блок
... do something ...
выполняется, если/path/to/file.pid
запущен процесс с сохраненным в нем идентификатором PID, и - если фрагмент не работает от имени пользователя root - если идентификатор PID выполняется под тем же пользователем.Стандарт POSIX определяет роль
0
сигнала:(kill (3p), POSIX.1-2008 - аналогичная формулировка в POSIX.1-2001)
Обратите внимание, что POSIX определяет оба стиля
kill -0
иkill -s 0
стиль командной строки (kill (1p)).В отличие от интерфейса kill syscall,
kill
команда не может использоваться для надежной проверки на наличие PID, принадлежащих другим пользователям (как обычным пользователям), например:против
При вызове системного вызова kill можно надежно различить эти случаи, посмотрев на
errno
значение (см., Например, пример Python ).источник