Чи надійні файли .pid для визначення того, чи працює процес?


11

Багато програм, таких як sshd, створюють .pid-файли в / var / run /, що містять їх ідентифікатор процесу. Чи надійні ці файли для визначення того, чи працює процес? Я здогадуюсь, що ці файли створюються вручну процесом, тому вони все ще залишатимуться у файловій системі, якщо програма виходить з ладу.

Відповіді:


16

простіше кажучи, ні : процес (наприклад, демон) може вийти з ладу і не встигнути очистити його .pid файл.

Метод, щоб бути більш впевненим у стані програми: використовувати явний канал зв'язку, такий як сокет. Запишіть порт сокета у файл і попросіть supervisorпроцес переглянути його.

Ви також можете скористатися послугами DBus в Linux: зареєструйте конкретне ім’я та перевірте це ім'я у вашого керівника процесу (як би ви його не називали).

Існують численні методики.

Потрібно пам’ятати: керування файлами PID не несе відповідальність ОС.


1
Існування pid-файлу, поєднаного з існуванням процесу, має бути достатнім. Якщо процес вийшов, ви можете це перевірити. Ідентифікатори PID повторно використовуються, але не дуже часто.
MarkR

2
те, як часто під використовується повторно, залежить від конкретної системи. Я бачив, як система PID-цикли перемикалася щонайменше щодня. Ви повинні перевірити pid, чи є процес, і чи виявляється цей процес таким, яким ви очікуєте мати його.

@atk: точно. Немає стандартних per-se, і навіть якщо такий був, це може бути дуже дотримано деякими реалізаціями. Наприклад, я можу створити демон, який взагалі не записує PID-файл, і використовувати зворотний канал для отримання команд управління.
jldupont

@atk: на жаль, немає ніякого способу забезпечити повторне використання PID між часом перевірки та часом використання ...
SamB

3

Jldupont правильно вказав, що .pid-файли не є надійними для визначення того, чи працює процес, оскільки файл не може бути видалений у разі збою.

Умови перегонів убік, я часто використовую pgrep, коли мені потрібно знати, чи працює процес. Тоді я міг би перехресне посилання на вихідні файли .pid, якщо вважав це необхідним.


3

Файл, що містить ідентифікатор процесу, не є надійним. Визначати, працює процес чи ні. Це просто надійне джерело для з'ясування останнього заданого ідентифікатора процесу.

Коли у вас є ідентифікатор процесу, вам потрібно пройти подальшу перевірку, чи процес дійсно запущений.

Ось приклад:

#!/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

щоб з'ясувати, якщо файл виходить.


2

Невірно просто перевірити існування процесу з тим самим pid, що міститься у файлі.

Але багато реалізацій pidfile також роблять блокування на pidfile, так що якщо процес відмирає, блокування вимикається. За умови надійності механізму блокування, перевірка того, чи файл все ще заблокований, є відносно надійним механізмом визначення того, чи не працює початковий процес.


1

Jldupont правильний.

Однак ви можете надіслати процес 0 сигналу (kill -s 0 pid), щоб побачити, чи процес все ще живий (якщо припустити, що ви маєте повноваження надсилати такий сигнал - загалом, може надсилати лише власник процесу це сигнал).


4
Але перевірка наявності процесу з цим PID не означає, що це PID, який вам цікавий.
Янв

0

Я згоден з jschmier.

У деяких системах ви не отримуєте доступу до pgrep. У такому випадку ви можете зробити, ps -aef | grep <pid>щоб з’ясувати, чи справді процес запущений.


1
Ключовим моментом у питанні було "надійне". Робити PS та шукати PID не є надійним.
Янв

ну ... припускаючи, що ви знаєте цю назву програми, чому ви вважаєте, ps -aef | греп ненадійний?
користувач29584

3
Умови гонки: стан системи змінився з часом закінчення ps. Назви процесів: інший процес може мати схожий заголовок із тим, що вас цікавить. Кілька примірників: розгляньте систему з двома екземплярами однієї служби, кожен з файлами PID. Одне виходить з ладу, а інше перезавантажується і отримує PID першої служби. Як ти розкажеш? І т.д. Для надійної альтернативи дивіться, наприклад, cr.yp.to/daemontools.html
січня
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.