2010-04-29 11 views
5

erfassen Ich habe einen Service-Daemon gestartet, indem Sie die Binärdatei (in C++ geschrieben) durch Skript-Datei rc5.d gespeichert.Wie pid eines Linux-Daemon von init.d

Aber ich bin mir nicht sicher, wie Sie die PID des Daemon-Prozesses erfassen und in der PID-Datei in /var/run/.pid speichern. Damit kann ich die PID zum Beenden nutzen. Wie kann ich das tun?

+0

Nicht so sicher, dass dies gehört auf SF verwenden. Es hört sich so an, als hätte er einen Service geschrieben und möchte ihn mit einem richtigen Init-Skript versenden. –

Antwort

8

Versuchen Sie start-stop-daemon(8) mit dem --pidfile Argument in Ihrem Init-Skript. Lassen Sie Ihr Programm seine PID an einen bestimmten Ort schreiben (normalerweise in einer Konfigurationsdatei festgelegt).

Worauf Sie achten müssen, sind veraltete PID-Dateien, zum Beispiel, wenn eine Sperrdatei über einen Neustart hinweg bestehen bleibt. Diese Logik wird am besten im Init-Skript selbst implementiert, daher die --exec-Option zu start-stop-daemon.

Wenn z. B. /var/run/foo.pid1234 ist und /proc/1234/exe nicht Ihr Dienst ist, ist die Sperrdatei veraltet und sollte ruhig entfernt werden, damit der Dienst normal gestartet werden kann.

So weit wie Ihre Anwendung geht, stellen Sie einfach sicher, dass der Speicherort der Sperrdatei konfigurierbar ist, und einige Mittel existieren, um dem Init-Skript mitzuteilen, wo es zu setzen ist.

Zum Beispiel: (Beispiel:/etc/default/foo):

PIDFILE=/var/run/foo.pid 
OTHEROPTION=foo 

dann in /etc/init.d/foo:

[ -f /etc/default/foo ] && . /etc/default/foo 

Wieder andere als auf die Schreib Datei konsequent, sollte diese ganze Logik außerhalb Ihrer Anwendung behandelt werden.

+0

@Tim Beitrag, aber diese Option überprüft nur, ob der Daemon gestartet werden soll oder nicht, wenn er bereits läuft. Ich möchte, gibt es eine Standardweise beim Schreiben der PID zu/var/run/ – Poorna

+0

@Sirish - Nur testen, um zu sehen, ob die Datei existiert, erstellen Sie es, wenn es nicht, schreiben Sie die PID und schließen Sie es. Wenn es existiert, besteht eine sehr gute Chance, dass der Server bereits läuft. Das Testen auf veraltete Sperrdateien ist im init-Skript wesentlich einfacher. –

+0

@Sirish - Meine Antwort aktualisiert, ich _think_ was Sie wollen? –

1

Wenn Sie den Port kennen, den das Programm geöffnet hat, verwenden Sie den Befehl fuser, um die PID zu ermitteln.

1

Sie könnten über mehr als einen Weg gehen:

  1. in Ihrem Programm verwendet getpid es zu einer konfigurierbaren Datei zu schreiben
  2. Verwenden $ (vielleicht in ENV suchen)! Nach dem Start des Programms (das für mich nicht, obwohl auf archlinux arbeiten: -?)
  3. Nach dem Start des Programms pidof
Verwandte Themen