rc.custom startet keine scripte, lediglich direkte Befehle

level20peon

Mitglied
Mitglied seit
11 Jul 2007
Beiträge
270
Punkte für Reaktionen
0
Punkte
16
Bitte beachtet, es handelt sich hier um: FRITZ!Box 7490 (UI), Firmware: 113.06.23 rev29613, nicht um die FritzBox in meiner Signatur.

Ich versuche zur Zeit meine 7390 zu einer 7490 umzuziehen. Das meiste funktioniert auch wie ich mir das vorstelle, aber ich habe ein scheinbar unlösbares Problem: die rc.custom. Alle Befehle, die ich direkt dort eintrage, zB:

Code:
cd /var/tmp ; ls -la > /var/tmp/foo.bar
funktionieren wunderbar, auch Befehle wie:
Code:
/usr/sbin/openvpn /tmp/flash/openvpn/server.ovpn
funktionieren.

Was nicht funktioniert sind Einträge wie:
Code:
/var/tmp/somescript.sh
... wobei ich /var/tmp/somescript.sh durch die debug.cfg angelegt habe, und ausführbar gemacht habe. Das Anlegen funktioniert auch, was ich durch den oben genannten ls -la Befehl im Test verifiziert habe, sprich, die scripte sind vorhanden und ausführbar, aber werden einfach nicht von der rc.custom ausgeführt. Warum? Keine Ahnung - mod.log verrät, dass rc.custom ausgeführt wurde, ich bin nach dutzenden Tests und Reboots nun am Ende meines Lateins und würde mich über jegliche Hilfestellung freuen. Zusatzinfo 1: Auch ein sleep X am Anfang der rc.custom beschert keine Besserung... und dabei sollte es doch eigentlich heute eine Bescherung geben :D
Zusatzinfo 2: durch
Code:
sh -x /tmp/flash/mod/rc.custom
lässt sich die rc.custom ausführen, wie ich es gewohnt bin.
 
Zuletzt bearbeitet:
@level20peon: Danke, daß du endlich mal das Problem ansprichst!

Ich habe zwar kein Freetz drauf, aber den Effekt kenne ich von meiner debug.cfg auch seit einigen FW und mit verschiedenen FB's. IMHO schon teilweise seit FW xx.05.xx.
Mich hat es schon lange gewundert, daß bisher noch keiner über den Effekt berichtet hat, oder habe ich hier etwas übersehen?

Meine Beobachtungen:

- Binarys werden ohne Probleme ausgeführt und laufen auch durch
Bei mir meist dropbear, aber auch andere

- Scripte die nur einmal durchlaufen, klappen auch

Problem:
- Scripte mit Endlos Schleifen werden beim FB-Start auch kurzzeitig ausgeführt (sehe ich an Log-Dateien)
ABER sie werden (meine Vermutung) kurz danach durch irgendwas gekillt.
Ich vermute dahinter ein neues "Sicherheits" Feature von AVM,
denn die gleichen Scripte liefen vor ca. 1 Jahr noch ohne Probleme.

- Wenn ich die gleichen Scripte nach einer Zeit X starte, laufen sie bis in alle Ewigkeit
(Deine Zusatzinfo 2)

Wie lange die Zeit X sein muß, habe ich noch nicht ausgetestet.
Ob das 10 min, 1h oder 1Tag sein muß. Aber nach 1Tag geht es IMO.
Wie lange hast du das X in "Zusatzinfo 1: Auch ein sleep X" schon ausprobiert?

Was ich schon probiert habe, und nicht geht:
/var/tmp/somescript.sh
/var/tmp/somescript.sh &
und damit man das Script nicht gleich an der Endung erkennt:
/var/tmp/somescript
/var/tmp/somescript &
auch schon mit und ohne: #!/bin/sh

Was man noch versuchen könnte:
In das Script am Anfang ein "sleep 600" oder höher,
das will man aber nicht in die debug.cfg oder bei dir rc.custom rein machen,
sonst wartet man ja Ewigkeiten, bis die FB fertig ist,
und es kann dann sein, daß dieser "Kill-Effekt" trotzdem noch auftritt,
wenn er erst seine Zeit X nach Ende der debug.cfg/rc.custom startet.


EDIT:
Einen ähnlichen Effekt habe ich in einigen FW mit dem Befehl:

chmod 700 /var/tmp

(brauche ich, damit die /var/tmp/.ssh/authorized_keys klappen)
Auch das wird nach einer Zeit X wieder zurückgestellt und ich muß erst wieder per Telnet drauf, den Befehl wieder eingeben, dann geht es bis zum nächsten Neustart der FB.
 
Zuletzt bearbeitet:
Versuch mal mit dem ausführbaren Script, im Verzeichnis "/tmp/flash/mod" statt im Verzeichnis "/var/tmp".

Das ändert scheinbar auch nichts. Und es wird noch kurioser. Ich versuche, den Prozess immer und immer simpler zu gestalten, um die Ursache für das Verhalten zu ergründen. Im Zuge dessen habe ich nun eine rc.custom, die folgendermaßen aussieht:
Code:
/var/tmp/rc_custom.sh &
/tmp/flash/mod/rc_custom.sh &
exit

Beide rc_custom.sh enthalten fast die selben Einträge, startend mit:
Code:
touch /var/tmp/1.bar
touch /tmp/flash/mod/1.bar
sleep 180
touch /var/tmp/2.bar
touch /var/flash/mod/2.bar
/var/tmp/somescript.sh &
exit
Wobei die rc_custom.sh in /tmp/flash/mod/ n.foo enthält und die rc_custom.sh in /var/tmp/ n.bar enthält. Sowohl 1.foo als auch 1.bar werden in beiden Verzeichnissen erstellt, danach passiert aber nichts mehr. weder die 2.foo, noch die 2.bar werden erstellt, und das somescript.sh am Ende wird auch nicht mehr ausgeführt.
Die Logs (Freetz-Log / syslog) enthalten keinerlei Hinweise auf irgendwas, das war überhaupt erst der Grund, warum ich es hier ansprach.

Zusatzinfo 3: crond führt scripte in /var/tmp/ wie gewohnt aus.

@level20peon: Danke, daß du endlich mal das Problem ansprichst!

Ich habe zwar kein Freetz drauf, aber den Effekt kenne ich von meiner debug.cfg auch seit einigen FW und mit verschiedenen FB's. IMHO schon teilweise seit FW xx.05.xx.
Mich hat es schon lange gewundert, daß bisher noch keiner über den Effekt berichtet hat, oder habe ich hier etwas übersehen?

Bevor wir aneinander vorbeireden: Ich führe die scripte nicht aus der debug.cfg, sondern aus der rc.custom aus. debug.cfg erstellt diese scripte lediglich:
Code:
# >> rc_custom
cat > /tmp/flash/mod/rc_custom.sh << 'ENDCHECK'
#!/bin/sh

touch /var/tmp/1.foo
touch /tmp/flash/mod/1.foo
sleep 180
touch /var/tmp/2.foo
touch /var/flash/mod/2.foo
/var/tmp/somescript.sh &
exit

ENDCHECK
chmod +x /tmp/flash/mod/rc_custom.sh
# << rc_custom

Meine Beobachtungen:
- Binarys werden ohne Probleme ausgeführt und laufen auch durch
Bei mir meist dropbear, aber auch andere

- Scripte die nur einmal durchlaufen, klappen auch

ok, interessant... ich versuche nämlich in der rc.custom "Endlosscripte" zu starten.

Problem:
- Scripte mit Endlos Schleifen werden beim FB-Start auch kurzzeitig ausgeführt (sehe ich an Log-Dateien)
ABER sie werden (meine Vermutung) kurz danach durch irgendwas gekillt.
Ich vermute dahinter ein neues "Sicherheits" Feature von AVM,
denn die gleichen Scripte liefen vor ca. 1 Jahr noch ohne Probleme.

Bei mir werden sie scheinbar nichtmals vernünftig gestartet (siehe mein "sleep 180" im test-script, da gibt es lediglich eine Wartezeit, keine Endlosschleife... nach dem sleep wird aber trotzdem nicht weiter gemacht). Auf meiner 7390 läuft die rc.custom auch heute noch wie gewohnt (aktuelle Firmware, siehe Signatur).

- Wenn ich die gleichen Scripte nach einer Zeit X starte, laufen sie bis in alle Ewigkeit
(Deine Zusatzinfo 2)

Wie lange die Zeit X sein muß, habe ich noch nicht ausgetestet.
Ob das 10 min, 1h oder 1Tag sein muß. Aber nach 1Tag geht es IMO.
Wie lange hast du das X in "Zusatzinfo 1: Auch ein sleep X" schon ausprobiert?

Ich habe 3 Minuten ausprobiert... das sollte eigentlich reichen. Eigentlich, weil auch nach ein paar Sekunden alle Dienste gestartet sein sollten, wenn man bedenkt, dass die rc.custom am Ende des Bootvorgangs ausgeführt wird. Was mich hier auch stutzig macht ist ja wie im Eingangspost erwähnt, dass ein "sh -x /tmp/flash/mod/rc.custom" die scripte "normal" ausführt... und das kann ich eingeben sobald der SSH Server der Box gestartet ist, also nicht erst 3 Minuten nach Ende des Bootvorgangs.

