Как обеспечить выполнение задачи rake только с одновременным запуском процесса

StackOverflow https://stackoverflow.com/questions/3983883

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Все, что вам нужно, это драгоценный камень по имени пид -файл.

Добавьте это в свой 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top