题
我使用crontab在某个时候调用耙子任务:每3小时
我想确保当crontab准备执行耙子任务时,可以检查耙子任务正在运行。如果是这样,请不要执行。
这个怎么做。谢谢。
解决方案
您可以为此使用锁定文件。任务运行时,如果您获得锁定,请尝试抓住锁定并运行Rake任务。如果您没有锁定,请不要运行耙子;您可能也需要在某个地方记录错误或警告,或者您最终可以完成耙子任务,然后几周或几个月才知道。耙子退出时,解锁锁定文件。
就像是 RAA 可能会有所帮助,但我没有使用过,所以也许没有。
您也可以使用PID文件。您将在某个地方保存着耙子进程ID的文件。在启动Rake之前,您会从该文件中读取PID,并查看该过程是否正在运行;如果不是,则启动耙子并将其PID写入PID文件。耙子存在时,删除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
您所需要的只是一颗名为的宝石 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
不隶属于 StackOverflow