Как проверить файл и выполнить команду, если нет?

У меня есть демон, который я написал с помощью 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, если файл не существует.