Ich hätte gerne einen Daemonizer, der aus einem beliebigen, generischen Skript oder Befehl einen Daemon machen kann .
Es gibt zwei häufige Fälle, mit denen ich mich befassen möchte:
Ich habe ein Skript, das für immer laufen sollte. Wenn es jemals stirbt (oder beim Neustart), starten Sie es neu. Lassen Sie niemals zu, dass zwei Kopien gleichzeitig ausgeführt werden (erkennen Sie, ob eine Kopie bereits ausgeführt wird, und starten Sie sie in diesem Fall nicht).
Ich habe ein einfaches Skript oder einen Befehlszeilenbefehl, den ich für immer wiederholt ausführen möchte (mit einer kurzen Pause zwischen den Läufen). Lassen Sie auch hier nicht zu, dass zwei Kopien des Skripts gleichzeitig ausgeführt werden.
Natürlich ist es trivial, in Fall 2 eine "while (true)" - Schleife um das Skript zu schreiben und dann eine Lösung für Fall 1 anzuwenden, aber eine allgemeinere Lösung löst Fall 2 direkt, da dies für das Skript in Fall 1 als gilt gut (Sie möchten vielleicht nur eine kürzere oder keine Pause, wenn das Skript nicht jemals sterben soll (natürlich, wenn das Skript es wirklich tut) die Pause keine Rolle, nie stirbt).
Beachten Sie, dass die Lösung beispielsweise nicht das Hinzufügen von Dateisperrcode oder PID-Aufzeichnung zu den vorhandenen Skripten umfassen sollte.
Insbesondere möchte ich ein Programm "daemonize", das ich gerne ausführen kann
% daemonize myscript arg1 arg2
oder zum Beispiel
% daemonize 'echo `date` >> /tmp/times.txt'
Dadurch würde eine wachsende Liste von Daten an times.txt angehängt. (Beachten Sie, dass wenn das zu dämonisierende Argument ein Skript ist, das für immer wie in Fall 1 oben ausgeführt wird, Daemonize immer noch das Richtige tut und es bei Bedarf neu startet.) Ich könnte dann einen Befehl wie oben in mein .login einfügen und / oder cron es stündlich oder minutiös (je nachdem, wie besorgt ich war, dass es unerwartet sterben würde).
NB: Das Daemonize-Skript muss sich die Befehlszeichenfolge merken, die es dämonisiert, damit beim erneuten Dämonisieren derselben Befehlszeichenfolge keine zweite Kopie gestartet wird.
Außerdem sollte die Lösung idealerweise sowohl unter OS X als auch unter Linux funktionieren, aber Lösungen für das eine oder andere sind willkommen.
EDIT: Es ist in Ordnung, wenn Sie es mit aufrufen müssen sudo daemonize myscript myargs
.
(Wenn ich daran denke, dass alles falsch ist oder es schnelle und schmutzige Teillösungen gibt, würde ich das auch gerne hören.)
PS: Falls es nützlich ist, hier ist eine ähnliche Frage speziell für Python.
Und diese Antwort auf eine ähnliche Frage scheint eine nützliche Redewendung für eine schnelle und schmutzige Dämonisierung eines beliebigen Skripts zu sein: