Назад | Перейти на главную страницу

Как правильно обрабатывать удаление pid.file в служебном скрипте

Пытаюсь написать служебный скрипт для приложения. Так что я могу контролировать это так:

./myscript.sh start|stop|status

На старте pid.file с идентификатором процесса создается, и на его основе я могу проверить статус и остановить процесс. В команде остановки я удаляю pid.file - все нормально.

Но если приложение аварийно вылетает - отключение питания и т. Д., pid.file не удаляет, и мне нужно удалить его вручную.

Как правильно обрабатывать эти ненормальные ситуации в скрипте?

Вы можете убедиться, что pid запущен и принадлежит вашему приложению:

pid=$(< "$pidfile")   # a bash builtin way to say: pid=$(cat $pidfile)
if  kill -0 $pid &&
    [[ -r /proc/$pid/cmdline ]] && # find the command line of this process
    xargs -0l echo < /proc/$pid/cmdline | grep -q "your_program_name"
then
    # your application is running
    true
else
    # no such running process, or some other program has acquired that pid:
    # your pid file is out-of-date
    rm "$pidfile"
fi

Файлы PID никогда не следует удалять, если вы не удалили программное обеспечение, которое их создало.

Файл PID - это прежде всего защита от одновременного выполнения. Удаление файла PID лишает эту цель навсегда. В тот момент, когда вы отсоединяете файл PID, произвольное количество процессов может иметь для него дескриптор открытого файла и может получить исключительную блокировку на него операционной системой.

Ветвь else из ответа @glenn_jackman действительно стоит удалить.

Я объяснил основную проблему более подробно, включая пример кода для воспроизведения результирующих условий гонки на http://www.guido-flohr.net/ Never-delete-your-pid-file/.