Как обеспечить, чтобы задача rake выполнялась только процессом одновременно - PullRequest
4 голосов
/ 21 октября 2010

Я использую crontab для вызова рейка, например, каждые 3 часа

Я хочу убедиться, что когда crontab готов выполнить задачу rake это может проверить, что задача граблей работает. если это так, не выполняйте.

как это сделать. спасибо.

Ответы [ 3 ]

18 голосов
/ 03 февраля 2012

Я оставлю это здесь, потому что я думаю, что это полезно:

task :my_task do
    pid_file = '/tmp/my_task.pid'
    raise 'pid file exists!' if File.exists? pid_file
    File.open(pid_file, 'w'){|f| f.puts Process.pid}
    begin
        # execute code here
    ensure
        File.delete pid_file
    end
end
3 голосов
/ 21 октября 2010

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

Что-то вроде RAA может помочь, но я не использовал его, так что, возможно, нет.

Вы также можете использовать файл PID. У вас где-нибудь будет файл, содержащий идентификатор процесса Rake-процессов. Перед запуском rake вы читаете PID из этого файла и смотрите, запущен ли процесс; если это не так, запустите rake и запишите его PID в файл PID. При наличии граблей удалите файл PID. Вы хотите объединить это с блокировкой файла PID, если хотите быть очень строгим, но это зависит от вашей конкретной ситуации.

1 голос
/ 01 декабря 2016

Все, что вам нужно, это гем с именем pidfile .

Добавьте это в свой Gemfile:

gem 'pidfile', '>= 0.3.0'

И задача может быть:

desc "my task"
task :my_task do |t|
  PidFile.new(piddir: "/var/lock", pidfile: "#{t.name}.pid")
  # do something
end
...