2016-04-04 5 views
0

Also hier bin ich mit meinem CRON-Aufruf an eine nodeJS-Anwendung. Derzeit gibt es keine Garantie, dass mein Skript zu einem bestimmten Zeitpunkt nicht mehrmals ausgeführt wird. Ich möchte, dass das Skript beendet wird, wenn es bereits ausgeführt wird.NodeJS Semaphor-Modul: Wie funktioniert es?

Semaphores sind die übliche Weise, es zu tun. Da ich relativ neu zu NodeJS bin, wollte ich ein vorhandenes Modul, wenn möglich, studieren und implementieren.

So fand ich semaphore for node, scheinbar die beliebteste vorgefertigte Lösung für Knoten. Allerdings ist die Dokumentation sehr spärlich, und den Code zu studieren gibt mir Kopfschmerzen:

https://github.com/abrkn/semaphore.js/blob/master/lib/semaphore.js

Ich dachte, das Modul eine Art von Datei verwenden würde zu wissen, ob der Prozess bereits ausgeführt wird, aber es nutzt global zu speichern diese Information. Wie ist das? Das würde sicher verhindern, dass zwei Unterskripte gleichzeitig in einem einzigen CRON-Aufruf laufen, aber das würde zwei verschiedene Aufrufe von CRON nicht verhindern, oder?

Oder ist es möglich, dass global zwischen allen laufenden NodeJS-Aufgaben geteilt wird?

EDIT:

ich genau habe, dass dieser App nicht eine HTTP-Anwendung ist, es ist nur eine Sammlung von CRONed Skripten. Also vielleicht ist das Semaphor-Modul nicht einmal die richtige Richtung, da es anscheinend mit createServer() verwendet werden sollte.

+0

I plain old pid-Dateien für diese verwenden würde. – georg

+0

Im Beispiel: sieht so aus, dass das Semaphor-Modul die Eingabe einer anderen Anfrage blockiert, während die Arbeit an einer teuren Aufgabe so aussieht, als würde sie die Ereignisschleife nicht blockieren. Vielleicht brauchen Sie in Ihrem Fall ein anderes Modul. –

+0

Warum verwenden Sie Cron mit Knoten überhaupt? Sie können einfach [setTimeout] (https://nodejs.org/docs/v0.6.1/api/timers.html) verwenden und Ihre Skripte so programmieren, dass sie nur von 'node.js' abhängen, die ihre Ausführung planen. – Mjh

Antwort

1

Sie können den flock Befehl, die den gleichzeitigen Zugriff auf eine Ressource, zum Beispiel sperrt:

* * * * * /usr/bin/flock -w 0 /path/to/cron.lock /usr/bin/node /path/to/script.js 

Der Moment Herd beginnt, sperrt es die Lock-Datei, die Sie in dem Befehl angeben. Flock ist also ein ziemlich guter Weg, um zu verhindern, dass sich Cronjobs überschneiden, indem ein zusätzliches Kommandozeilenwerkzeug verwendet wird.

Es gibt eine gute Erklärung an: Ihr Mann Seite oder http://man7.org/linux/man-pages/man2/flock.2.html

+0

Es ist genau das, was ich brauche! Vielen Dank. – Zephyr

+0

Ich hatte jedoch eine Nebenfrage: Wenn die Aufgabe beendet ist, bleibt die Datei '* .lock' an ihrem Platz, ist das normal? Trotzdem funktioniert 'flock' wie erwartet. – Zephyr