Как проверить файл и выполнить команду, если нет?
У меня есть демон, который я написал с помощью Python. Когда он запущен, он имеет файл PID, расположенный в /tmp/filename.pid. Если демон не запущен, то файл PID не существует.
В Linux, как я могу проверить, чтобы файл PID существовал, а если нет, выполните команду для его перезапуска?
Команда будет
python daemon.py restart
который должен выполняться из определенного каталога.
Ответы
Ответ 1
[ -f /tmp/filename.pid ] || python daemon.py restart
-f
проверяет, существует ли данный путь и является ли он обычным файлом (только -e
проверяет, существует ли путь)
[]
выполнить тест и возвращает 0
при успешном завершении, 1
иначе
||
является C-like or
, поэтому, если команда слева не работает, выполните команду справа.
Итак, в последнем заявлении говорится, что если /tmp/filename.pid
НЕ существует, тогда запустите демон.
Ответ 2
Если это bash скриптинг, о котором вы думаете, что-то вроде этого будет работать:
if [ ! -f "$FILENAME" ]; then
python daemon.py restart
fi
Лучшим вариантом может быть просмотр lockfile
Ответ 3
Другие ответы подходят для обнаружения существования файла. Однако для полного решения вы, вероятно, должны проверить, что PID в pidfile все еще запущен, и что это ваша программа.
Ответ 4
test -f filename && daemon.py restart || echo "File doesn't exists"
Ответ 5
Другим подходом к решению проблемы является script, который гарантирует, что ваш демон "останется" в живых...
Что-то вроде этого (примечание: обработка сигнала должна быть добавлена для правильного запуска/выключения):
$PIDFILE = "/path/to/pidfile"
if [ ! -f "$PIDFILE" ]; then
echo "Pid file exists!"
exit 1
fi
while true; do
# Write it own pid file
python your-server.py ;
# force removal of pid in case of unexpected death.
rm -f $PIDFILE;
# sleep for 2 seconds
sleep 2;
done
Таким образом, сервер останется в живых, даже если он неожиданно умрет.
Ответ 6
Вы также можете использовать готовое решение, например Monit.
Ответ 7
ls /tmp/filename.pid
Он возвращает true, если файл существует. Возвращает false, если файл не существует.