Was man noch versuchen könnte:
In das Script am Anfang ein "sleep 600" oder höher,
das will man aber nicht in die debug.cfg oder bei dir rc.custom rein machen,
sonst wartet man ja Ewigkeiten, bis die FB fertig ist,
und es kann dann sein, daß dieser "Kill-Effekt" trotzdem noch auftritt,
wenn er erst seine Zeit X nach Ende der debug.cfg/rc.custom startet.

Das sleep in das script zu setzen habe ich ja wie gerade erwähnt auch schon ausprobiert - ohne Erfolg (siehe oben).

EDIT:
Einen ähnlichen Effekt habe ich in einigen FW mit dem Befehl:

chmod 700 /var/tmp

Das habe ich gerade auch getestet - leider ohne Erfolg.

Ich würde gerne eine "saubere" Lösung für das Problem finden und bin gerne bereit weitere Informationen zusammenzustellen. Als unsauberes workaround fällt mir gerade nur ein, sowas wie "jetzt +1 Minute" (also ein einmaliges Datum / Uhrzeit) beim Start in einen cronjob einzufügen, und dann durch cron den "sh -x /tmp/flash/mod/rc.custom" auszuführen (der Befehl funktioniert grundsätzlich in cron, das habe ich eben getestet).

Edit: Ich sehe gerade, dass es auch die "@reboot" Option bei cron gibt... mal schauen ob das nicht funktioniert.
 
Zuletzt bearbeitet:
Code:
/var/tmp/rc_custom.sh &
/tmp/flash/mod/rc_custom.sh &
exit
Hast Du in der "/tmp/flash/mod/rc_custom.sh" einen shebang, z. B. "#!/bin/sh -e" eingetragen? Versuch dann mal in der rc.custom mit der Zeile:
Code:
sh /tmp/flash/mod/rc_custom.sh
und ohne "&". In die rc_custom.sh könntest Du z. B. als letzte wirksame Zeile auch einen logger-Eintrag (für die syslog) machen.
 
Moin

1. Genau, ein nicht ausführbares Skript ohne SHEBANG wird mit vorangestellten Interpreter gestartet.
Code:
sh irgendeinskript.sh

2. Nur mit chmod +x ausführbar gemachte Skripte beachten das SHEBANG.
irgendeinskript.sh (1. Zeile)
Code:
#!/bin/sh

3. Dann gäbe es noch den Trick mit der Inklusion.
Im Prinzip die Kurzform von 1.
rc.custom
Code:
. irgendeinskript.sh
Beachte: Punkt und Leerzeichen vor Skriptname

logger:
:doktor:
sf3978 schrieb:
letzte wirksame Zeile auch einen logger-Eintrag (für die syslog) machen
Gute Idee, ein recht allgemeiner Aufruf könnte so gestaltet werden...
irgendeinskript.sh
Code:
#!/bin/sh
logger -t $(basename $0)[$(pidof $(basename $0))] "Normal beendet"
#EOF
...erzeugt im Syslog...
messages
Code:
Dec 25 12:51:50 irgendeinskript.sh[27939]: Normal beendet
 
Zuletzt bearbeitet:
Hast Du in der "/tmp/flash/mod/rc_custom.sh" einen shebang, z. B. "#!/bin/sh -e" eingetragen? Versuch dann mal in der rc.custom mit der Zeile:
Code:
sh /tmp/flash/mod/rc_custom.sh
und ohne "&". In die rc_custom.sh könntest Du z. B. als letzte wirksame Zeile auch einen logger-Eintrag (für die syslog) machen.

Ein shebang "#!/bin/sh" ist in der /tmp/flash/mod/rc_custom.sh vorhanden (und auch in allen anderen scripten, die ich bisher aus der rc.custom gestartet habe).

Code:
[COLOR="#FF0000"]/bin/[/COLOR]sh /tmp/flash/mod/rc_custom.sh

... funktioniert auch nicht.


1. Genau, ein nicht ausführbares Skript ohne SHEBANG wird mit vorangestellten Interpreter gestartet.
Code:
sh irgendeinskript.sh

... siehe oben :D

2. Nur mit chmod +x ausführbar gemachte Skripte beachten das SHEBANG.
irgendeinskript.sh (1. Zeile)
Code:
#!/bin/sh

"chmod +x" ist in der debug.cfg vorhanden, siehe post 2059935.

3. Dann gäbe es noch den Trick mit der Inklusion.
Im Prinzip die Kurzform von 1.
rc.custom
Code:
. irgendeinskript.sh
Beachte: Punkt und Leerzeichen vor Skriptname

Das habe ich nun nicht ausprobiert, denn das halte ich nach oben gefahrenen Tests für wenig erfolgversprechend.

logger:
:doktor:
Gute Idee, ein recht allgemeiner Aufruf könnte so gestaltet werden...
irgendeinskript.sh
Code:
#!/bin/sh
logger -t $(basename $0)[$(pidof $(basename $0))] "Normal beendet"
#EOF
...erzeugt im Syslog...
messages
Code:
Dec 25 12:51:50 irgendeinskript.sh[27939]: Normal beendet

Mit den "touch xyz" Zeilen habe ich ja bereits zu verschiedenen Zeitpunkten Ausgaben erzeugt, ob die jetzt in das syslog geschrieben werden oder in meinem Fall Dateien erzeugen macht informativ ja keinen Unterschied.

Ich habe jetzt ein workaround konstruiert:
rc.custom:
Code:
#sed -i '/\/var\/tmp\/rc\.custom/d' /tmp/flash/mod/crontab ; modsave ; /etc/init.d/rc.crond reload
#script1.sh &
#script2.sh &
#exit
sed -e '/sed -i/d;s/^.//' /tmp/flash/mod/rc.custom > /var/tmp/rc.custom ; chmod +x /var/tmp/rc.custom ; sed -i '/\/var\/tmp\/rc\.custom/d' /tmp/flash/mod/crontab ; /bin/date -D '%s' -d "$(( `/bin/date +%s`+2*60 ))" "+%M %H %d %m %u" | sed -e 's/$/ \/var\/tmp\/rc\.custom/' >> /tmp/flash/mod/crontab ; modsave ; /etc/init.d/rc.crond reload

So kann ich weiterhin bequem alles ins Webinterface eintragen, beim bootup wird dann ein einmaliger cronjob erzeugt, der 2 Minuten später ausgeführt und danach wieder gelöscht wird. Leider unterstützt der busybox crond nicht die @bootup Funktion, daher ist das Ganze etwas aufwändiger.
 
Zuletzt bearbeitet:
Ein shebang "#!/bin/sh" ist in der /tmp/flash/mod/rc_custom.sh vorhanden (und auch in allen anderen scripten, die ich bisher aus der rc.custom gestartet habe).
Code:
[COLOR="#FF0000"]/bin/[/COLOR]sh /tmp/flash/mod/rc_custom.sh
... funktioniert auch nicht.
Das verstehe ich dann auch nicht, denn ich kann auf diese Art und Weise, Scripte mit der rc.custom-Datei starten.
 
Das verstehe ich dann auch nicht...

Willkommen im Club. Und wie oben schon gesagt funktioniert dieses Setup 1:1 auf der 7390.

Edit: Vielleicht nochmal zur Verdeutlichung: Oben gezeigtes testscript (/var/tmp/rc_custom.sh) führt das erste "touch" aus, aber das sleep und somit das nächste "touch" wird nicht mehr ausgeführt.
 
Zuletzt bearbeitet:
Für die, die nur nach einer Lösung suchen und nicht unbedingt die Ursache klären wollen (ích bin aus den verschiedenen beschriebenen Problemen nicht so richtig schlau geworden, habe aber zur Zeit auch nicht den Ehrgeiz dazu):

Es bleibt immer noch die Möglichkeit, "Dauerläufer" asynchron über den multid als gesonderten Prozess zu starten. Dazu dient das kleine Utility "delay" in der AVM-Firmware. Es macht nichts weiter, als ein "msgsend" mit passenden Parametern intern an den multid abzusetzen, mit dem eine Art "at"-Ersatz realisiert wird.

Das einzige Problem, was man dabei berücksichtigen muß, ist die Tatsache, daß dieser Mechanismus "Jobs" mit identischer ID als Einheit betrachtet und es somit nicht möglich ist, ein "selbstreproduzierendes" Script zu schreiben, was sich immer wieder mit einem passenden "delay"-Aufruf selbst neu startet (und damit kein sleep braucht). Wenn man das haben will, muß man eine wechselnde "ID" benutzen, da zu allem Überfluß auch die ID noch "gültig" ist, solange das Script läuft. Auch ein "großer Neustart" der Dienste, bei dem dann der multid ebenfalls neu gestartet wird, ist der Tod eines solchen "Jobs", insofern ist das wohl kein "echter" cron-Ersatz. Aber es funktioniert eben auch mit einer orginalen AVM-Busybox, die ja keinen crond enthält.

Ein 'delay' für einen noch nicht gestarteten Job verzögert dessen Start weiter für die angegebene Anzahl von Sekunden, ein bereits gestarteter Job wird aber nicht abgebrochen und das 'delay'-Kommando ohne weitere Fehlernachricht einfach ignoriert. Ich kenne auch keine Möglichkeit, die definierten Jobs abzufragen ... aber es ist mit einem passenden msgsend-Aufruf durchaus möglich, einen noch nicht gestarteten Job vor dessen Start noch abzubrechen.

Fazit: Solange man nur die Asynchronität erreichen will, ist ein Kommando wie "delay -d 1 MYJOB /bin/sh /var/tmp/myscript.sh" der - meines Erachtens - beste Weg für den Start eines Scripts, erst recht dann, wenn es ununterbrochen in einer Schleife mit 'sleep' läuft.
 
