我使用crontab在某个时间调用rake任务,例如:每3小时
我想确保当crontab准备好执行rake任务时 它可以检查rake任务是否正在运行。如果它是这样不执行。
如何做到这一点。感谢。
答案 0 :(得分: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
答案 1 :(得分:3)
您可以使用锁定文件。任务运行时,如果获得锁定,请尝试抓住锁并运行rake任务。如果你没有锁,那就不要跑耙;你可能也想在某个地方记录错误或警告,或者在你知道它之前,你最终可能会在几周或几个月内没有做任何事情。当rake退出时,解锁锁定文件。
像RAA这样的东西可能会有所帮助,但我没有使用它,所以也许没有。
您也可以使用PID文件。你有一个文件存放rake进程进程ID。在开始rake之前,您从该文件中读取PID并查看进程是否正在运行;如果不是那么启动rake并将其PID写入PID文件。当rake存在时,删除PID文件。如果您想要非常严格,那么您希望将其与PID文件上的锁定相结合,但这取决于您的具体情况。
答案 2 :(得分: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