2010-10-21 2 views
4

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

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

как сделать. Благодарю.

ответ

3

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

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

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

+0

спасибо очень много. – www

+2

'flock' вы можете попробовать:] – gonjay

18

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

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 
+0

должен попытаться использовать стая ... – Stephen

1

Все, что вам нужно, это драгоценный камень с именем 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 
Смежные вопросы