Как ограничить количество одновременных экземпляров одного и того же сценария Ruby? - PullRequest
10 голосов
/ 12 марта 2012

В Ruby 1.9.x, что может быть простым способом не позволить моему сценарию Ruby снова запуститься или дождаться завершения предыдущего экземпляра? **

Я надеюсь избежать беспорядочной блокировки файлов или проверки таблицы процессов.

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

** Позже я мог бы добавить функциональность тайм-аута или ограничить N экземплярами, или использовать более одной глобальной блокировки (по одному на общесистемный ресурс, который должен иметь не более одного экземпляра).

Ответы [ 2 ]

5 голосов
/ 13 марта 2012

Этот очень короткий код будет зависать до тех пор, пока файл блокировки в / tmp, названный в честь вашего скрипта, будет заблокирован исключительно:

File.open("/tmp/#{File.basename $0}.lock", File::RDWR|File::CREAT, 0644).flock(File::LOCK_EX)

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

timeout 1m ./myrubyscript.rb

из сценария обтекания bash , если я, например, стану нетерпеливым. (В этом примере myrubyscript.rb прекратит работу через 1 минуту, независимо от того, получит ли он блокировку файла и продолжит ли делать то, что было написано.)

2 голосов
/ 12 марта 2012

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

Но, если вы хотите проверить в скрипте, посмотритедля файла семафора в известном месте.Если он существует и не находится в заданном временном окне, которое вписывается в ваше окно запуска, то удалите файл и создайте новый.Если оно находится в вашем временном окне, то выйдите.

Вы можете использовать блокировку файла или сохранение временных меток в файле, или много других проверок, если вы не запускаете с использованием механизма типа cron.У каждого подхода есть свои плюсы и минусы.

Вы захотите перехватывать прерывания, чтобы при выходе из Control-C вы тоже стирали этот файл.

Прочтите соответствующие вопросы направо.Хотя они охватывают различные другие языки, предлагаемые ответы помогут понять проблемы и возможные способы обхода их на всех языках.

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