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

www*_*www 4 ruby linux rake rake-task

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

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

这该怎么做.谢谢.

pgu*_*rio 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
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 3

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

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

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

  • 你可以尝试“flock”:] (2认同)