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