Я пытаюсь написать сервис скрипт для приложения. Таким образом, я могу управлять этим следующим образом:
./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 / .