Определите, запущен ли скрипт ruby - PullRequest
5 голосов
/ 01 сентября 2008

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

Ответы [ 4 ]

9 голосов
/ 01 сентября 2008

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

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

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

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

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

1 голос
/ 25 июня 2015

Горец

Описание

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

Установка

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.

0 голосов
/ 01 сентября 2008

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

0 голосов
/ 01 сентября 2008

В Баш:

if ps aux | grep really_long_script.rb | grep -vq grep
then
    echo Script already running
else
    ruby really_long_script.rb
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...