Ich habe zwar kein Freetz drauf, aber den Effekt kenne ich von meiner debug.cfg auch seit einigen FW und mit verschiedenen FB's. IMHO schon teilweise seit FW xx.05.xx.
Mich hat es schon lange gewundert, daß bisher noch keiner über den Effekt berichtet hat, oder habe ich hier etwas übersehen?
Das Problem ist, dass man erst erst einmal feststellen muss und dann auch noch an passender Stelle darüber berichten muss...
So hat es auf meinem Livesystem mit einer 7390 und FW 86.06.03 (Edition EWE) in Kombination mit Freetz immer noch tadellos geklappt. Erst ein Hardwarewechsel mit auf eine 7490 im Zusammenhang mit einer neueren FW 113.06.23 in Kombination mit Freetz brachte das Phänomen zum Vorschein.

Ein Livesystem per Remote zu debuggen ist dann zusätzlich schwierig, aber daraus ist dann das referenzierte Ticket entstanden ;)
 
Ich habe jetzt mal versucht, das irgendwie systematisch zu testen und habe - wegen des Problem bei "eisbaerin" - erst einmal mit einer "debug.cfg"-ähnlichen Variante angefangen. Dabei wird das folgende Skript im Laufe des Boot-Vorgangs per "source" eingebunden, ähnlich wie es bis zur 06.0x bei der debug.cfg üblich war:

FRITZ!Box 7490 mit 06.23 und eigener Busybox 1.22.1 (bb.config als Text-File im Anhang)

Code:
cat >/var/tmp/test <<-'EOT'
#! /bin/sh -x
PPID=$(sed -n -e "s#^PPid:\t\([0-9]*\)#\1#p" /proc/$$/status)
logger -- "$0 (PID $$ - PPID $PPID) started with $*"
logger -- "[$$] $(stat -c %N /proc/self/fd/0)"
logger -- "[$$] $(stat -c %N /proc/self/fd/1)"
logger -- "[$$] $(stat -c %N /proc/self/fd/2)"
i=0
w=$1
c=$2
show_trap()
{
    logger -- "[$$] Trap $1 received for $2"
}
trap "show_trap HUP $$" HUP
trap "show_trap INT $$" INT
trap "show_trap QUIT $$" QUIT
trap "show_trap ILL $$" ILL
trap "show_trap ABRT $$" ABRT
trap "show_trap FPE $$" FPE
trap "show_trap KILL $$" KILL
trap "show_trap BUS $$" BUS
trap "show_trap SEGV $$" SEGV
trap "show_trap SYS $$" SYS
trap "show_trap PIPE $$" PIPE
trap "show_trap ALRM $$" ALRM
trap "show_trap TERM $$" TERM
trap "show_trap USR1 $$" USR1
trap "show_trap USR2 $$" USR2
#trap "show_trap CHLD $$" CHLD
trap "show_trap STOP $$" STOP
trap "show_trap TSTP $$" TSTP
trap "show_trap CONT $$" CONT
trap "show_trap TTIN $$" TTIN
trap "show_trap TTOU $$" TTOU
trap "show_trap EXIT $$" EXIT
while true; do
        OPID=$PPID
        let i=i+1
        logger "[$$] is looping, count = $i"
        PPID=$(sed -n -e "s#^PPid:\t\([0-9]*\)#\1#p" /proc/$$/status)
        [ $PPID -ne $OPID ] && logger -- "[$$] PPID changed to $PPID"
        sleep $w
        [ $i -eq $c ] && break
done
EOT
chmod a+x /var/tmp/test
/var/tmp/test 10 12 '12 ten-second loops, started asynchronously with redirection' >/var/tmp/test.log 2>&1 &
sleep 1
ps l |
while read line; do
        logger -- "${line:0:1} ${line:8:11} ${line:53}"
done
logread >/var/log/syslog.txt
Wenn dieses Skript ausgeführt wird (und in der Folge dann /var/tmp/test gestartet wird), ergibt sich folgende Ausgabe:

