Как я удостоверяюсь, что только один экземпляр сценария Ruby работает за один раз?

См. Описание Mozilla с примером: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video

8
задан the Tin Man 17 March 2011 в 03:48
поделиться

6 ответов

Хотя это непосредственно не отвечает на Ваш вопрос, на вашем месте я, вероятно, записал бы сценарий демона (Вы могли использовать http://daemons.rubyforge.org/),

У Вас мог быть свой индексатор (принимающий его indexer.rb) быть выполненными через сценарий обертки, названный сценарием/индексом, например:

require 'rubygems'
require 'daemons'

Daemons.run('indexer.rb')

И Ваш индексатор может сделать, почти то же самое, кроме Вас указывают интервал сна

loop do
   # code executing your indexing 

   sleep INDEXING_INTERVAL
end

Это - то, как обычно функционируют процессоры задания в тандеме с сервером очереди.

3
ответ дан 5 December 2019 в 04:52
поделиться

Если Ваш крон использования, могло бы быть легче сделать что-то вроде этого в сценарии оболочки, который называет крон:

#!/usr/local/bin/bash
#

if ps -C $PROGRAM_NAME &> /dev/null ; then
   : #Program is already running.. appropriate action can be performed here (kill it?)
else
   #Program is not running.. launch it.
   $PROGRAM_NAME
fi
2
ответ дан 5 December 2019 в 04:52
поделиться

Существует lockfile драгоценный камень для точно этой ситуации. Я использовал его прежде, и это очень просто.

3
ответ дан 5 December 2019 в 04:52
поделиться

Вы могли создать и удалить временный файл и проверку на существование этого файла. Проверьте ответ на этот вопрос: один сценарий оболочки экземпляра

3
ответ дан 5 December 2019 в 04:52
поделиться

Разве Вы не можете добавить File::LOCK_NB к своей блокировке, для создания этого неблокированием (т.е. это перестало работать, если это не может получить блокировку),

Это работало бы в C, Perl и т.д.

0
ответ дан 5 December 2019 в 04:52
поделиться

Хорошо, отделываясь от примечаний от указателя @shodanex, вот то, что я имею. Я rubied это немного (хотя я не знаю о сенсорном аналоге в Ruby).

tmp_file = File.expand_path(File.dirname(__FILE__)) +  "/indexer.lock"
if File.exists?(tmp_file)
  puts "quitting"
  exit
else
  `touch #{tmp_file}`
end

.. do stuff ..

File.delete(tmp_file)
1
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: