Как скрипт bash может гарантировать, что работает не более одной его копии? - PullRequest
2 голосов
/ 09 сентября 2011

Как скрипт bash может гарантировать, что работает не более одной его копии?

Я пробовал:

ps -ef| grep /user/loca/shell/sh | wc -l

Это показывает мне 2 из-за команды grep,Измените его на:

ps -ef | grep /user/loca/shell/sh | grep -v 'grep' wc -l 

, тогда он показывает 1. Однако, если я тогда vim /user/loca/shell/sh и затем выполню:

ps -ef| grep /user/loca/shell/sh | grep -v 'grep' wc -l

, который показывает 2. Но есть только один процесс,Я начал.

Как скрипт bash может проверить, запущен ли процесс?

Ответы [ 3 ]

7 голосов
/ 09 сентября 2011

Идиома, часто используемая в демонах Unix, заключается в создании файла с PID в нем при запуске.

Затем вы можете проверить наличие и / или содержимое файла при запуске, если он есть, вы выходите и оставляете этот экземпляр работающим.

В конце скрипта вы удаляете файл, готовый к запуску в следующий раз.

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

0 голосов
/ 10 сентября 2011

Я использую блокировку файла:

MY_LOCK_FILE='whatever.lock'

( if (flock -nx 200); then
      # Do stuff here...
  fi
) 200>"$MY_LOCK_FILE"
0 голосов
/ 09 сентября 2011

Попробуйте pgrep вместо 'ps -ef ...' в вашем скрипте:

pgrep /usr/loca/shell/sh

Если это не сработает, я прибегну к блокировке, пытаясь создать символическую ссылку изскрипт, если он еще не существует, и выручить, если он уже существует, и удалить его при выходе.Создание символической ссылки - это атомарная операция в Unix, которая может использоваться как своего рода блокировка для сценариев оболочки.

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