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

Я пытаюсь написать сервис скрипт для приложения. Таким образом, я могу управлять этим следующим образом:

./myscript.sh start|stop|status

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

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

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

4
задан 17 December 2015 в 15:07
2 ответа

Вы можете проверить, что 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
1
ответ дан 3 December 2019 в 04:09

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

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

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

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

0
ответ дан 3 December 2019 в 04:09

Теги

Похожие вопросы