Что делает `kill -0`?

Недавно я встретил это в сценарии оболочки.

if ! kill -0 $(cat /path/to/file.pid); then ... do something ... fi 

Что kill -0 ... делать?

2 Solutions collect form web for “Что делает `kill -0`?”

Это немного трудно просветить, но если вы посмотрите на следующих двух страницах руководства, вы увидите следующие примечания.

убить (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> был сначала разрешен.

пример

Скажем, что процесс запускается из корня следующим образом:

 $ sudo sleep 2500 & [1] 15690 

Теперь в другом окне, если мы запустим эту команду, мы можем подтвердить, что этот PID запущен.

 $ pgrep sleep 15693 

Теперь попробуем эту команду, чтобы увидеть, есть ли у нас доступ для отправки сигналов PID через kill .

 $ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi bash: kill: (15693) - Operation not permitted You're weak! 

Таким образом, он работает, но на выходе происходит утечка сообщения из команды kill что у нас нет разрешений. Не большое дело, просто поймайте STDERR и отправьте его в /dev/null .

 $ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi You're weak! 

Полный пример

Итак, мы могли бы сделать что-то вроде этого, killer.bash :

 #!/bin/bash PID=$(pgrep sleep) if ! kill -0 $PID 2>/dev/null; then echo "you don't have permissions to kill PID:$PID" exit 1 fi kill -9 $PID 

Теперь, когда я запускаю выше, как пользователь без полномочий root.

 $ ~/killer.bash you don't have permissions to kill PID:15693 $ echo $? 1 

Однако, когда он запускается с правами root: $ sudo ~ / killer.bash

 $ echo $? 0 $ pgrep sleep $ 

kill -0 (или его более портативный вариант POSIX kill -s 0 ) проходит через движение отправки сигнала, но фактически не отправляет его. Это функция базового C API, которую команда оболочки предоставляет прямолинейно.

kill -s 0 -- "$pid" таким образом, проверяет, существует ли запущенный процесс с данным PID (или PGID, если $pid отрицательный), и может ли текущий процесс иметь разрешение на его отправку (любой из процессов в группа процессов в случае отрицательного $pid ) сигнала. В основном это способ проверить, жив ли процесс (или группа процессов).

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

Linux и Unix - лучшая ОС в мире.