Многие программы, такие как sshd, создают файлы .pid в / var / run /, которые содержат их ID процесса. Надежны ли эти файлы для определения того, запущен ли процесс? Я предполагаю, что эти файлы создаются вручную процессом и, следовательно, все равно останутся в файловой системе, если программа выйдет из строя.
простыми словами, нет: процесс (например, демон) может дать сбой и не успеть очистить свой .pid файл.
Техника для большей уверенности в состоянии программы: используйте явный канал связи, такой как сокет. Запишите порт сокета в файл и получите supervisor
процесс посмотрите это.
Вы также можете использовать службы DBus в Linux: зарегистрируйте конкретное имя и попросите ваш супервизор (как бы вы его ни называли) проверить это имя.
Есть множество техник.
Следует помнить одну вещь: ОС не отвечает за управление файлами 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, вы можете четко различать процессы.
я не рекомендую использовать только пс, прокладка через одну или несколько труб с grep и grep -v пытаясь отфильтровать все остальное, что вас не интересует ... это немного похоже на использование
find . | grep myfile
чтобы выяснить, выходит ли файл.
Jldupont правильно заявляет, что файлы .pid ненадежный для определения того, запущен ли процесс, поскольку файл не может быть удален в случае сбоя.
Помимо условий гонки, я часто использую pgrep когда мне нужно знать, запущен ли процесс. Затем я мог бы сопоставить вывод с файлом (-ами) .pid, если бы посчитал это необходимым.
Ненадежно просто проверять существование процесса с тем же идентификатором pid, который содержится в файле.
Но многие реализации pidfile также блокируют pidfile, так что, если процесс умирает, блокировка снимается. При условии, что механизм блокировки надежен, проверка того, заблокирован ли файл по-прежнему, является относительно надежным механизмом для определения того, выполняется ли исходный процесс.
Jldupont прав.
Однако вы можете отправить процессу сигнал 0 (kill -s 0 pid), чтобы узнать, жив ли процесс (при условии, что у вас есть полномочия на отправку такого сигнала - как правило, только владелец процесса может отправлять это сигнал).
Я согласен с jschmier.
В некоторых системах у вас нет доступа к pgrep. В таком случае вы можете сделать ps -aef | grep <pid>
чтобы узнать, действительно ли процесс запущен.