Code:
Jan  1 01:00:45 FB7490 syslog.info syslogd started: BusyBox v1.22.1
[COLOR="#0000FF"]Jan  1 01:00:45 FB7490 user.notice root: /var/tmp/test (PID 1451 - PPID 149) started with 10 12 12 ten-second loops, started asynchronously with redirection[/COLOR]
Jan  1 01:00:45 FB7490 user.notice root: [1451] '/proc/self/fd/0' -> '/dev/null'
Jan  1 01:00:45 FB7490 user.notice root: [1451] '/proc/self/fd/1' -> 'pipe:[5679]'
Jan  1 01:00:45 FB7490 user.notice root: [1451] '/proc/self/fd/2' -> '/var/tmp/test.log'
Jan  1 01:00:45 FB7490 user.notice root: [1451] is looping, count = 1
Jan  1 01:00:46 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan  1 01:00:46 FB7490 user.notice root: S   PID  PPID CMD
Jan  1 01:00:46 FB7490 user.notice root: S     1     0 init
Jan  1 01:00:46 FB7490 user.notice root: S     2     0 [kthreadd]
Jan  1 01:00:46 FB7490 user.notice root: S     3     2 [migration/0]
Jan  1 01:00:46 FB7490 user.notice root: S     4     2 [ksoftirqd/0]
Jan  1 01:00:46 FB7490 user.notice root: S     5     2 [watchdog/0]
Jan  1 01:00:46 FB7490 user.notice root: S     6     2 [migration/1]
Jan  1 01:00:46 FB7490 user.notice root: S     7     2 [ksoftirqd/1]
Jan  1 01:00:46 FB7490 user.notice root: S     8     2 [watchdog/1]
Jan  1 01:00:46 FB7490 user.notice root: S     9     2 [yield_w/0]
Jan  1 01:00:46 FB7490 user.notice root: S    10     2 [yield_w/1]
Jan  1 01:00:46 FB7490 user.notice root: S    11     2 [yield_w/0]
Jan  1 01:00:46 FB7490 user.notice root: S    12     2 [yield_w/1]
Jan  1 01:00:46 FB7490 user.notice root: S    13     2 [events/0]
Jan  1 01:00:46 FB7490 user.notice root: S    14     2 [events/1]
Jan  1 01:00:46 FB7490 user.notice root: S    15     2 [khelper]
Jan  1 01:00:46 FB7490 user.notice root: S    18     2 [async/mgr]
Jan  1 01:00:46 FB7490 user.notice root: S    34     2 [sync_supers]
Jan  1 01:00:46 FB7490 user.notice root: S    35     2 [bdi-default]
Jan  1 01:00:46 FB7490 user.notice root: S    37     2 [kblockd/0]
Jan  1 01:00:46 FB7490 user.notice root: S    38     2 [kblockd/1]
Jan  1 01:00:46 FB7490 user.notice root: S    58     2 [kswapd0]
Jan  1 01:00:46 FB7490 user.notice root: S    59     2 [ksmd]
Jan  1 01:00:46 FB7490 user.notice root: S    60     2 [aio/0]
Jan  1 01:00:47 FB7490 user.notice root: S    61     2 [aio/1]
Jan  1 01:00:47 FB7490 user.notice root: S    75     2 [pm_info]
Jan  1 01:00:47 FB7490 user.notice root: S    82     2 [avm_debugd]
Jan  1 01:00:47 FB7490 user.notice root: S   108     2 [mtdblockd]
Jan  1 01:00:47 FB7490 user.notice root: D   117     2 [ifx_ssc]
Jan  1 01:00:47 FB7490 user.notice root: S   128     2 [l2tp]
Jan  1 01:00:47 FB7490 user.notice root: S   132     2 [tffsd]
Jan  1 01:00:47 FB7490 user.notice root: S   133     2 [avmnet_workqueu]
Jan  1 01:00:47 FB7490 user.notice root: S   134     2 [PhyWaspHeartbea]
Jan  1 01:00:47 FB7490 user.notice root: S   140     2 [avmnet_timer]
Jan  1 01:00:47 FB7490 user.notice root: S   142     2 [loop0]
Jan  1 01:00:47 FB7490 user.notice root: S   149     1 {rc.S} /bin/sh /etc/init.
Jan  1 01:00:47 FB7490 user.notice root: S   177     2 [yaffs-bg-1]
Jan  1 01:00:47 FB7490 user.notice root: S   353     2 [cleanup_timer_f]
Jan  1 01:00:47 FB7490 user.notice root: S   398   149 {rc.S} /bin/sh /etc/init.
Jan  1 01:00:47 FB7490 user.notice root: S   420     2 [yaffs-bg-1]
Jan  1 01:00:47 FB7490 user.notice root: S   428     2 [flush-31:0]
Jan  1 01:00:47 FB7490 user.notice root: S   434     2 [capi_pipew/0]
Jan  1 01:00:47 FB7490 user.notice root: S   435     2 [capi_pipew/1]
Jan  1 01:00:47 FB7490 user.notice root: S   436     2 [capi_schedw/0]
Jan  1 01:00:47 FB7490 user.notice root: S   437     2 [capi_schedw/1]
Jan  1 01:00:47 FB7490 user.notice root: S   438     2 [pcmlink_ctrl]
Jan  1 01:00:47 FB7490 user.notice root: S   441     2 [capitransp]
Jan  1 01:00:47 FB7490 user.notice root: R   444     2 [avm_dect_thread]
Jan  1 01:00:47 FB7490 user.notice root: S   512     1 /sbin/udevd --daemon
Jan  1 01:00:47 FB7490 user.notice root: S   513   149 {busybox} tail -f /nohup.
Jan  1 01:00:47 FB7490 user.notice root: S   528     2 [khubd]
Jan  1 01:00:47 FB7490 user.notice root: S   729     1 /bin/configd
Jan  1 01:00:47 FB7490 user.notice root: S   805     1 dsl_control -i10_00_10_40
Jan  1 01:00:47 FB7490 user.notice root: S   840     1 dsl_monitor -d
Jan  1 01:00:47 FB7490 user.notice root: S   929     2 [scsi_eh_0]
Jan  1 01:00:47 FB7490 user.notice root: S   930     2 [usb-storage]
Jan  1 01:00:47 FB7490 user.notice root: S   981     1 avmipcd
Jan  1 01:00:47 FB7490 user.notice root: S   984     1 l2tpv3d
Jan  1 01:00:47 FB7490 user.notice root: S   991     1 ctlmgr
Jan  1 01:00:47 FB7490 user.notice root: S   995     1 upnpd
Jan  1 01:00:47 FB7490 user.notice root: S   997     2 [autbtex]
Jan  1 01:00:47 FB7490 user.notice root: S   998     2 [pmex_ne]
Jan  1 01:00:47 FB7490 user.notice root: S   999     2 [pmex_fe]
Jan  1 01:00:47 FB7490 user.notice root: S  1005     1 multid
Jan  1 01:00:47 FB7490 user.notice root: S  1011     1 ddnsd
Jan  1 01:00:47 FB7490 user.notice root: S  1014     1 upnpdevd
Jan  1 01:00:47 FB7490 user.notice root: S  1026     1 wland -B
Jan  1 01:00:47 FB7490 user.notice root: S  1031     1 dsld -i -n
Jan  1 01:00:47 FB7490 user.notice root: S  1047     2 [wlan_com_tx_thr]
Jan  1 01:00:47 FB7490 user.notice root: S  1065     1 pbd
Jan  1 01:00:47 FB7490 user.notice root: D  1133     2 [kspeedtest]
Jan  1 01:00:47 FB7490 user.notice root: S  1134     2 [kspeedtest]
Jan  1 01:00:47 FB7490 user.notice root: S  1135     2 [kspeedtest]
Jan  1 01:00:47 FB7490 user.notice root: D  1136     2 [kspeedtest_tcp]
Jan  1 01:00:47 FB7490 user.notice root: S  1143     1 {udev-mount-sd} /bin/sh /
Jan  1 01:00:47 FB7490 user.notice root: S  1144     1 {udev-mount-sd} /bin/sh /
Jan  1 01:00:48 FB7490 user.notice root: S  1149     1 {udev-mount-sd} /bin/sh /
Jan  1 01:00:48 FB7490 user.notice root: S  1236     1 telefon a127.0.0.1
Jan  1 01:00:48 FB7490 user.notice root: S  1237     1 telnetd -l /sbin/ar7login
Jan  1 01:00:48 FB7490 user.notice root: S  1253  1236 dect_manager
Jan  1 01:00:48 FB7490 user.notice root: S  1256     1 voipd
Jan  1 01:00:48 FB7490 user.notice root: S  1266     2 [kjournald]
Jan  1 01:00:48 FB7490 user.notice root: S  1272     2 [flush-8:0]
Jan  1 01:00:48 FB7490 user.notice root: S  1285     1 /usr/bin/faxd -a
Jan  1 01:00:48 FB7490 user.notice root: S  1293   512 /sbin/udevd --daemon
Jan  1 01:00:48 FB7490 user.notice root: S  1306     1 feedd
Jan  1 01:00:48 FB7490 user.notice root: S  1308     1 /usr/sbin/inetd
Jan  1 01:00:48 FB7490 user.notice root: S  1318     2 [avmcsrpc]
Jan  1 01:00:48 FB7490 user.notice root: R  1320     1 playerd_tables
Jan  1 01:00:48 FB7490 user.notice root: S  1324     1 pictured -Dpicserver -Dha
Jan  1 01:00:48 FB7490 user.notice root: S  1332   512 /sbin/udevd --daemon
Jan  1 01:00:48 FB7490 user.notice root: S  1335     1 hostapd -g /var/run/hosta
Jan  1 01:00:48 FB7490 user.notice root: S  1337     1 audiod
Jan  1 01:00:48 FB7490 user.notice root: S  1343   991 sh -c /etc/init.d/rc.net
Jan  1 01:00:48 FB7490 user.notice root: S  1347  1343 {rc.net} /bin/sh /etc/ini
Jan  1 01:00:48 FB7490 user.notice root: S  1350     2 [tgt_alive_poll_]
Jan  1 01:00:48 FB7490 user.notice root: S  1382     1 /bin/tr069starter data
Jan  1 01:00:48 FB7490 user.notice root: S  1394   149 /usr/bin/aha
Jan  1 01:00:48 FB7490 user.notice root: S  1414     1 wpa_supplicant -g /var/ru
Jan  1 01:00:48 FB7490 user.notice root: S  1432     1 /bin/run_clock -c /dev/tf
Jan  1 01:00:48 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan  1 01:00:48 FB7490 user.notice root: S  1446     1 busybox syslogd -C1024
[COLOR="#00FF00"]Jan  1 01:00:48 FB7490 user.notice root: S  1451   149 {test} /bin/sh -x /var/tm[/COLOR]
Jan  1 01:00:48 FB7490 user.notice root: S  1457     1 /sbin/nmbd
[COLOR="#00FF00"]Jan  1 01:00:48 FB7490 user.notice root: S  1466  1451 {busybox} sleep 10[/COLOR]
Jan  1 01:00:48 FB7490 user.notice root: S  1477  1149 {busybox} sleep 1
Jan  1 01:00:48 FB7490 user.notice root: S  1486  1144 {busybox} sleep 1
Jan  1 01:00:48 FB7490 user.notice root: S  1495  1143 {webdav_control} /bin/sh
Jan  1 01:00:48 FB7490 user.notice root: R  1502   149 {busybox} ps l
Jan  1 01:00:48 FB7490 user.notice root: S  1503   149 {rc.S} /bin/sh /etc/init.
Jan  1 01:00:48 FB7490 user.notice root: D  1505  1495 /bin/webdavcfginfo -p hos
Jan  1 01:00:48 FB7490 user.notice root: R  1508  1347 {busybox} pidof upnpdevd
Jan  1 01:00:48 FB7490 user.notice root: R  1509  1503 {busybox} logger -- S
[COLOR="#FF0000"]Jan  1 01:00:50 FB7490 user.notice root: [1451] Trap HUP received for 1451
Jan  1 01:00:50 FB7490 user.notice root: [1451] is looping, count = 2
Jan  1 01:00:50 FB7490 user.notice root: [1451] PPID changed to 1
[/COLOR]Jan  1 01:00:50 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan  1 01:00:52 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan  1 01:00:54 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan  1 01:00:54 FB7490 user.info capiotcp_server[1840]:   capiotcp_server - Version 0.1.01.05   TCP/UDP Port = 5031     MaxCntrl     = 5        OffsetCntrl  = 0
Jan  1 01:00:56 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan 29 00:37:45 FB7490 user.err ctlmgr[991]: WLANLIB: wland_role_config_init:100: CFG2/API: WLAND configuration file(/var/tmp/wlan_roles) missing.
Jan 29 00:37:46 FB7490 user.notice root: [1451] is looping, count = 3
Jan 29 00:37:47 FB7490 authpriv.info dropbear[2155]: Running in background
Jan 29 00:37:47 FB7490 user.err telefon[1236]: set initial telefon time from linux time to 0:37:47 29.01 2015!
Jan 29 00:37:48 FB7490 user.notice Dropbear: Dropbear service was started
Jan 29 00:37:48 FB7490 cron.info crond[2205]: crond: crond (busybox 1.22.1) started, log level 8
Jan 29 00:37:50 FB7490 user.notice ShowVPNState: ShowVPNState service was started
Jan 29 00:37:51 FB7490 user.notice NoAutoIP: NoAutoIP service started, next run scheduled at 29.01. 00:53
Jan 29 00:37:57 FB7490 user.notice root: [1451] is looping, count = 4
Jan 29 00:37:58 FB7490 user.err dsld[1031]: Sync!!!!!!; vdsl_available=1
Jan 29 00:37:58 FB7490 user.err dsld[1031]: nr=0, dsld.udslinterfaces[nr]=0x44bf24, attached=1
Jan 29 00:37:58 FB7490 user.err dsld[1031]: dsl_encap=1, use_dhcp=1
Jan 29 00:37:58 FB7490 user.err dsld[1031]: nr=2, dsld.udslinterfaces[nr]=0x44c00c, attached=1
Jan 29 00:37:58 FB7490 user.err dsld[1031]: dsl_encap=4, use_dhcp=1
Jan 29 00:37:58 FB7490 user.err dsld[1031]: syncdelaytimer: 3 secs
Jan 29 00:37:58 FB7490 user.err dsld[1031]: sync_group->syncdelaytimer=720097664
Jan 29 00:38:01 FB7490 user.err dsld[1031]: !!!!!!!!!!!!!!!!!route_add: default: metric=2, iface=dsl
Jan 29 00:38:01 FB7490 user.err dsld[1031]: udslinterface_set_forwardrules: group=2
Jan 29 00:38:01 FB7490 user.err dsld[1031]: udsliface=0(0x44bf24), udsliface->attached=1, udsliface->enabled=1
Jan 29 00:38:01 FB7490 user.err dsld[1031]: udsliface=2(0x44c00c), udsliface->attached=1, udsliface->enabled=1
Jan 29 00:38:07 FB7490 user.notice root: [1451] is looping, count = 5
Jan 29 00:38:17 FB7490 user.notice root: [1451] is looping, count = 6
Jan 29 00:38:23 FB7490 user.notice CRLUpdate: CRLUpdate service started, next update scheduled at 30.01. 00:39
Jan 29 00:38:26 FB7490 user.notice STunnel: STunnel service was started
Jan 29 00:38:27 FB7490 user.notice root: [1451] is looping, count = 7
Jan 29 00:38:33 FB7490 daemon.info chronyd[3161]: chronyd version 1.25-pre1 starting
Jan 29 00:38:33 FB7490 daemon.info chronyd[3161]: Initial txc.tick=10000 txc.freq=0 (0.00000000) txc.offset=0 => hz=100 shift_hz=7
Jan 29 00:38:33 FB7490 daemon.info chronyd[3161]: set_config_hz=0 hz=100 shift_hz=7 basic_freq_scale=1.28000000 nominal_tick=10000 slew_delta_tick=833 max_tick_bias=1000
Jan 29 00:38:33 FB7490 daemon.info chronyd[3161]: Linux kernel major=2 minor=6 patch=32
Jan 29 00:38:33 FB7490 daemon.info chronyd[3161]: calculated_freq_scale=1.00000000 freq_scale=1.00000000
Jan 29 00:38:33 FB7490 daemon.warn chronyd[3161]: Could not open driftfile /var/tmp/chrony.drift for reading
Jan 29 00:38:37 FB7490 user.notice root: [1451] is looping, count = 8
Jan 29 00:38:37 FB7490 daemon.info chronyd[3161]: Selected source 192.168.0.1
Jan 29 00:38:41 FB7490 user.notice VPN: Added a route to remote address or network (192.168.234.0/24) via dev dsl
Jan 29 00:38:41 FB7490 user.notice ShowVPNState: VPN connection 'RemoteBox' changed state from 'not active' to 'ready'.
Jan 29 00:38:47 FB7490 user.notice root: [1451] is looping, count = 9
Jan 29 00:38:57 FB7490 user.notice root: [1451] is looping, count = 10
Jan 29 00:39:07 FB7490 user.notice root: [1451] is looping, count = 11
Jan 29 00:39:17 FB7490 user.notice root: [1451] is looping, count = 12
Jan 29 00:39:27 FB7490 user.notice root: [1451] Trap EXIT received for 1451
Interessant in diesem Zusammenhang ist ja die Tatsache, daß beim Start von /var/tmp/test noch der Prozess für die Abarbeitung der /etc/init.d/rc.S (PID 149) der Parent-Prozess war (blau gekennzeichnet im Log beim Start von 'test' und die grünen Zeilen in der Prozess-Liste).

