PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : /sbin/init und Folgeprozesse



grissu
19.06.09, 12:07
Hi,

vlt. kann mir ja hier jemand einen Denkanstoß geben:

Ich boote von einer initramfs, die ein Root-Verzeichnis per nfs mountet.
Abschließend wird im Init-Skript der RamFS run-init der klibc aufgerufen und ausgeführt. Alles statisch, alles soweit gut.

Jetzt kommt es: /sbin/init des neuen Root-Verz. ruft wie gewünscht das in der inittab beschriebene init-Skript auf, welches ein anderes Skript aufrufen soll, das im Hintergrund laufen soll.

init-skript:
---schnipp---
[...]
sh /etc/init.d/startbla.sh &

/etc/init.d/sshd start

exit 0

---schnapp---

startbla.sh
---schnipp---
while [ 1 ] ; do
echo "bla"
done
---schnapp---

Theoretisch müsste jetzt permanent "bla" im log stehen, allerdings wird das Skript nur solange ausgeführt, bis das init-skript zum exit 0 kommt.

Das darf aber doch nicht sein??? *bin verwirrt*
Ist deshalb wichtig, weil in der startbla.sh wichtige Dinge gestartet werden sollen, die permanent laufen müssen.

Woran liegt das?

Vielen Dank

gruß++

grissu

Los_Andros
19.06.09, 20:22
naja, es wird halt der Parent Prozess gekillt.

Das ist in etwa so, wie wenn Du einen xterm öffnest, dort folgendes reinschreibst:


i=1; while test $i -ne 2; do echo "Blub" >> /home/DEINHOME/logdatei; sleep 1; done &

Während das läuft wirst Du in einem anderen Terminalfenster die einzelnen Prozesse mittels ps -ef sehen (den sleep, die bash).

Wenn Du nun das erste Terminalfenster (mit dem Befehl in den Hintergrund geschickt) schließt, werden alle Prozesse verschwinden, da der parent Prozess "gekillt" wurde.

oziris
19.06.09, 22:44
Ich empfehle die Lektüre von "man nohup" oder, wenn Dein sh zu bash führt, "man bash" bei SIGNALS und SHELL BUILTIN COMMANDS jeweils die Sachen, die disown betreffen.

grissu
20.06.09, 08:56
Naja,

nohup kenne ich und ist auch erstmal eingebaut, aber es löst nicht die Ursache des Problems.

Und ganz so kann ich es nicht hinnehmen, da es auf einem anderen Server (gut, ist dort keine initramfs, sondern ne initrd) ohne Probleme läuft.

Trotzdem danke.

oziris
20.06.09, 12:04
nohup kenne ich und ist auch erstmal eingebaut, aber es löst nicht die Ursache des Problems.Doch. Die Ursache ist, dass Unterprozesse ein SIGHUP signalisiert bekommen, wenn die Shell beendet wird. Das ist gut und richtig so. Nur wenn sie mit sowas brutalem, wie SIGKILL beendet wird, dann kann sie den Unterprozessen eigentlich nichts mehr weitergeben.
"nohup" oder "disown" beheben diese Ursache.
In "man bash" unter BUILTIN COMMANDS ist auch "wait" aufgeführt, welches das unbeinflusste Beenden der bash zunächst verhindern würde. Natürlich kannsie aber durch äußere Umstände doch noch beendet werden, was wieder zum beklannten Problem führen kann.

Möglicherweise befindest Du Dich aber auch auf einem Holzweg und willst eigentlich "man start-stop-daemon" lesen (u.a. speziell auch bei OPTIONS -> "-b|--backgroundund") und es vielleicht auf Deine initrd anwenden.