Как я могу проверить, существует ли файл и выполнить команду, если нет? - PullRequest
20 голосов
/ 21 марта 2009

У меня есть демон, который я написал с использованием Python. Когда он работает, у него есть файл PID, расположенный в /tmp/filename.pid. Если демон не запущен, PID-файл не существует.

В Linux, как проверить, существует ли файл PID, и, если нет, выполнить команду для его перезапуска?

Команда будет

python daemon.py restart

, который должен быть выполнен из определенного каталога.

Ответы [ 7 ]

46 голосов
/ 21 марта 2009
[ -f /tmp/filename.pid ] || python daemon.py restart

-f проверяет, существует ли данный путь и является ли он обычным файлом (просто -e проверяет, существует ли путь)

[] выполняет тест и возвращает 0 в случае успеха, 1 в противном случае

|| является C-подобным or, поэтому, если команда слева не выполняется, выполните команду справа.

Итак, в последнем утверждении сказано, что если /tmp/filename.pid НЕ существует, запустите демон.

7 голосов
/ 21 марта 2009

Если вас интересует сценарий bash, то примерно так будет работать:

if [ ! -f "$FILENAME" ]; then
   python daemon.py restart
fi

Лучшим вариантом может быть просмотр lockfile

6 голосов
/ 26 ноября 2014
test -f filename && daemon.py restart || echo "File doesn't exists"
6 голосов
/ 21 марта 2009

Другие ответы хороши для обнаружения существования файла. Однако для полного решения вы, вероятно, должны проверить, что PID в pidfile все еще работает и что это ваша программа.

2 голосов
/ 21 марта 2009

Другим подходом к решению проблемы является скрипт, который гарантирует, что ваш демон "остается" живым ...

Примерно так (примечание: для правильного запуска / выключения должна быть добавлена ​​обработка сигналов):

$PIDFILE = "/path/to/pidfile"

if [ -f "$PIDFILE" ]; then
    echo "Pid file exists!"
    exit 1
fi

while true; do
    # Write it's 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

Таким образом, сервер останется в живых, даже если он неожиданно умрет.

1 голос
/ 21 марта 2014
ls /tmp/filename.pid

Возвращает true, если файл существует. Возвращает false, если файл не существует.

1 голос
/ 21 марта 2009

Вы также можете использовать готовое решение, например Monit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...