Привет, я тут немного затроил, но без чтива вас не оставлю. Сегодня обсудим, что делает kill -0 $pid в Bash-скриптах.
В принципе логично, команда должна убить какой-то процесс. Но, как мы знаем, сигналы начинаются с единицы: (1) = SIGHUP, а тут какой-то странный нолик затесался.
В некоторых дистрибутивах через 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
- Запускаем в фоне задачу sleep
- Присваиваем переменной PID процесса
- Проверяем: если процесс с $pid запущен, то убиваем его
- Проверяем, что процесс убит
Здесь мы с помощью нуля проверили наличие запущенного процесса и возможность отправлять ему сигналы. Если всё ок, то отрабатывает команда 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, — это прям мастхэв, суют везде, мама не горюй.
Хорошего дня, а я пошёл дальше диван давить да лечиться. Увидимся!








Комментарии