Hallo, Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten. Es geht um das Programm "ddclient" welches als Deamon läuft. Wie kann ich das realisieren? Vielen Dank für die Hilfe Gruß Alex
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht. Dazu kenn ich mich in Script Programmierung leider zu wenig aus :(
Macht genau was Du willst, (denke ich zumindest :)
Stefan
Gruß Alex
Alex Ascherl wrote:
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
while /bin/true ; echo "Dein Prozess"; sleep 1; done Ohne ps und grep, sollte aber gehen. Ersetze das echo "Dein Prozess" mit dem Startbefehl Deines Programs. Zu Risiken und Nebenwirkungen fragen Sie O'Reilly's 'Linux Server Hacks' oder ein Linuxbuch Ihres Vertrauens :) Stefan PS: Die init-Lösung ist besser.
Hallo, Am Fri, 20 Feb 2004, Stefan Waidele jun. schrieb:
Alex Ascherl wrote:
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
==== #!/bin/sh if ps ax | grep -q '[d]dclient'; then exit 0 else /pfad/zu/ddclient fi ==== Das script laesst du dann per cron laufen.
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Da gehoert aber mindestens noch ein 'trap' mit dazu. -dnh -- und *echte* Männer benutzen Linux -- wegen der langen Kommandozeilen ("Meine ist länger als deine!"). Dann muss man nicht mehr Krieg spielen, um zu zeigen, wie hart man ist. -- S. Lauterkorn in suse-talk
Hallo,
Am Fri, 20 Feb 2004, Stefan Waidele jun. schrieb:
Alex Ascherl wrote:
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
==== #!/bin/sh if ps ax | grep -q '[d]dclient'; then exit 0 else /pfad/zu/ddclient fi ====
Vielen Dank für das Script... Ich werde es testen. Gruß Alex
Hallo,
Am Fri, 20 Feb 2004, Stefan Waidele jun. schrieb:
Alex Ascherl wrote:
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
==== #!/bin/sh if ps ax | grep -q '[d]dclient'; then exit 0 else /pfad/zu/ddclient fi ====
Ich hab es ausprobiert, funktioniert aber leider nicht. Das Script startet aber den Befehl nicht wieder an. Pfad stimmt aber.. Kann da bitte nochmal jemand drübersehen. Danke Alex
Das script laesst du dann per cron laufen.
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Da gehoert aber mindestens noch ein 'trap' mit dazu.
-dnh
-- und *echte* Männer benutzen Linux -- wegen der langen Kommandozeilen ("Meine ist länger als deine!"). Dann muss man nicht mehr Krieg spielen, um zu zeigen, wie hart man ist. -- S. Lauterkorn in suse-talk
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Fri, 20 Feb 2004, Alex Ascherl schrieb:
Ich hab es ausprobiert, funktioniert aber leider nicht. Das Script startet aber den Befehl nicht wieder an.
Ist Absicht, wie ich ja schrieb, musst du das script per cron alle 5 min oder so starten, reicht ja wenn cron schlaeft, da muss man das nicht im script machen. Aber das '&' am Ende der Zeile, die ddclient aufruft hab ich vergessen. Also [..] else /pfad/zu/ddclient & fi -dnh -- "Da fragen 'se Norbert Blüm, aber der fracht sich auch nur 'was bin ich?'" -- Georg Schramm im Scheibenwischer
Hallo,
Am Fri, 20 Feb 2004, Alex Ascherl schrieb:
Ich hab es ausprobiert, funktioniert aber leider nicht. Das Script startet aber den Befehl nicht wieder an.
Ist Absicht, wie ich ja schrieb, musst du das script per cron alle 5 min oder so starten, reicht ja wenn cron schlaeft, da muss man das nicht im script machen.
Moment, soll ich Dein Script per Cron starten, oder ddclient ? Selbst wenn ich Dein Script händisch starte und vorher ddclient kille, dann wird ddclient durch Dein Script nicht wieder gestartet. Der Befehl ruht übrigens nach dem Aufruf immer 120 sec, bis es wieder ein neues Update macht
Aber das '&' am Ende der Zeile, die ddclient aufruft hab ich vergessen.
Also
[..] else /pfad/zu/ddclient & fi
Hilft auch nicht weiter. Ein einfacher Aufruf von ddclient geht automatisch als Daemon los. Gruß Alex
Hallo, Am Sat, 21 Feb 2004, Alex Ascherl schrieb:
Am Fri, 20 Feb 2004, Alex Ascherl schrieb:
Ich hab es ausprobiert, funktioniert aber leider nicht. Das Script startet aber den Befehl nicht wieder an.
Ist Absicht, wie ich ja schrieb, musst du das script per cron alle 5 min oder so starten, reicht ja wenn cron schlaeft, da muss man das nicht im script machen.
Moment,
soll ich Dein Script per Cron starten, oder ddclient ?
Das script! Ich zitiere dich: >Es geht um das Programm "ddclient" welches als Deamon läuft.
Selbst wenn ich Dein Script händisch starte und vorher ddclient kille, dann wird ddclient durch Dein Script nicht wieder gestartet.
?
Der Befehl ruht übrigens nach dem Aufruf immer 120 sec, bis es wieder ein neues Update macht
? Nebenbei bemerkt halte ich dein Vorgehen fuer weitgehend sinnfrei. Wie oft und wann aendert sich denn deine IP? Na? Ja? Genau, wenn du dich einwaehlst! Also ab mit dem ddclient-Aufruf in die ip-up.local bzw. dann als "ddclient -ip 127.0.0.1" in ip-down.local. -dnh -- It is impossible to make anything foolproof because fools are so ingenious. -- from the fortune file
Hallo,
Am Sat, 21 Feb 2004, Alex Ascherl schrieb:
Am Fri, 20 Feb 2004, Alex Ascherl schrieb:
Ich hab es ausprobiert, funktioniert aber leider nicht. Das Script startet aber den Befehl nicht wieder an.
Ist Absicht, wie ich ja schrieb, musst du das script per cron alle 5 min oder so starten, reicht ja wenn cron schlaeft, da muss man das nicht im script machen.
Moment,
soll ich Dein Script per Cron starten, oder ddclient ?
Das script! Ich zitiere dich:
>Es geht um das Programm "ddclient" welches als Deamon läuft.
Selbst wenn ich Dein Script händisch starte und vorher ddclient kille, dann wird ddclient durch Dein Script nicht wieder gestartet.
?
Der Befehl ruht übrigens nach dem Aufruf immer 120 sec, bis es wieder ein neues Update macht
?
Nebenbei bemerkt halte ich dein Vorgehen fuer weitgehend sinnfrei.
Wie oft und wann aendert sich denn deine IP? Na? Ja? Genau, wenn du dich einwaehlst!
Richtig, vor dem Rechner steht aber ein Firewall ... also muss ich auf dem Server ddclient starten welches sich bei checkip.dyndns.org die IP holt. DDCLIENT läuft nun als Daemon, OK, Falls aber meine DSL Verbindung mal längere Zeit nicht zur Verfügung steht, stirbt der Daemon leider ab. Genau das will ich per Script abprüfen lassen. Also, zu Deinem Script. Ich bastel mir also ein Script aus Deinen Bash Befehlen. Zum Test kille ich ddclient. Um nun zu sehen, ob Dein Script läuft starte ich es mit ./ddclient-check (so habe ich es genannt). Nun ist ddclient ja nicht aktiv. Dein Script sollte es aber nach Möglichkeit erkennen und ddclient wieder starten. Genau das tut es leider nicht. Noch Ideen? Gruß Alex
Alex Ascherl wrote:
[...] zu Deinem Script.
David Haller schrieb (viel) früher:
#!/bin/sh if ps ax | grep -q '[d]dclient'; then exit 0 else /pfad/zu/ddclient & fi
Ich bastel mir also ein Script aus Deinen Bash Befehlen. Zum Test kille ich ddclient. Um nun zu sehen, ob Dein Script läuft starte ich es mit ./ddclient-check (so habe ich es genannt).
Du musst es anders nennen. Die Abfrage testet ob ein Prozess läuft, in dessen Namen 'dclient' vorkommt. Wenn das Skript 'dclient' im Namen hat, dann ist es (mit sich selbst :) zufrieden und hat keinen grund den Server zu starten.
Nun ist ddclient ja nicht aktiv. Dein Script sollte es aber nach Möglichkeit erkennen und ddclient wieder starten. Genau das tut es leider nicht.
Wenn Du es 'danke-david-haller.sh' nennst, dann sollte es klappen :)
Noch Ideen?
Viele, aber die meisten OT :) Stefan
On Saturday 21 February 2004 17:16, Stefan Waidele jun. wrote:
Ich bastel mir also ein Script aus Deinen Bash Befehlen. Zum Test kille ich ddclient. Um nun zu sehen, ob Dein Script läuft starte ich es mit ./ddclient-check (so habe ich es genannt).
Du musst es anders nennen. Die Abfrage testet ob ein Prozess läuft, in dessen Namen 'dclient' vorkommt. Wenn das Skript 'dclient' im Namen hat, dann ist es (mit sich selbst :) zufrieden und hat keinen grund den Server zu starten.
Siehst Du, und aus präzise diesem Grund will man so etwas wie checkproc verwenden, das sich an den Inodes der Dateien und Prozesse orientiert, statt an den Namen der Prozesse in der Prozeßliste. Dann existiert dieses Problem nämlich gar nicht. Die genannte Lösung explodiert ja auch, wenn irgendein anderer User auf dem System auf die Idee kommen sollte, etwas zu starten, das "ddclient" im Namen hat. Kristian -- http://www.amazon.de/exec/obidos/wishlist/18E5SVQ5HJZXG
Alex Ascherl wrote:
[...] zu Deinem Script.
David Haller schrieb (viel) früher:
#!/bin/sh if ps ax | grep -q '[d]dclient'; then exit 0 else /pfad/zu/ddclient & fi
Ich bastel mir also ein Script aus Deinen Bash Befehlen. Zum Test kille ich ddclient. Um nun zu sehen, ob Dein Script läuft starte ich es mit ./ddclient-check (so habe ich es genannt).
Du musst es anders nennen. Die Abfrage testet ob ein Prozess läuft, in dessen Namen 'dclient' vorkommt. Wenn das Skript 'dclient' im Namen hat, dann ist es (mit sich selbst :) zufrieden und hat keinen grund den Server zu starten.
Oh mein Gott !!! Ist das peinlich ! Vielen Dank für den Klapps auf den Hinterkopf ... Es funktioniert jetzt nach der Umbenennung. Vielen Dank... und nicht weitersagen...
From: "Alex Ascherl"
Alex Ascherl wrote:
[...] zu Deinem Script.
David Haller schrieb (viel) früher:
#!/bin/sh if ps ax | grep -q '[d]dclient'; then exit 0 else /pfad/zu/ddclient & fi
Ich bastel mir also ein Script aus Deinen Bash Befehlen. Zum Test kille ich ddclient. Um nun zu sehen, ob Dein Script läuft starte ich es mit ./ddclient-check (so habe ich es genannt).
Du musst es anders nennen. Die Abfrage testet ob ein Prozess läuft, in dessen Namen 'dclient' vorkommt. Wenn das Skript 'dclient' im Namen hat, dann ist es (mit sich selbst :) zufrieden und hat keinen grund den Server zu starten.
Oh mein Gott !!! Ist das peinlich ! Vielen Dank für den Klapps auf den Hinterkopf ...
Es funktioniert jetzt nach der Umbenennung.
Warum so umständlich, checkproc /pfad/zu/ddclient || ddclient <Parameter> sollte es auch tun. Mfg, Thomas
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Das hört sich doch vielversprechend an.
Ohne ps und grep, sollte aber gehen. Ersetze das echo "Dein Prozess" mit dem Startbefehl Deines Programs.
Ich werde es gleich mal testen.
Zu Risiken und Nebenwirkungen fragen Sie O'Reilly's 'Linux Server Hacks' oder ein Linuxbuch Ihres Vertrauens :)
Muss mir endlich mal ein Buch über Linux Programming kaufen. ... hast Recht!
Stefan
PS: Die init-Lösung ist besser.
Ich hab jeztz in die inittab folgendes eingetragen: SV:123456:respawn:/usr/sbin/ddclient mit telinit q die iniitab neu einlesen lassen und den Befehl mittels kill abgeschossen. Er wird aber leider nicht neu gestartet. Was ist da falsch dran ? Ein man inittab erbrachte nicht das Gewünschte. Gruß Alex
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Das hört sich doch vielversprechend an.
Ohne ps und grep, sollte aber gehen. Ersetze das echo "Dein Prozess" mit dem Startbefehl Deines Programs.
Ich werde es gleich mal testen.
Zu Risiken und Nebenwirkungen fragen Sie O'Reilly's 'Linux Server Hacks' oder ein Linuxbuch Ihres Vertrauens :)
Muss mir endlich mal ein Buch über Linux Programming kaufen. ... hast Recht!
Stefan
PS: Die init-Lösung ist besser.
Ich hab jeztz in die inittab folgendes eingetragen: SV:123456:respawn:/usr/sbin/ddclient
Ich habe jetzt 9:3:respawn:/usr/sbin/ddclient in die inittab eingetragen und mit telinit q neu eingelesen. Jetzt startet das Programm ddclient aber 10 Mal... Das ist doch nicht normal, oder ?
mit telinit q die iniitab neu einlesen lassen und den Befehl mittels kill abgeschossen. Er wird aber leider nicht neu gestartet.
Was ist da falsch dran ? Ein man inittab erbrachte nicht das Gewünschte.
Gruß Alex
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Freitag, 20. Februar 2004 18:37 schrieb Stefan Waidele jun.:
Alex Ascherl wrote:
Ich muss einen Prozess per Script abprüfen, ob er noch läuft und wenn nicht diesen wieder starten.
Schau Dir mal /etc/inittab nach 'respawn' durch.
Ich dachte eher an ein Script welches per "ps ax |grep ddclient" abprüft. Wie ich dann aber das Script entscheiden lasse ob es ddclient wieder startet oder nicht weiss ich nicht.
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Ohne ps und grep, sollte aber gehen. Ersetze das echo "Dein Prozess" mit dem Startbefehl Deines Programs.
Habe ich Tomaten auf den Augen? Was soll denn diese Schleife machen? Wo wird da ein Prozess gestartet oder abgefragt, ob er noch existiert? Das, was ich da reininterpretiere ist eine Endlosschleife, die im Sekundentakt was ausgibt. Wenn man einen Prozess prüfen will, dann macht man das z. B. so: ps -ef | grep -q [d]dclient || /pfad/zum/ddclient & ps -ef holt sich alle Prozesse, grep -c prüft auf ddclient-Zeilen (die []-Konstruktion verhindert, dass sich der grep selbst mitzählt), wenn Ergebnis != 0 ist (nichts gefunden), wird er neu gestartet (& = im Hintergrund, ggf. noch mit nohup). Wenn man sicher gehen will, kann man z. B. noch den ps auf den User einschränken, unter dem ddclient läuft, den grep evtl. aufbohren, ... Jan
Am Freitag, 20. Februar 2004 20:33 schrieb Jan Trippler:
Am Freitag, 20. Februar 2004 18:37 schrieb Stefan Waidele jun.: [...]
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Ohne ps und grep, sollte aber gehen. Ersetze das echo "Dein Prozess" mit dem Startbefehl Deines Programs.
Habe ich Tomaten auf den Augen? Was soll denn diese Schleife machen? Wo wird da ein Prozess gestartet oder abgefragt, ob er noch existiert? [...]
Sorry, den letzten Satz habe ich überlesen - aber trotzdem: Du feuerst im Sekundentakt einen neuen Prozess ab ohne zu prüfen, ob er noch existiert. Wenn Du Pech hast und er tatsächlich noch lebt, hast Du nach 1 Minute 60 ddclient-Prozesse, oder hab ich noch was übersehen? Jan
Jan Trippler wrote:
Am Freitag, 20. Februar 2004 20:33 schrieb Jan Trippler:
Am Freitag, 20. Februar 2004 18:37 schrieb Stefan Waidele jun.:
[...]
while /bin/true ; echo "Dein Prozess"; sleep 1; done [...] Sorry, den letzten Satz habe ich überlesen
Alles klar, kann vorkommen :)
- aber trotzdem: Du feuerst im Sekundentakt einen neuen Prozess ab ohne zu prüfen, ob er noch existiert. Wenn Du Pech hast und er tatsächlich noch lebt, hast Du nach 1 Minute 60 ddclient-Prozesse, oder hab ich noch was übersehen?
Wie im anderen Posting geschrieben: Nicht im Sekundentakt, sondern immer eine Sekunde _nachdem_ der vorige Prozess beendet wurde. Was _ich_ übersehen habe ist dass ich davon ausging, dass der Prozess sich nicht selbst von der aufrufenden shell abkoppelt und in den deamon-mode geht, wie das manche Prograqmme (z.B. fetchmail) tun. Das muss ausgeschlossen werden, sonst tritt der von Dir beschriebene GAU ein. Stefan
Jan Trippler wrote:
Am Freitag, 20. Februar 2004 18:37 schrieb Stefan Waidele jun.: [...]
while /bin/true ; echo "Dein Prozess"; sleep 1; done
Also, da fehlt eh ein 'do', sorry: stw@laptop:~> while /bin/true ; do echo "Dein Prozess"; sleep 1; done Dein Prozess Dein Prozess Dein Prozess Dein Prozess Dein Prozess
Ohne ps und grep, sollte aber gehen. Ersetze das echo "Dein Prozess" mit dem Startbefehl Deines Programs.
Habe ich Tomaten auf den Augen? Was soll denn diese Schleife machen?
Das Problem lösen. Auf einem anderen Weg, wie Alex das tun wollte, aber es wird gelöst.
Wo wird da ein Prozess gestartet
Direct nach dem (fehlenden) 'do' und dem nächsten Semikolon. Im Beispiel wir ein Prozess gestartet der Text ausgiebt und ziemlich schnell fertig ist. Ist aber trotzdem ein Prozess.
oder abgefragt, ob er noch existiert?
Siehe oben: Anderer Lösungsansatz -> 'TIMTOWTDI' Wenn die Schleife bis zum 'sleep' kommt, steht fest dass der gestartete Prozess nicht mehr läuft.
Das, was ich da reininterpretiere ist eine Endlosschleife, die im Sekundentakt was ausgibt.
Eine Endloschleife, die einen Prozess startet und auf dessen Beendigung wartet, anschließend eine Sekunde lang Pause macht und dann wieder von vorne anfängt. Schönen Abend noch, Stefan
Bitte kein Cc: an mich, ich lese hier mit. Am Freitag, 20. Februar 2004 20:55 schrieb Stefan Waidele jun.:
Jan Trippler wrote: [...]
Habe ich Tomaten auf den Augen? Was soll denn diese Schleife machen?
Das Problem lösen. Auf einem anderen Weg, wie Alex das tun wollte, aber es wird gelöst.
Wo wird da ein Prozess gestartet
Direct nach dem (fehlenden) 'do' und dem nächsten Semikolon. Im Beispiel wir ein Prozess gestartet der Text ausgiebt und ziemlich schnell fertig ist. Ist aber trotzdem ein Prozess.
Ja, hatte ich übersehen.
oder abgefragt, ob er noch existiert?
Siehe oben: Anderer Lösungsansatz -> 'TIMTOWTDI' Wenn die Schleife bis zum 'sleep' kommt, steht fest dass der gestartete Prozess nicht mehr läuft.
Da hatte ich tatsächlich Tomaten auf den Augen (oder eher den Gehirnwindungen) ;) - ich bin immer von einem Hintergrundprozess ausgegangen (ich hab in meiner Mail ja selbst das & verwendet). Also vergiss meine andere Mail ;) Jan
On Friday 20 February 2004 17:34, Alex Ascherl wrote:
Es geht um das Programm "ddclient" welches als Deamon läuft.
Wenn Dein Programm ein Daemon ist, kann er zwei Betriebsarten haben: Dein Programm ddclient kann sich selbst forken und die geforkte Kopie kann setsid() und setpgrp() aufrufen, um sich vom controlling terminal zu lösen. Du erkennst solche Programme daran, daß sie auf der Kommandozeile aufgerufen werden und dann kommt der Prompt wieder, aber danach findet man eine Kopie des Prozesses im Hintergrund, mit einem ? in der Spalte TTY von ps: $ ddclient $ kris@valiant:~> ps axuwww| egrep "(TTY|ddclient)" USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND kris 1 0.0 0.0 620 256 ? S Feb13 0:03 ddclient Solche Programme sind schwieriger zu kontrollieren, ich komme gleich darauf zurück. Alternativ kann Dein Programm NICHT forken, und am controlling tty kleben bleiben. Wenn Du also machst, läuft das Programm und es kommt kein Prompt. Drückst Du ^C, bricht das Programm ab: $ ddclient ^C In der Prozeßliste würdest Du ddclient sehen, und die TTY-Spalte ist nicht "?". Du mußt also erst einmal feststellen, welche Sorte Programm Du hast. Diese zweite Sorte Programm, die an der Kommandozeile kleben bleibt, kontrolliert man am besten mit init, oder mit einer Watchdog-Schleife. Mit init trägst Du das Programm einfach in die inittab ein: dd:2345:respawn:/pfad/zu/ddclient und rufst dann "init q" oder "telinit q" auf. Mit einer Watchdog-Schleife baust Du eine Shell-Loop, die auf das Ende von ddclient wartet und den ddclient dann neu startet: while : do echo "`date`: ddclient started" >> /var/log/ddclient.log ddclient sleep 2 done Zurück zu den echten Daemon-Programmen, die sich selber detachen: Die meisten von denen schreiben eine PID-Datei, oft in /var/run oder einer anderen einstellbaren Location. In der Datei steht die PID des gerade laufenden Prozesses. ssh zum Beispiel macht das so: kris@valiant:/var/run> cat sshd.init.pid 1314 kris@valiant:/var/run> ps axuwww| grep 1314 root 1314 0.0 0.1 4920 1616 ? S Feb13 0:00 /usr/sbin/sshd -o PidFile=/var/run/sshd.init.pid Man kann testen, ob so ein Prozeß noch läuft, in dem man der genannten PID ein Signal 0 sendet. Signal 0 bewirkt nichts, sondern kill prüft nur auf die Existenz des Prozesses. Bekommt man ein ESRCH, gibt es den Prozeß nicht. Bekommt man ein OK oder ein EPERM, gibt es den Prozeß (aber bei EPERM gehört er einer anderen UID und wir sind nicht root). kris@valiant:/var/run> kill -0 1314 bash: kill: (1314) - Operation not permitted kris@valiant:/var/run> echo $? 1 Ein EPERM. Der sshd existiert, aber er gehört root und ich bin kris. kris@valiant:/var/run> kill -0 1315 bash: kill: (1315) - No such process kris@valiant:/var/run> echo $? 1 Ein ESRCH. Es gibt keinen Prozeß 1315. kris@valiant:/var/run> sleep 3600 & [1] 1521 kris@valiant:/var/run> kill -0 1521 kris@valiant:/var/run> echo $? 0 Der Prozeß 1521 existiert und gehört kris. Schreibt ddclient ein PID-File? Wenn Du kein PID-File hast, kannst Du checkproc verwenden, um die PID eines Prozesses festzustellen. valiant:~ # which checkproc /sbin/checkproc valiant:~ # rpm -qf `which checkproc` sysvinit-2.82-362 checkproc braucht zwar root-Rechte zum Laufen, geht aber sehr sorgfältig bei der Bestimmung des Programmes vor, dessen PID es sucht. Dazu gibst Du checkproc den vollen Pfadnamen des Programmes mit, das gesucht ist. checkproc bestimmt die Inode dieses Programmes und durchsucht dann /proc nach einem passenden Programm, das dieselbe Inode-Nummer hat. Checkproc durchsucht also nicht einfach die Prozeßliste nach Programmen die so heißen wie ein Suchbegriff, den wir angeben. Damit prüft checkproc immer auf genau das echte ddclient, das wir suchen - und checkproc kann nicht hereingelegt werden, indem irgendein User ein Shellscript startet, das zufällig ddclient heißt. checkproc kann auch mit PID-Files umgehen (Option -p), sodaß es wahrscheinlich eine Gute Idee (tm) ist, in jedem Fall checkproc zu verwenden. valiant:~ # checkproc -v /usr/sbin/sensord valiant:~ # echo $? 3 valiant:~ # checkproc -v /usr/sbin/sshd 1314 valiant:~ # echo $? 0 Wie Du siehst, läuft sensord nicht, aber sshd hat die PID 1314 und läuft. Varianten von checkproc wie pidofproc und pidof prüfen weniger streng, sind aber auch als Nicht-Root zu verwenden. Varianten wie pgrep und pkill sind auch portabel nach Solaris, prüfen aber noch weniger streng. Varianten wie "ps axuwww| grep ddclient | awk ..." sind veraltet und so langsam und fehleranfällig, das man sie schon als falsch ansehen könnte. Ich würde dringend davon abraten, solche Konstrukte zu verwenden - das ist 70er Jahre-Unix-Technik und hat auf einem Linux nix mehr verloren. Kristian -- http://www.amazon.de/exec/obidos/wishlist/18E5SVQ5HJZXG
participants (6)
-
Alex Ascherl
-
David Haller
-
Jan.Trippler@t-online.de
-
Kristian Köhntopp
-
Stefan Waidele jun.
-
thomas Gräber