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