Einfache Methode zur Daemonisierung in CentOS 5.4

15781
Saif Bechan

Ich weiß, dass es ein Programm namens upstart gibt, mit dem kleine Daemons einfach erstellt werden können. Ich kann dieses Programm nicht auf CentOS konfigurieren. Ich bekomme alle möglichen Fehler bezüglich pkg-congfig, libnih und dbus.

Ich arbeite an einer node.ja-Anwendung, und dies ist ein schwieriger Start und Stopp, daher möchte ich einen Deamon erstellen, der das Starten und Stoppen erleichtert.

Update 1
Ich werde ein kleines Beispiel geben, was ich für dieses Projekt brauche. Ich hoffe, jemand kann dabei helfen.

Um die Anwendung node.js zu starten, muss ich SSH eingeben:

# node /path-to-file/filename.js 

Wenn ich nun das Terminal einfriere, muss ich STRG + Z (pc) drücken, um die Eingabe wiederherzustellen.

Wenn ich nun etwas in der Datei geändert habe, muss ich sie erneut laden

Ich muss einfach:

# killall -9 node 

Dadurch werden alle Knotenanwendungen beendet, die ausgeführt werden

Als nächstes muss ich das Skript erneut starten

# node /path-to-file/filename.js 

Ich möchte nur tippen

# myapp restart 

Und alles ist erledigt. Diese Art von Setup würde mir viel Zeit sparen

Update 2
Ich habe ein Programm namens monit gefunden. Dies funktioniert gut und startet die Anwendung automatisch im Falle eines Absturzes, was gut ist. Es hat auch eine schöne Weboberfläche, die auch praktisch ist.

ich kann tippen

# monit myapp start(start/stop/restart) 

Das funktioniert gut. Es gibt nur einen Nachteil, und dies ist ein großer Nachteil. Wenn ich die myapp-Anwendung starte, werden die Fehler beim Kompilieren von node.js nicht angezeigt. Wenn es nicht startet, weiß ich nicht, was der Grund ist. Ich muss den gesamten '# node /path-to-file/filename.js' erneut eingeben, um den Fehler zu überprüfen.

2

5 Antworten auf die Frage

10
wazoox

Sie brauchen wirklich nichts Besonderes, um einen Daemon herzustellen. Jedes Programm in jeder Sprache kann sich selbst "daemonisieren". Alternativ können Sie ein vorhandenes Programm mit einem kleinen Shell-Script-Wrapper dämonisieren (beispielsweise kann der Programmstarter /etc/init.d dies erledigen).

Normalerweise hat ein Dämon die folgenden Eigenschaften:

  • Arbeitsverzeichnis muss sein /
  • STDIN muss / dev / null sein
  • STDOUT und STDERR müssen entweder / dev / null oder Protokolldateien sein
  • Die übergeordnete ID sollte init (1) sein. Sie kann leicht erreicht werden, indem Sie den ursprünglichen Ausgang verlassen.

Update 1

Monit kümmert sich im Wesentlichen um die blutigen Details, die ich hier gegeben habe. Für die Details zu STDIN / STDOUT, / dev / null usw. sind dies grundlegende Unix-Konzepte. Ich denke, Sie müssen sich früher oder später damit befassen. Siehe zum Beispiel diese Unix-Einführung .

Update 2

Ein Shell-Skript, das ein Programm dämonisiert, würde wie folgt aussehen. Beachten Sie, dass dies nicht für Programme funktioniert, die im Vordergrund bleiben.

#!/bin/sh  DAEMON=/some/program/to/run PARAMETERS="parameters to my program" LOGFILE=/var/log/somefile.log  start() { echo -n "starting up $DAEMON" RUN=`cd / && $DAEMON $PARAMETERS > $LOGFILE 2>&1`  if [ "$?" -eq 0 ]; then echo "Done." else echo "FAILED." fi }  stop() { killall $DAEMON }  status() { killall -0 $DAEMON  if [ "$?" -eq 0 ]; then echo "Running." else echo "Not Running." fi }  case "$1" in start) start ;;  restart) stop sleep 2 start ;;  stop) stop ;;  status) status ;;  *) echo "usage : $0 start|restart|stop|status" ;; esac  exit 0 
Ok, ich bin neu in Linux, daher weiß ich nicht, was das alles ist. Können Sie mir vielleicht ein kleines Beispiel geben, wie ich das erreichen kann? Ich werde die Frage ein wenig bearbeiten und vielleicht können Sie mir bei dieser Art von Setup helfen, weil ich keine Ahnung habe, was stdin usw. ist. Saif Bechan vor 14 Jahren 0
Ok, im Grunde erstelle ich einfach eine Datei (myapp) und füge einfach #! / Bin / sh am Anfang der Zeile hinzu. Und wenn ich den Dateinamen eingebe, wird er als Programm ausgeführt. Saif Bechan vor 14 Jahren 0
Danke, das bringt mich in das Programm. Danke für die Hilfe. Antwort akzeptiert Saif Bechan vor 14 Jahren 0
Gute Antwort, obwohl ich hinzufügen möchte, dass der übergeordnete Prozess SIGCHLD ignorieren sollte, damit init den verwaisten Prozess sofort erbt und keinen Zombie in der Prozesstabelle hinterlässt. Dies kann in Skripten mit dem NOHUP-Befehl problemlos durchgeführt werden, binden Sie jedoch, wie Sie bereits sagten, alle 3 Standard-E / A an. kmarsh vor 14 Jahren 0
Das funktioniert super. Ich habe jetzt volle Kontrolle über den Start und das Ende der Ausführung. Das spart mir viel Zeit. Saif Bechan vor 14 Jahren 0
Gern geschehen :) Sie können dieses Skript als /etc/init.d/yourapp verwenden und Ihre Anwendung ab sofort als vollwertigen Dienst verwenden. Fehlermeldungen gehen in die Protokolldatei (/ var / log / what). wazoox vor 14 Jahren 0
Das einfache Schließen von stdin und das Hintergrunding funktioniert ebenfalls: `` myprog 1 <& - & ``. Jetzt hast du einen Dämon. w00t vor 12 Jahren 1
@woot, chdir to / root ist unerlässlich, um das unbeabsichtigte Abhängen von etwas nicht zu verhindern. wazoox vor 12 Jahren 0
3
CGSMCMLXXV