Wenn dann die Abarbeitung der inittab-Anweisung (dort wird die rc.S ja gestartet) beendet ist, kommt es zu einem SIGHUP an das gestartete Skript (die roten Zeilen) und der Normalfall wäre jetzt ein SIGSTOP vom HUP-Handler an den Prozess. Komischerweise wird aber in dieser Konstellation offenbar der Prozess jetzt doch noch "detached" und die Parent-PID ändert sich dabei auf den Parent-Prozess des nunmehr terminierten Prozesses 149 ... das wäre dann die PID 1 und damit der init-Prozess selbst.

Damit stellt sich für mich eigentlich die Frage, wer/welche Option ist nun am Ende für die abweichende Behandlung von SIGHUP (also "detach" anstelle von SIGSTOP) verantwortlich? Offenbar ändert sich ja da etwas von der 7390 zur 7490.

Nun ist die Behandlung von SIGHUP ja theoretisch die Aufgabe der Standard-Library und da wird für die glibc eben definiert:
glibc schrieb:
Any child processes of the process being terminated are assigned a new parent process. (On most systems, including GNU, this is the init process, with process ID 1.)
Nun wird ja bei der FRITZ!Box die uClibc anstelle der glibc verwendet, hat jemand von den Toolchain-Leuten etwas von einem geänderten Verhalten der uClibc beim Handling dieser Signale gelesen? Ich finde - trotz ausgiebiger Suche - einfach nichts dazu in den Changelogs der uClibc.

Oder hat jemand noch eine andere Idee, wie das abweichende Verhalten unter Freetz-Bedingungen (denn bei meinem Test ist zwar die Busybox mit der Freetz-Toolchain erstellt, aber es ist eben kein Freetz-Image und die Busybox verwendet die originale libuClibc-0.9.33.2.so von AVM bei mir) zustande kommen kann? Gibt es da irgendwo eine Kompatibilitätsoption bei der uClibc?

Wie das jetzt bei eisbaerin zum Abbruch des Child-Prozesses in so einem Falle mit originaler uClibc kommt, kann ich mir irgendwie auch nicht erklären. Meine Bitte an die Leute, bei denen diese Abbrüche auftreten, wäre die probeweise Ausführung des oben angeführten Skripts (geht natürlich nur bei einer Busybox mit syslogd, logger und logread, sonst wird das auch nichts), damit man vielleicht mal sehen kann, wo und wie (welche Signale) da dann tatsächlich abgebrochen wird.

Für mich sieht das nach einem Problem/einer Inkompatibilität der uClibc für das Freetz-Targetsystem aus ... da die bei der 7390 auch nicht auftritt (da habe ich noch gcc-4.8.3 + uClibc 0.9.33.2 getestet, bei der 7490 ist gcc-4.8.4 + uClibc 0.9.33.2 im Einsatz), kann ich mir nur unterschiedliche Optionen beim Bauen der uClibc als Ursache vorstellen, denn der Compiler ist aus meiner Sicht in die "process termination" nicht involviert. Den definitiven Test mit der Freetz-uClibc anstelle der AVM-Version bei gleicher Busybox kann ich leider im Moment nicht machen, mir fehlt die Reserve-7490 zum Spielen und auf der Produktiv-Box habe ich kein Freetz ... aber vielleicht hat ja jemand anderes die Kombination aus BB 1.22.1 mit gcc 4.8.4 + uClibc 0.9.33.2 (die Freetz-Version) am Start.
 
Interessant in diesem Zusammenhang ist ja die Tatsache, daß beim Start von /var/tmp/test noch der Prozess für die Abarbeitung der /etc/init.d/rc.S (PID 149) der Parent-Prozess war
Das ist normal und liegt daran, dass /etc/init.d/rc.S die Datei debug.cfg per source (Punkt ".") einliest.
Wenn dann die Abarbeitung der inittab-Anweisung (dort wird die rc.S ja gestartet) beendet ist, kommt es zu einem SIGHUP an das gestartete Skript (die roten Zeilen) und der Normalfall wäre jetzt ein SIGSTOP vom HUP-Handler an den Prozess.
Wenn kein Signal-Handler gesetzt wird, ist bei den meisten Signalen der Default, den Prozess zu beenden. Dies hat nichts mit irgend einem anderen Signal zu tun, insbesondere nicht mit SIGSTOP.
Komischerweise wird aber in dieser Konstellation offenbar der Prozess jetzt doch noch "detached" und die Parent-PID ändert sich dabei auf den Parent-Prozess des nunmehr terminierten Prozesses 149 ... das wäre dann die PID 1 und damit der init-Prozess selbst.
Das ist nicht korrekt, zumindest nicht die Begründung. Wenn der Parent-Prozess beendet wird (in diesem Fall 149), dann wird die Parent-PID grundsätzlich auf 1 gesetzt, unabhängig davon, ob dies dies auch der Parent-Pzozess von PID 149 war.
Damit stellt sich für mich eigentlich die Frage, wer/welche Option ist nun am Ende für die abweichende Behandlung von SIGHUP (also "detach" anstelle von SIGSTOP) verantwortlich?
Die Abweichende Behandlung von SIGHUP kommt deswegen, weil das Skript einen SIGHUP Handler installiert. Dieser schreibt eine Ausgabe ins Protokoll und insbesondere beendet er den Prozess nicht, daher läuft dieser weiter. Wenn kein Handler installiert wird, dann wird der Prozess beendet. Der SIGHUP Handler im Skript macht kein "detach", sondern beendet nur den Prozess nicht. SIGSTOP hat mit dem Ganzen hier nichts zu tun.
Nun ist die Behandlung von SIGHUP ja theoretisch die Aufgabe der Standard-Library und da wird für die glibc eben definiert:
Nun wird ja bei der FRITZ!Box die uClibc anstelle der glibc verwendet, hat jemand von den Toolchain-Leuten etwas von einem geänderten Verhalten der uClibc beim Handling dieser Signale gelesen? Ich finde - trotz ausgiebiger Suche - einfach nichts dazu in den Changelogs der uClibc.
Die Behandlung von SIGHUP ist nicht Aufgabe der Standard-Library, und die Dokumentation von uClibc sagt deswegen zu dem Thema nichts aus, weil es nichts mit der Library zu tun hat, sondern mit dem Kernel. Die Referenz oben beschreibt das Verhalten des Kernels.
Oder hat jemand noch eine andere Idee, wie das abweichende Verhalten unter Freetz-Bedingungen (denn bei meinem Test ist zwar die Busybox mit der Freetz-Toolchain erstellt, aber es ist eben kein Freetz-Image und die Busybox verwendet die originale libuClibc-0.9.33.2.so von AVM bei mir) zustande kommen kann? Gibt es da irgendwo eine Kompatibilitätsoption bei der uClibc?
Der Unterschied wird sein, dass es sich um verschiedene Versionen der Busybox handelt.
Es kommen hauptsächlich zwei mögliche Ursachen in Frage: in der einen Version wird entweder SIGHUP nicht gesendet oder es wird ignoriert, in der andere wird SIGHUP gesendet und nicht ignoriert.
 
