Привет, я тут немного затроил, но без чтива вас не оставлю. Сегодня обсудим, что делает kill -0 $pid в Bash-скриптах.

В принципе логично, команда должна убить какой-то процесс. Но, как мы знаем, сигналы начинаются с единицы: (1) = SIGHUP, а тут какой-то странный нолик затесался.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Что забавно, в официальной документации и всяких манах информации по этому нулю очень мало.

В некоторых дистрибутивах через man 2 kill можно получить такой ответ:

If sig is 0, then no signal is sent, but existence and permission checks are still performed; this can be used to check for the existence of a process ID or process group ID that the caller is permitted to signal.

Не по-русски, но с переводчиком понятно. Короче, с помощью нуля можно проверить, запущен ли процесс и может ли пользователь отправлять ему сигналы.

Давай к примерам:

sleep 120 &
pid=$!
kill -0 $pid && kill $pid
fg
  1. Запускаем в фоне задачу sleep
  2. Присваиваем переменной PID процесса
  3. Проверяем: если процесс с $pid запущен, то убиваем его
  4. Проверяем, что процесс убит

Здесь мы с помощью нуля проверили наличие запущенного процесса и возможность отправлять ему сигналы. Если всё ок, то отрабатывает команда kill $pid.

А если запустить так:

kill -0 $pid; echo "Exit status: $?"

Получим статус выхода. То есть процесс не запущен и можно смело выходить со статусом 1.

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

sudo sleep 120 &
kill -0 $!; echo "Exit status: $?"

В итоге получим:

bash: kill: (1644755) - Operation not permitted
Exit status: 1

То есть запускаем фоновый процесс от рута, а затем с помощью нуля проверяем, сможет ли обычный пользователь убить этот процесс. Как видим — хуй, не сможет.

В нормальной жизни я редко встречал скрипты с такими конструкциями и проверками, но тот, кто профессионально пишет для opensource, — это прям мастхэв, суют везде, мама не горюй.

Хорошего дня, а я пошёл дальше диван давить да лечиться. Увидимся!