Как обеспечить выполнение задачи rake только с одновременным запуском процесса
Вопрос
Например, я использую 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