3 Stimmen

Wie bringe ich einen Prozess dazu, sich unter Linux neu zu laden?

Ich habe einen in C++ geschriebenen Dienst, sagen wir foo, der als Root läuft. Es gibt das übliche Skript, /etc/init.d/foo start|stop|restart.

Zu bestimmten Zeiten muss foo sich selbst neu laden. Normalerweise, wenn ein Upgrade abgeschlossen ist. Aber Dinge zu tun wie:

system("/etc/init.d/foo restart")

funktioniert nicht, da, sobald der Neustart foo beendet, der system()-Aufruf offensichtlich ebenfalls beendet wird und das Neustart-Skript nie zu Ende ausgeführt wird.

Gibt es einen anderen Aufruf, den ich anstelle von system() verwenden kann, der asynchron als ein Geschwister des aufrufenden Prozesses ausgeführt wird, anstatt ein synchrones Kind zu erstellen?

Merci !

9voto

dirkgently Punkte 104289

Haben Sie schon einmal über die exec[*] Familie noch nicht? Hier ist eine. execve .

9voto

Ori Pessach Punkte 6700

Sie können es in inittab ablegen und init den Neustart des Prozesses überlassen, wenn er aus irgendeinem Grund beendet wird. Das würde auch für einen automatischen Neustart sorgen, wenn Ihr Prozess zufällig abstürzt oder assert() oder anderweitig unerwartet beendet wird.

Um Ihren Anwendungsfall zu lösen, würde sich der Prozess dann einfach selbst beenden.

5voto

Eric Petroelje Punkte 58501

Wie wäre es mit fork() gefolgt von exec()?

2voto

timday Punkte 24269

Erwägen Sie die Umsetzung

/etc/init.d/foo reload

für Ihren Daemon (ziemlich standardmäßig, wie ein Grep auf meinem Debian-System zeigt).

Dies geschieht in der Regel durch Senden eines SIGHUP-Signals an den Prozess; der Daemon sollte einen Signalhandler haben, der dieses Signal abfängt und die Konfiguration neu lädt.

Wenn der Prozess weiß, dass er neu geladen werden muss, kann er sich einfach selbst melden.

Wenn Sie wirklich neu starten müssen, um neue Bibliotheken zu erhalten, dann wählen Sie exec*()

1voto

Adam Rosenfield Punkte 373807

Kombinieren Sie die beiden bisherigen Antworten und verwenden Sie eine fork-exec .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X