Um ein Skript in einer nicht interagierenden Sitzung zu starten, verwenden Sie nohup(es wird Ihren Prozess in einem eigenständigen Begriff trennen).

Um Ihr Skript ausführbar zu machen, verwenden Sie chmod ugoa+x <script_name>.

Der letzte Punkt, nicht verwenden #!/bin/bashoder #!/bin/shweil Sie nicht wissen, ob sich darin befindet /bin; Versuchen Sie es mit #!/usr/bin/env bash(oder sh), was den Prozess zwingt, in der bash (sh) -Umgebung zu arbeiten. Beachten Sie, dass envdie ganze Zeit in vorhanden ist /usr/binund alle Umgebungspfade (BASH, SH, TCSH ...) darin registriert sind.

@slhck Sie haben eigentlich nichts bearbeitet, Sie haben genau die gleichen Wörter aufgeschrieben. Ich werde dies für die Aufmerksamkeit der Moderation markieren. Saif Bechan vor 12 Jahren 0
@Saif slhck hat diese Wörter in Monospace-Codeelemente geändert - also "#! / Bin / bash" anstelle von #! / Bin / bash - und Absatzabschnitte hinzugefügt. Der Beitrag sieht optisch leichter zu analysieren aus, ich sehe nichts falsch an dieser Bearbeitung. DMA57361 vor 12 Jahren 1
@Saif Wie DMA sagte, das war die Absicht. Wenn Sie ein Problem damit haben, erklären Sie sich bitte auf [Meta]… slhck vor 12 Jahren 0
2
HughE

If you are trying to daemonize a program that doesn't have a daemon mode then you can use daemonize. There are RPM packages for it in the repoforge repository.

1
Dennis Williamson

Das stdout eines Daemons geht nicht zum Terminal. Wenn Sie einfach den Neustart Ihres Programms automatisieren möchten, würde ich empfehlen, ein Shellskript zu schreiben, um die genauen Schritte auszuführen, die Sie jetzt manuell ausführen.

Bearbeiten:

Hier ist ein einfaches Beispiel-Shell-Skript:

#!/bin/sh do-start-stuff () { stuff-to-do }  do-stop-stuff () { stuff-to-do }  case "$1" in start) do-start-stuff ;; stop) do-stop-stuff ;; restart) do-stop-stuff do-start-stuff ;; esac 
Kannst du mich in eine Richtung weisen, wie man ein Shell-Skript erstellt? Saif Bechan vor 14 Jahren 0
Wenn ich eine Datei mit den genauen Schritten, die ich mache, erstelle, wie wird das Skript wissen, ob ich es starten oder stoppen möchte? Oder kann ich mit if-Anweisungen in der Datei arbeiten. Saif Bechan vor 14 Jahren 0
Ja, Sie können 'if' und andere Aussagen haben. Siehe meine Bearbeitung. Dennis Williamson vor 14 Jahren 0
Vielen Dank für die Hilfe, ich werde den Code untersuchen und bekomme jetzt die Grundidee. Danke für die Hilfe. +1 für die Antwort. Die Antwort von Wazoox war etwas detaillierter, deshalb habe ich sie akzeptiert. Saif Bechan vor 14 Jahren 0
0
Journeyman Geek

Wenn Sie eine einzelne App ausführen möchten, die an die Konsole ausgegeben wird, aber nicht möchten, dass Ihr Terminalbenutzerbildschirm angezeigt wird, trennen Sie ihn. Geben Sie den Bildschirm ein, drücken Sie die Eingabetaste, starten Sie Ihre App normal und drücken Sie zum Beenden die Taste F6. screen -r kehrt zur App zurück