@RalfFriedl:
Ok, Du warst tatsächlich nicht der Adressat dieses Beitrags und in meinem Bestreben, den Hintergrund der Geschichte und die Herleitung zu verdeutlichen ohne allzu sehr abzuschweifen, war ich etwas zu ungenau, um Deinen hohen Anforderungen an die Präzision genügen zu können ... und so habe ich mich tatsächlich beim Unterschied von SIGKILL/SIGTERM (beim Beenden zusammen mit dem Parent) vs. SIGSTOP/SIGTSTP/SIGCONT (wenn das Kind überleben darf) nicht klar genug ausgedrückt - auch wenn sich das für mich auf den ersten Blick noch logisch las, es ist schlicht falsch, wie es da steht ... da hast Du vollkommen recht.

Nur ein Prozess, dessen "session leader" beendet wird und der sich in einem "suspended state" befindet (ob durch SIGSTOP/SIGTSTP oder wegen Wartens auf irgendwelche anderen Ereignisse ist m.W. egal), erhält neben dem SIGHUP als Benachrichtigung über den Tod der Eltern (oder eines Elternteils, er ist ja per Definition Halbwaise) noch ein zusätzliches SIGCONT. Wenn er nicht ohnehin "suspended" ist, kriegt er wohl tatsächlich keine STOP/CONT-Signale, auch nicht zum "Anhalten" vor dem Aufräumen (wenn er ein Todeskandidat ist).

Das ändert aber nichts daran, daß das Skript bei mir auch ohne installierte Trap für SIGHUP (und auch ohne alle anderen Trap-Handler) nicht beim Beenden von rc.S gekillt wird ... dann kann/muß es da also noch einen anderen SIGHUP-Handler geben. Der Ablauf ist ja eigentlich vollkommen korrekt, es sollte zuerst ein SIGHUP an eine "orphaned process group" gehen und dann - wenn auf dieses Signal nicht mit dem Beenden reagiert wird - ein SIGCONT als Zeichen für die Fortsetzung. Wenn man das Skript von einer Terminal-Session aus mit C-Z anhält und dann per fg/bg weiter arbeiten läßt, wird auch TSTP/CONT signalisiert, daher hatte ich erwartet, daß auch hier ein CONT an das Skript signalisiert (und von diesem dann protokolliert) wird, aber es ist wohl nicht "angehalten", sondern nur nicht "an der Reihe" zum Zeitpunkt der Beendigung des Parent-Prozesses (wobei ich die Umsetzung von "sleep" auch irgendwie über STOP/CONT/ALRM erwartet hätte, allerdings ohne es zu überprüfen).

Wenn nun tatsächlich für die Behandlung von SIGHUP in der stdlib keinerlei Vorsorge getroffen wird (das würde dann ja auch erklären, warum ich in den uClibc-Quellen dazu nichts gefunden habe auf Anhieb bei meiner Suche), dann könnte ja der Unterschied in der Behandlung durch den Kernel liegen ... das hatte ich auch ins Kalkül gezogen - daher die Frage "wer ist verantwortlich", bis mich die Beschreibung der "Termination Internals" bei der glibc erst einmal zufrieden stellte (und dann vielleicht auch auf falsche Überlegungen brachte). Wurden denn da Änderungen im 2.6-Kernel vorgenommen zwischen 2.6.28 und 2.6.32 - das wäre dann die zu klärende Frage.

Das ist nicht korrekt, zumindest nicht die Begründung. Wenn der Parent-Prozess beendet wird (in diesem Fall 149), dann wird die Parent-PID grundsätzlich auf 1 gesetzt, unabhängig davon, ob dies dies auch der Parent-Pzozess von PID 149 war.
Ich hoffe tatsächlich, daß Du bereit bist, das unter "Herleitung" (Beobachtungen -> Überlegungen -> These -> Verifikation) zu verbuchen, denn das Zitat aus der glibc-Doc später in meinem Beitrag sagt das ja auch schon und das hatte ich tatsächlich gelesen und auch (für mich) richtig übersetzt und verstanden.

Das "Verstehen" ist allerdings bei der Verantwortung für das Aufsetzen einer sighandler-Kette für Shell-Skripte in der Busybox mit uClibc im Speziellen (nicht im Allgemeinen) tatsächlich nicht der Fall ist, denn die uClibc bietet schon einige "Spezialitäten" ggü. der glibc z.B. beim execvp(e) (ab Zeile 253) - der Aufruf von "/bin/sh" mit der angegebenen Datei (wenn die im cwd existiert und nx ist) als "Workaround" ist jedenfalls nicht der "Normalfall" (und obendrein voller Gottvertrauen, daß da die richtige Shell schon irgendwie verlinkt sein wird - aber bestimmt ist das irgendwo dokumentiert und ich habe es nur nicht gefunden, das wäre auch möglich).

Die Abweichende Behandlung von SIGHUP kommt deswegen, weil das Skript einen SIGHUP Handler installiert. Dieser schreibt eine Ausgabe ins Protokoll und insbesondere beendet er den Prozess nicht, daher läuft dieser weiter. Wenn kein Handler installiert wird, dann wird der Prozess beendet. Der SIGHUP Handler im Skript macht kein "detach", sondern beendet nur den Prozess nicht. SIGSTOP hat mit dem Ganzen hier nichts zu tun.
Ok, das habe ich oben vorweg genommen ... ich fasse noch einmal zusammen:

Wenn es tatsächlich nur eine Frage der "exit"-Behandlung im Kernel ist (weil niemand vorher irgendwo einen SigHandler installiert hat), dann müßte ja zwischen den Kernel-Versionen (2.6.28.xx bei 7390 und 2.6.32.xx bei 7490) ein Unterschied bestehen. Zur Busybox-These komme ich gleich noch ...

Die Behandlung von SIGHUP ist nicht Aufgabe der Standard-Library, und die Dokumentation von uClibc sagt deswegen zu dem Thema nichts aus, weil es nichts mit der Library zu tun hat, sondern mit dem Kernel. Die Referenz oben beschreibt das Verhalten des Kernels.
Hat sich das Verhalten des Kernels denn geändert? Nur Deines Wissens, Du mußt meinetwegen jetzt nicht suchen, obwohl ich auch nicht fündig geworden bin ... habe aber auch noch keine Quellen dafür gesucht und verglichen, nur eine Suchmaschine mit wechselnden Begriffen dazu befragt.

Du beschreibst das Setzen der PPID eines "orphaned childs" auf die init-PID als Standardverhalten des Kernels - ich nehme mal an, das kann dann ja nur die direkte Reaktion auf den "exit"-Syscall für den Parent-Prozess sein, anders erhält der Kernel ja keine Kenntnis vom (geplanten) Ableben eines Prozesses.
Dann müßte ja aber jeder Prozess, der seine eigenen Childs nicht selbst ordentlich abräumt, immer zusätzliche Childs von init hinterlassen - und die würden dann nach meinem Verständnis sogar noch an der Resourcenzuteilung teilnehmen. Ist das tatsächlich so? :gruebel: Wenn der beendete Prozess ein "session leader" ist, wird er m.E. anders behandelt, als wenn er keiner ist - ich bin mir aber tatsächlich nicht sicher, wer dafür die Verantwortung trägt.

Wer räumt denn dann (außer der stdlib-atexit-Behandlung, wenn man keine eigene installiert) hinter einem abgestürzten Prozess auf? Nicht alle Childs werden ja über entsprechende Exceptions sterben, wenn sie irgendwie auf geschlossene Files u.a. zugreifen.

Wie kommen dann "zombies" zustande, also Prozesse, deren Parent nicht mehr existiert/beendet wurde, die aber ihrerseits auf ein Kill-Signal nicht richtig reagieren, weil irgendwo ein anderer Deadlock o.ä. die Behandlung des Signals verhindert?

Theoretisch spielen doch in diesem Kontext auch zwei zusätzliche Syscalls eine Rolle, oder? Einmal setpgid für die Zuweisung eines Prozesses zu einer anderen Prozess-Gruppe (er bleibt aber weiterhin Child der Session und erhält die Signalisierung beim Ende der Session) und setsid für die Zuweisung zu einer anderen Session, die auch dann "überlebt", wenn die startende Session ihre Prozess-Gruppen abräumt, weil sie beendet wird.

Was wird da nun tatsächlich verwendet und gibt es einen Unterschied zwischen "source" und "sh", wenn dann im ausgeführten Script mit JobControl (das ist das & am Ende ja) eine neue Prozess-Gruppe erstellt wird oder liegt das am Ende doch nur am Parent des aufrufenden Prozesses (konkret für die FRITZ!Box, nicht für ein beliebiges System)?

