如何确保 rake 任务一次只运行一个进程

发布于 2024-09-28 19:53:58 字数 131 浏览 8 评论 0原文

我使用 crontab 在某个时间调用 rake 任务,例如:每 3 小时

我想确保 crontab 准备好执行 rake 任务 它可以检查 rake 任务是否正在运行。如果是这样就不要执行。

如何做到这一点。谢谢。

I use crontab to invoke rake task at some time for example: every 3 hour

I want to ensure that when crontab ready to execute the rake task
it can check the rake task is running. if it is so don't execute.

how to do this. thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寂寞陪衬 2024-10-05 19:53:59

我将把它留在这里,因为我认为它很有用:

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

I'll leave this here because I think it's useful:

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
羅雙樹 2024-10-05 19:53:59

您可以为此使用锁定文件。任务运行时,尝试抢锁,如果拿到锁就运行rake任务。如果你没有获得锁,那么就不要运行 rake;您可能也想在某处记录错误或警告,否则您可能会在您意识到之前几周或几个月内您的 rake 任务没有执行任何操作。当 rake 退出时,解锁锁定文件。

RAA 这样的东西可能会有所帮助,但我没有使用过它,所以可能没有。

您还可以使用 PID 文件。您将在某个地方有一个文件来保存 rake 进程的进程 ID。在启动 rake 之前,您从该文件中读取 PID 并查看该进程是否正在运行;如果不是,则启动 rake 并将其 PID 写入 PID 文件。当rake存在时,删除PID文件。如果您想非常严格,您可以将其与锁定 PID 文件结合起来,但这取决于您的具体情况。

You could use a lock file for this. When the task runs, try to grab the lock and run the rake task if you get the lock. If you don't get the lock, then don't run rake; you might want to log an error or warning somewhere too or you can end up with your rake task not doing anything for weeks or months before you know about it. When rake exits, unlock the lock file.

Something like RAA might help but I haven't used it so maybe not.

You could also use a PID file. You'd have a file somewhere that holds the rake processes process ID. Before starting rake, you read the PID from that file and see if the process is running; if it isn't then start up rake and write its PID to the PID file. When rake exists, delete the PID file. You'd want to combine this with locking on the PID file if you want to be really strict but this depends on your particular situation.

忆离笙 2024-10-05 19:53:59

您所需要的只是一个名为 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

All you need is a gem named pidfile.

Add this to your Gemfile:

gem 'pidfile', '>= 0.3.0'

And the task could be:

desc "my task"
task :my_task do |t|
  PidFile.new(piddir: "/var/lock", pidfile: "#{t.name}.pid")
  # do something
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文