我使用 crontab 在某个时间调用 rake 任务,例如:每 3 小时
我想确保当 crontab 准备好执行 rake 任务时,它可以检查 rake 任务是否正在运行。如果是这样,请不要执行。
这该怎么做。谢谢。
我将把它留在这里,因为我认为它很有用:
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
您可以为此使用锁定文件。任务运行时,尝试获取锁,如果获得锁则运行 rake 任务。如果你没有得到锁,那么就不要运行 rake;您可能还想在某处记录错误或警告,或者您的 rake 任务可能会在您知道之前几周或几个月内没有做任何事情。当 rake 退出时,解锁锁定文件。
像RAA这样的东西可能会有所帮助,但我没有使用它,所以可能不会。
您也可以使用 PID 文件。您将在某处拥有一个包含 rake 进程进程 ID 的文件。在启动 rake 之前,您从该文件中读取 PID 并查看进程是否正在运行;如果不是,则启动 rake 并将其 PID 写入 PID 文件。当 rake 存在时,删除 PID 文件。如果您想非常严格,您可能希望将此与锁定 PID 文件结合起来,但这取决于您的具体情况。
您只需要一个名为pidfile的 gem 。
将此添加到您的 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