Wie eine Harke Aufgabe, um sicherzustellen, nur einen Prozess zu einem Zeitpunkt ausgeführt werden

StackOverflow https://stackoverflow.com/questions/3983883

  •  09-10-2019
  •  | 
  •  

Frage

Ich benutze crontab invoke Rake Aufgabe zu einem bestimmten Zeitpunkt zum Beispiel: alle 3 Stunden

Ich möchte sicherstellen, dass, wenn crontab bereit, die Rake Aufgabe auszuführen es kann das prüfen Rake-Task ausgeführt wird. wenn es so nicht ausgeführt werden soll.

, wie dies zu tun. Dank.

War es hilfreich?

Lösung

Sie können eine Sperrdatei für diese. Wenn die Task ausgeführt wird, versuchen Sie, das Schloss zu greifen und den Rechen Aufgabe ausführen, wenn Sie die Sperre erhalten. Wenn Sie nicht über die Sperre erhalten, dann nicht laufen Rechen; Sie mögen vielleicht irgendwo auch einen Fehler oder eine Warnung protokollieren oder Sie können mit Ihrer Rake Aufgabe nicht für Wochen etwas zu tun, am Ende oder Monate, bevor Sie darüber wissen. Wenn Rake-Exits, die Sperrdatei zu entsperren.

So etwas wie RAA könnte helfen, aber ich habe es nicht so vielleicht nicht verwendet .

Sie können auch eine PID-Datei verwenden. Sie würden eine Datei irgendwo haben, die den Rechen Prozesse Prozess-ID hält. Vor Beginn der Harke, lesen Sie die PID aus dieser Datei und sehen, ob der Prozess ausgeführt wird; wenn es nicht dann Rake starten und seine PID auf die PID-Datei schreiben. Wenn Rechen vorhanden ist, löschen Sie die PID-Datei. Sie würden wollen, dass diese auf der PID-Datei mit Sperren kombinieren, wenn Sie wirklich streng sein wollen, aber dies hängt von Ihrer persönlichen Situation.

Andere Tipps

Ich werde das hier verlassen, weil ich denke, es ist sinnvoll:

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

Alles, was Sie brauchen, ist ein Juwel namens pidfile .

Fügen Sie diese auf Ihre Gemfile:

gem 'pidfile', '>= 0.3.0'

Und könnte die Aufgabe sein:

desc "my task"
task :my_task do |t|
  PidFile.new(piddir: "/var/lock", pidfile: "#{t.name}.pid")
  # do something
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top