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 !

1voto

Paul Tomblin Punkte 172816

Zusätzlich zu dem, was Ori bereits gesagt hat, verwenden einige Linux-Distributionen immer noch initab, aber Ubuntu und möglicherweise andere sind auf /etc/event.d umgestiegen. Sie legen dort eine Datei an (kopieren und bearbeiten Sie eine der vorhandenen) und starten dann den Daemon mit "sudo start ssh_tunnel" oder wie auch immer Ihre Datei heißt.

Wenn Sie dann einen Neustart benötigen, können Sie ihn einfach mit einem Signal abschalten, und das System startet ihn neu. Oder es könnte selbst entscheiden, dass es Zeit für einen Neustart ist, indem es "exit(0);" oder ähnliches aufruft.

1voto

Rob K Punkte 8547

exec*() allein in der ursprünglichen Befehlszeile sollte ausreichen. Sie können das fork wahrscheinlich weglassen, denn dann laufen zwei Kopien, die Sie nicht brauchen, und die Originalkopie muss dann beendet werden.

Schauen Sie sich aber auch inittab und event.d an, um zu sehen, ob es das, was Sie brauchen, auf eine bessere Art und Weise tun kann.

1voto

bstpierre Punkte 28260

Eine dritte Möglichkeit zu dem, was Ori und Paul vorgeschlagen haben, wäre die Verwendung von daemontools. Es ist portabler, wenn auch weniger wahrscheinlich, dass es verfügbar ist. Sie erstellen ein Skript mit dem Namen /service/foo/run und daemontools wird Ihren Dienst neu starten, sobald er beendet wird.

http://cr.yp.to/daemontools.html

0voto

Martin York Punkte 245363

Sehen Sie sich die Manpage für inittab an.

Sie beschreibt, wie das System Ihre Prozesse automatisch neu startet, wenn es stirbt (respawn).

Wenn dies korrekt eingerichtet ist, muss Ihr Dienst nur noch beendet werden, und das System wird den Neustart (Respawn) automatisch für Sie übernehmen.

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