Und die Behandlung (nicht das Senden, das mag tatsächlich vom exit-Syscall erfolgen) von SIGHUP unter der Beachtung des Bedingungen für Foreground-/Background-Jobs (also "POSIX job control") ist dann nach meinem Verständnis trotzdem Sache der Busybox oder der stdlib. Wenn bei identischer Busybox (deshalb die Bitte um einen Test mit anderer stdlib) ein abweichendes Verhalten festzustellen wäre, würde ich die Ursache irgendwie schon in der stdlib suchen. Warum wäre das falsch?

Der Unterschied wird sein, dass es sich um verschiedene Versionen der Busybox handelt.
Das gilt vielleicht noch für eisbaerin vs. meine Tests ... bei Freetz für 7490/06.2x vs. mein Test dürfte das eher nicht zutreffen, denn es sind beide BB 1.22.1 und ich finde auch keine passende BB-Option. Der Kernel ist da auch derselbe (auch wenn der TE nicht geschrieben hat, daß er kein "replace kernel" verwendet, unterstelle ich das einfach mal) und damit fällt für meine Begriffe eine unterschiedliche Behandlung des exit-Syscalls (oder ein atexit-Hook auf Kernel-Ebene bzw. in der Busybox) ebenfalls aus. Also bleibt für mich nur noch ein Unterschied in einer dazwischen liegenden "Schicht" (also zwischen BB und Kernel) und da erschien/erscheint mir die Verantwortung der stdlib (egal welcher) durchaus plausibel.

Wie erklärst Du Dir das unterschiedliche Verhalten ansonsten (gesetzt den Fall, der TE hat tatsächlich keinen eigenen Kernel)?

Es kommen hauptsächlich zwei mögliche Ursachen in Frage: in der einen Version wird entweder SIGHUP nicht gesendet oder es wird ignoriert, in der andere wird SIGHUP gesendet und nicht ignoriert.
Das ist sicherlich ein interessanter Punkt. Ob SIGHUP gesendet wird und da tatsächlich eine Behandlung stattfindet, läßt sich ja mit dem Test-Skript durchaus feststellen. Wenn der Trap-Handler das Signal "erschöpfend" bearbeitet und der Abbruch mit diesem Handler nicht erfolgt, wäre ein entsprechender SigHandler plausibel, der die Verarbeitung des Prozesses ansonsten beenden würde (natürlich mit TERM/KILL und nicht mit STOP, das war falsch (mindestens unklar) formuliert). Wenn auch da das Skript nach Start aus der rc.custom beendet wird, liegt die Ursache nicht in einer (fehlenden) Behandlung von SIGHUP.

Der Unterschied kommt vielleicht auch erst später? Die rc.mod wird noch per "source"-Statement vom init-Prozess (bzw. von rc.S) aufgerufen. Bis dahin dürfte der Unterschied zwischen den Rechten der S99-Files in /etc/init.d noch keine Rolle spielen (S99-zzz-rcmod hat kein x gesetzt), da dort auch kein execvp benutzt werden dürfte (ich rechne fest damit, daß da nur bis zum EOF der Datei stdin für den Interpreter ersetzt wird, aber auch das ist nicht verifiziert).

Der entscheidende Unterschied könnte jedoch der explizite Aufruf der rc.custom über "sh rc.custom" sein, da wird dann nichts mehr ge"source"d. Das erklärt dann aber (wenn es nicht andere zusätzliche Faktoren gibt) wieder nicht den Unterschied 7390/7490, denn das ändert sich im Freetz-Mod ja nicht.

Ich könnte mir aber immer noch vorstellen (deshalb will ich ja darüber diskutieren und mich nicht nur wie ein Bekloppter durch irgendwelche Quellen wühlen), daß es tatsächlich einen Unterschied macht, ob der Parent-Prozess direkt von init gestartet wurde (wie bei rc.S-Abarbeitung in der FRITZ!Box) oder ob da noch ein Session-Manager (ich nenne den telnetd oder einen sshd o.ä. jetzt mal so, es geht um die Verwaltung von (Pseudo-)Terminals) "dazwischen" ist. Spätestens beim Überblick über die aktiven Background-Jobs kommt dann ja wieder eine unterschiedliche Ende-Behandlung zwischen einer Terminal-Session und einem System-Prozess zum Tragen (mit der Entscheidung für einen Abbruch oder nicht, ansonsten bräuchte es keine Software wie "screen" o.ä.) ... jedenfalls nach meinem begrenzten Verständnis. Und spätestens bei der Frage, wie das festgestellt wird, könnte dann tatsächlich die Ursache für das unterschiedliche Verhalten (Abbruch bei Start aus rc.custom, wo der zusätzliche "sh"-Start aus der rc.mod "dazwischen" ist und der Fortsetzung beim Sourcen in der rc.tail.sh, wie ich es zum Test auf der 7490 gemacht habe) liegen.

Der "normale" Vorgang beim Starten eines neuen Prozesses ist ja ein fork(), gefolgt von einem exec() (die verschiedenen exec-Varianten fassen wir mal so zusammen, funktionell sollte es nach meinen Begriffen keinen Unterschied machen), wo dann das eigentlich auszuführende File geladen wird. Damit unterscheidet sich aber ein solcher Child-Prozess erst einmal nicht von mehreren Threads innerhalb eines Prozesses (wir lassen clone() vs. fork() im MT-Kontext mal bitte außer Acht) und muß erst irgendwie über entsprechende Syscalls "separiert" werden, wenn es ein "wirklich unabhängiger Prozess" werden soll. Ist da exec() wirklich schon der alles entscheidende Faktor? Nach meinem Verständnis ändert das exec() alleine weder die Prozess-Hierarchie noch die "personality" (solange das neue Image kein setuid/setgid-Flag mitbringt). Die "disassociation from the controlling terminal" kann m.E. nur über eine andere Session-ID erfolgen.

Wie das bei einem "richtigen" System mit bash und glibc läuft, ist mir schon klar ... da sind aber einige Unterschiede/Widersprüche für mich in der Reaktion des Embedded-Systems der FRITZ!Box und die basieren - immer nur nach meinem Verständnis, das betone ich gerne noch einmal - auf der Busybox und der uClibc (wenn nicht eine andere Verarbeitung im Kernel erfolgt) - wenn nicht, wo liegen sie dann?

Ich will/werde trotzdem kein Freetz auf 7490 aufsetzen, um das anhand der rc.custom selbst zu testen. Es geht mir persönlich eher nicht nahe, ich bin nur neugierig, was am Ende die Ursache ist. Ich suche also keinen Workaround oder eine funktionierende Lösung, ich suche - eben aus reinem Interesse - eine schlüssige Erklärung für unterschiedliches Verhalten. Thesen dazu kann ich mir genug vorstellen, die tatsächliche Ursache ist das Ziel der Erkenntnis.

Das ist jetzt sicherlich etwas spezieller geworden (damit schwerer zu lesen), als ich es ursprünglich vorhatte und nicht mehr direkt im Zusammenhang mit dem Thema "rc.custom & Beenden von Childs" ... aber ich wurde "gezwungen". ;)
 
Nur ein Prozess, dessen "session leader" beendet wird und der sich in einem "suspended state" befindet (ob durch SIGSTOP/SIGTSTP oder wegen Wartens auf irgendwelche anderen Ereignisse ist m.W. egal), erhält neben dem SIGHUP als Benachrichtigung über den Tod der Eltern (oder eines Elternteils, er ist ja per Definition Halbwaise) noch ein zusätzliches SIGCONT. Wenn er nicht ohnehin "suspended" ist, kriegt er wohl tatsächlich keine STOP/CONT-Signale, auch nicht zum "Anhalten" vor dem Aufräumen (wenn er ein Todeskandidat ist).
Es kann durchaus sein, dass die Eigenschaft "session leader" der entscheidende Unterschied ist, evtl. im init Prozess der Busybox Versionen. Die Eigenschaft "session leader" ist wichtig für Job Control.

Wenn nun tatsächlich für die Behandlung von SIGHUP in der stdlib keinerlei Vorsorge getroffen wird (das würde dann ja auch erklären, warum ich in den uClibc-Quellen dazu nichts gefunden habe auf Anhieb bei meiner Suche), dann könnte ja der Unterschied in der Behandlung durch den Kernel liegen ... das hatte ich auch ins Kalkül gezogen - daher die Frage "wer ist verantwortlich", bis mich die Beschreibung der "Termination Internals" bei der glibc erst einmal zufrieden stellte (und dann vielleicht auch auf falsche Überlegungen brachte). Wurden denn da Änderungen im 2.6-Kernel vorgenommen zwischen 2.6.28 und 2.6.32 - das wäre dann die zu klärende Frage.
Ich glaube nicht, dass es Unterschiede im Kernel gibt. Normalerweise wird sehr darauf geachtet, dass die Schnittstelle nach Außen gleich bleibt.
Die Beschreibung der "Termination Internals" bei der glibc ist durchaus korrekt. Es ist aber nicht die Library, die für dieses Verhalten zuständig ist, sondern der Kernel. Das wird auch der Grund sein, warum bei uClibc dieses Verhalten nicht dokumentiert es, es hat letztlich nichts mit der Library zu tun. Andererseits ist die Information durchaus interessant, daher ist es sinnvoll, diese Beschreibung zu haben.

