Определите, запущен ли уже скрипт ruby

Есть ли простой способ узнать, запущен ли уже скрипт Ruby, а затем обработать его соответствующим образом? Например: у меня есть сценарий с именем действительно_long_script.rb. У меня он настроен на запуск каждые 5 минут. Когда он запускается, я хочу увидеть, выполняется ли предыдущий запуск, а затем остановить выполнение второго сценария. Есть идеи?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
5
0
2 650
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В bash:

if ps aux | grep really_long_script.rb | grep -vq grep
then
    echo Script already running
else
    ruby really_long_script.rb
fi
Ответ принят как подходящий

PS - действительно плохой способ сделать это и, вероятно, открыт для условий гонки.

Традиционный способ Unix / Linux - записать PID в файл (обычно в / var / run) и проверить, существует ли этот файл при запуске.

например если файл pid находится в /var/run/myscript.pid, то перед запуском программы вы должны проверить, существует ли он. Есть несколько приемов, позволяющих избежать состояний гонки, связанных с использованием O_EXCL (исключая блокировку) для открытия файла и символических ссылок.

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

Чтобы не изобретать колесо заново, вы можете взглянуть на http://rubyforge.org/projects/pidify/

Вероятно, вам также следует проверить, действительно ли процесс запущен, так что если ваш скрипт умирает, не очистив себя, он будет запущен в следующий раз, а не просто проверяет это. /var/run/foo.pid существует и закрывается.

Горец

Описание

Гем, обеспечивающий выполнение только одного экземпляра вашего основного скрипта. Короче говоря, может быть только один.

Установка

gem install highlander

Синопсис

require 'highlander' # This should be the -first- thing in your code.
# Your code here

А пока вернемся к командной строке ...

# First attempt, works. Assume it's running in the background.
ruby your_script.rb

# Second attempt while the first instance is still running, fails.
ruby your_script.rb # => RuntimeError

Примечания

Простое требование самоцвета горец гарантирует, что только один экземпляр этого скрипта нельзя запустить снова. Если вы попытаетесь запустить его снова это вызовет RuntimeError.

Другие вопросы по теме