Являются ли файлы.pid надежными для определения того, запущен ли процесс?
Многие программы, такие как sshd, создают файлы.pid в /var/run/, которые содержат их идентификатор процесса. Надежны ли эти файлы для определения, запущен ли процесс? Я предполагаю, что эти файлы создаются вручную процессом и, следовательно, все равно останутся в файловой системе в случае сбоя программы.
6 ответов
Проще говоря, нет: процесс (например, демон) может завершиться сбоем и не успеть очистить свой файл.pid.
Техника для большей уверенности в состоянии программы: использовать явный канал связи, такой как сокет. Запишите порт сокета в файл и получите supervisor
Процесс поиска.
Вы также можете использовать службы DBus в Linux: зарегистрировать определенное имя и попросить ваш процесс супервизора (как бы вы его ни называли) проверить это имя.
Есть множество методов.
Следует помнить одно: операционная система не несет ответственности за управление файлами PID.
Jldupont прав, утверждая, что файлы.pid не являются надежными для определения того, запущен ли процесс, поскольку файл не может быть удален в случае сбоя.
Помимо условий гонки, я часто использую pgrep, когда мне нужно знать, запущен ли процесс. Затем я мог бы сопоставить выходные данные с файлами.pid, если я счел это необходимым.
Файл, содержащий идентификатор процесса, не является надежным. Определите, запущен процесс или нет. Это просто надежный источник для определения последнего заданного идентификатора процесса.
Когда у вас есть идентификатор процесса, вы должны дополнительно проверить, действительно ли процесс запущен.
Вот пример:
#!/usr/bin/env sh
file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)
if [ ! -f ${file} ]; then
echo "File does not exists: ${file}"
exit 1
fi
if [ ! -r ${file} ]; then
echo "Insufficient file persmissons: ${file}"
exit 1
fi
psoutput=$(ps -p ${processid} -o comm=)
if [ $? == 0 ];then
if [ ${psoutput} == "sshd" ]; then
echo "sshd process is realy running with process id ${processid}"
exit 0
else
echo "given process id ${processid} is not sshd: ${psoutput}"
exit 1
fi
else
echo "there is no process runing with process id ${processid}"
exit 0
fi
pgrep - хорошая команда, но у вас будут проблемы, если у вас запущено несколько экземпляров. Например, если у вас есть обычный sshd, работающий на порту TCP/22, и у вас есть другой sshd, работающий на порту TCP/2222, то pgrep доставит два идентификатора процесса при поиске sshd... когда обычный sshd имеет свой pid в /var/run/sshd.pid, а другой может иметь свой pid в /var/run/sshd-other.pid, чтобы вы могли четко дифференцировать процессы.
Я не рекомендую использовать только ps, пропуская через один или несколько каналов с помощью grep и grep -v, пытаясь отфильтровать все другие вещи, которые вас не интересуют... это немного похоже на использование
find . | grep myfile
выяснить, если файл выходит.
Ненадежно просто проверять существование процесса с тем же pid, который содержится в файле.
Но многие реализации pidfile также блокируют pidfile, поэтому, если процесс умирает, блокировка исчезает. При условии надежного механизма блокировки, проверка того, заблокирован ли файл, является относительно надежным механизмом для определения того, все еще выполняется исходный процесс.
Илдупонт правильно.
Однако вы можете отправить процессу сигнал 0 (kill -s 0 pid), чтобы увидеть, если процесс еще жив (при условии, что у вас есть права на отправку такого сигнала - в общем, отправлять может только владелец процесса). это сигнал).
Я согласен с jschmier.
В некоторых системах вы не получаете доступ к pgrep. В таком случае вы можете сделать ps -aef | grep <pid>
чтобы выяснить, действительно ли процесс запущен.