Das "Verstehen" ist allerdings bei der Verantwortung für das Aufsetzen einer sighandler-Kette für Shell-Skripte in der Busybox mit uClibc im Speziellen (nicht im Allgemeinen) tatsächlich nicht der Fall ist, denn die uClibc bietet schon einige "Spezialitäten" ggü. der glibc z.B. beim execvp(e) (ab Zeile 253) - der Aufruf von "/bin/sh" mit der angegebenen Datei (wenn die im cwd existiert und nx ist) als "Workaround" ist jedenfalls nicht der "Normalfall" (und obendrein voller Gottvertrauen, daß da die richtige Shell schon irgendwie verlinkt sein wird - aber bestimmt ist das irgendwo dokumentiert und ich habe es nur nicht gefunden, das wäre auch möglich).
Ich gehe davon aus, dass das so dokumentiert ist, es wäre sonst nicht nachvollziehbar, dass extra Code in eine Library eingebaut wird, die versucht klein zu sein.
Du beschreibst das Setzen der PPID eines "orphaned childs" auf die init-PID als Standardverhalten des Kernels - ich nehme mal an, das kann dann ja nur die direkte Reaktion auf den "exit"-Syscall für den Parent-Prozess sein, anders erhält der Kernel ja keine Kenntnis vom (geplanten) Ableben eines Prozesses.
Dann müßte ja aber jeder Prozess, der seine eigenen Childs nicht selbst ordentlich abräumt, immer zusätzliche Childs von init hinterlassen - und die würden dann nach meinem Verständnis sogar noch an der Resourcenzuteilung teilnehmen. Ist das tatsächlich so? :gruebel: Wenn der beendete Prozess ein "session leader" ist, wird er m.E. anders behandelt, als wenn er keiner ist - ich bin mir aber tatsächlich nicht sicher, wer dafür die Verantwortung trägt.

Wer räumt denn dann (außer der stdlib-atexit-Behandlung, wenn man keine eigene installiert) hinter einem abgestürzten Prozess auf? Nicht alle Childs werden ja über entsprechende Exceptions sterben, wenn sie irgendwie auf geschlossene Files u.a. zugreifen.

Wie kommen dann "zombies" zustande, also Prozesse, deren Parent nicht mehr existiert/beendet wurde, die aber ihrerseits auf ein Kill-Signal nicht richtig reagieren, weil irgendwo ein anderer Deadlock o.ä. die Behandlung des Signals verhindert?
Das Setzen der PPID auf 1 ist die direkte Folge davon, dass der Parent-Prozess komplett freigegeben wird und damit dessen PID frei wird. Dies wiederum ist indirekt Folge davon, dass der Parent-Prozess beendet wird. Eine mögliche Ursache für das Beenden eines Prozesses ist der exit-Syscall. Nur der Kernel kann die PPID ändern.

Es ist richtig, dass ein Prozess, der seine eigenen Childs nicht abräumt, diese in der Prozesstabelle stehen lässt, was Ressourcen belegt hält (Speicher und PIDs, nicht CPU) und in größerer Anzahl durchaus problematisch sein kann. Genau diese beendeten Child-Prozesse sind die Zombies. Die Zombie Prozesse reagieren deswegen nicht auf ein Kill-Signal (oder andere Signale), weil sie eben schon beendet sind. Es gibt nichts mehr, was sie als Reaktion auf ein Signal tun könnten. Es gibt da keinen Deadlock, der die Behandlung eines Signals verhindern würde. Zombies sind nicht Prozesse, die keinen Parent haben, weil jeder Prozess einen Parent hat. Dieser Parent ist entweder der Prozess, von dem er erzeugt wurde, oder nach Beendigung des ursprünglichen Parents ist es PID 1. Ein Prozess, der seine eigenen Childs nicht abräumt, hinterlässt als Zombies nicht Childs von init, sondern von sich selbst. Sobald dieser Prozess aber beendet werden, werden die Childs dieses Prozesses zu Childs von init. Da init aber abräumt, werden diese Zombies dann in kürzester Zeit freigegeben.

Theoretisch spielen doch in diesem Kontext auch zwei zusätzliche Syscalls eine Rolle, oder? Einmal setpgid für die Zuweisung eines Prozesses zu einer anderen Prozess-Gruppe (er bleibt aber weiterhin Child der Session und erhält die Signalisierung beim Ende der Session) und setsid für die Zuweisung zu einer anderen Session, die auch dann "überlebt", wenn die startende Session ihre Prozess-Gruppen abräumt, weil sie beendet wird.
Die Prozess-Gruppe sollte keine Rolle spielen, mit setsid wird nicht eine Session zugewiesen, sondern einen neue Session angelegt. Man kann damit also nicht einen Prozess in eine bereits bestehende Session bringen.
Was wird da nun tatsächlich verwendet und gibt es einen Unterschied zwischen "source" und "sh", wenn dann im ausgeführten Script mit JobControl (das ist das & am Ende ja) eine neue Prozess-Gruppe erstellt wird oder liegt das am Ende doch nur am Parent des aufrufenden Prozesses (konkret für die FRITZ!Box, nicht für ein beliebiges System)?
Mit source wird im Kontext der ursprünglichen Shell aufgerufen, mit sh wird eine neue Shell für das Skript gestartet. Ein & am Ende bedeutet nicht automatisch Job Control. Tatsächlich ist Voraussetzung für Job Control, dass die Shell ein session leader ist.

Und die Behandlung (nicht das Senden, das mag tatsächlich vom exit-Syscall erfolgen) von SIGHUP unter der Beachtung des Bedingungen für Foreground-/Background-Jobs (also "POSIX job control") ist dann nach meinem Verständnis trotzdem Sache der Busybox oder der stdlib. Wenn bei identischer Busybox (deshalb die Bitte um einen Test mit anderer stdlib) ein abweichendes Verhalten festzustellen wäre, würde ich die Ursache irgendwie schon in der stdlib suchen. Warum wäre das falsch?
Signale werden mit den kill Syscalls gesendet oder von Kernel selbst erzeugt.
Bei der Behandlung von Signalen gibt es drei Möglichkeiten: Ignorieren, Default Reaktion oder Programmspezifischer Handler. Die Default Reaktion ist bei vielen Signalen, den Prozess zu beenden. Es ist nicht Aufgabe der Library, ungefragt irgendwelche Signal Handler einzurichten. Aber die Anwendungsprogramme, z.B. Busybox, können natürlich Signal Handler einrichten.

Das ist sicherlich ein interessanter Punkt. Ob SIGHUP gesendet wird und da tatsächlich eine Behandlung stattfindet, läßt sich ja mit dem Test-Skript durchaus feststellen. Wenn der Trap-Handler das Signal "erschöpfend" bearbeitet und der Abbruch mit diesem Handler nicht erfolgt, wäre ein entsprechender SigHandler plausibel, der die Verarbeitung des Prozesses ansonsten beenden würde (natürlich mit TERM/KILL und nicht mit STOP, das war falsch (mindestens unklar) formuliert). Wenn auch da das Skript nach Start aus der rc.custom beendet wird, liegt die Ursache nicht in einer (fehlenden) Behandlung von SIGHUP.
Wie schon oben geschrieben kann es auch an der Eigenschaft session leader liegen, ob überhaupt ein Signal gesendet wird.
Wenn ein SIGHUP Signal empfangen wird und für dieses Signal kein Handler installiert ist, dann wird der Prozess beendet, und zwar mit SIGHUP und nicht SIGKILL. Wenn ein Signal Handler installiert ist, wird dieser ausgeführt, und dieser kann alles mögliche oder auch gar nichts tun, auch wenn es im letzteren Fall einfacher wäre, das Signal zu ignorieren.
Der "normale" Vorgang beim Starten eines neuen Prozesses ist ja ein fork(), gefolgt von einem exec() (die verschiedenen exec-Varianten fassen wir mal so zusammen, funktionell sollte es nach meinen Begriffen keinen Unterschied machen), wo dann das eigentlich auszuführende File geladen wird. Damit unterscheidet sich aber ein solcher Child-Prozess erst einmal nicht von mehreren Threads innerhalb eines Prozesses (wir lassen clone() vs. fork() im MT-Kontext mal bitte außer Acht) und muß erst irgendwie über entsprechende Syscalls "separiert" werden, wenn es ein "wirklich unabhängiger Prozess" werden soll. Ist da exec() wirklich schon der alles entscheidende Faktor? Nach meinem Verständnis ändert das exec() alleine weder die Prozess-Hierarchie noch die "personality" (solange das neue Image kein setuid/setgid-Flag mitbringt). Die "disassociation from the controlling terminal" kann m.E. nur über eine andere Session-ID erfolgen.
Ein Prozess wird durch fork erstellt. Ein execve danch ist zwar häufig, aber nicht zwangsläufig. Es gibt nur den Systemaufruf execve, alle anderen Varianten sind Library-Funktionen, die letztlich execve aufrufen. Bei Linux wird tatsächlich kein großer Unterschied zwischen Threads und Prozessen gemacht. Ein wichtiger Unterschied jedoch ist, dass beim Aufruf von execve alle Threads eines Prozesses beendet werden, außer dem, der execve aufruft. Tatsächlich geht es auch nicht anderes, weil execve das Speicherabbild des alten Programms freigibt, bevor das neue geladen wird. Der entscheidende Faktor für Erstellung eines neuen Prozesses ist der fork Aufruf (der als clone Aufruf mit passenden Flags realisiert wird). Es ist möglich, mit fork Prozesse anzulegen, die nie ein execve aufrufen, und es ist möglich, in einem Prozess mehrfach execve aufzurufen, ohne mit fork dafür neue Prozesse anzulegen.
Die Trennung vom controlling terminal erfolgt über eine neue Session, diese wird durch einen Aufruf von setsid erstellt.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.