Rails 关于 rake 任务的控制

he4112043 · 2015年07月31日 · 最后由 he4112043 回复于 2016年11月22日 · 1876 次阅读

比如说我写了一个每过 1 分钟就会执行一次的脚本,但是在某个时刻这个脚本一分钟都还没有执行完,那么这个脚本就会同时两个在执行,如果脚本在操作数据库就很容易崩掉。 请问:怎么实现控制这个 rake 如果在执行就不会再执行了??

将进程号写到文件里,然后每次启动任务的时候都首先检查一遍是否有 pid 文件,并且里边的进程号是否有在运行,有的话就退出,没有就将新的进程号写入。每次任务完成之后删除进程号。代码是(未经验证,你自己要调试):

task :task_name => :environment do
  exit if another_process_running?
  File.open("path/to/your/task.pid", 'w') { |f| f.write(Process.id)}  # 将进程号写进文件,方便其他进程用于检查

  # 写完进程号,就可以放心的开始你的其他工作了

  # 最后清除 pid 文件内容,或者删除也可以
  File.open("path/to/your/task.pid", 'w') {|file| file.truncate(0) }
end

def another_process_running?
  pid = `cat #{Rails.root.join("path/to/your/task.pid")}`.to_i
  pid > 0 && process = `ps -p #{pid} | awk 'NR>1'`.present?  # pid 存在,并且有正在运行的对应进程
end

你好,请问你们公司招 ruby 初级吗?我是今年刚毕业的应届生,做过几个月的 ror,在一篇帖子上说您在中电软件园做 ruby,想找一份 ruby 的工作。

#2 楼 @Talon 不招,公司换技术方案了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号