Angesichts der Häufigkeit würde ich normalerweise einen Daemon (Server) schreiben, der hübsch zwischen Jobläufen wartet (d. H. sleep()
) anstatt zu versuchen, Cron für ziemlich feinkörnigen Zugriff zu verwenden.
Falls notwendig, auf Unix/Linux-Systemen können Sie es von /etc/inittab
(oder Ersatz) ausführen, um sicherzustellen, dass es immer ausgeführt wird und automatisch neu gestartet wird, wenn der Prozess beendet wird oder stirbt.
Added: (und einige irrelevant Sachen entfernt)
Die immer vorhanden (Laufen, aber vor allem im Leerlauf) Daemon Ansatz den Vorteil der Beseitigung der Möglichkeit der gleichzeitigen Instanzen des Skripts durch cron wird gestartet hat automatisch .
Es bedeutet jedoch, dass Sie für die korrekte Verwaltung der Zeit verantwortlich sind, z. B. im Fall einer Überlappung (d. H. Ein vorheriger Lauf läuft noch, während ein neuer Auslöser auftritt). Dies kann Ihnen bei der Entscheidung helfen, ob Sie einen Forking-Daemon oder ein Design ohne Forking verwenden möchten. Threads bieten in diesem Szenario keinen Vorteil, so dass ihre Verwendung nicht berücksichtigt werden muss.
Dies beseitigt nicht die Möglichkeit, mehrere Prozesse laufen zu lassen, aber das ist ein häufiges Problem mit vielen Daemons. Die typische Lösung besteht in der Verwendung eines Semaphors, z. B. einer gegenseitig ausschließenden Sperre für eine Datei, um zu verhindern, dass eine zweite Instanz ausgeführt wird. Die Dateisperre wird automatisch vergessen, wenn der Prozess endet, so dass im Falle einer abnormalen Beendigung (z. B. Stromausfall) keine Säuberung der Sperre selbst notwendig ist.
Ein Ansatz unter Verwendung von Fcntl Modul und unter Verwendung eines Perl sysopen
mit einer O_EXCL
Flag (oder O_RDWR | O_CREAT | O_EXCL
) war given by Greg Bacon. Die einzigen Unterschiede, die ich machen würde, sind das exklusive Sperren in den sysopen-Aufruf (d. H. Die von mir vorgeschlagenen Flags) und das Entfernen des redundanten flock
-Aufrufs. Oh, und ich würde die UNIX (& Linux FHS) Dateisystem-und Namenskonventionen von /var/run/daemonname.pid
folgen.
Ein anderer Ansatz wäre, djb's daemontools oder similar zu verwenden, um die Aufgabe zu "dämonisieren".
Welche Plattform reden Sie? * Nix? – weismat
Es läuft auf Linux –
http://blog.booking.com/highlander-daemons-without-daemons.html – stu42j