Wie eine Harke Aufgabe, um sicherzustellen, nur einen Prozess zu einem Zeitpunkt ausgeführt werden
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.
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