Moin,
@BLUESCREEN3D: Den Parameter $! hatte ich ganz vergessen - man wird alt ;-)
Zitat von
Linus
Aha, funktioniert das auch mit Funktionen?
Ja, scheint so zu sein, wobei das aus dem bash-Manual nicht so deutlich hervorgeht:
Code:
...Functions are executed in the context of the current shell;
no new process is created to interpret them (contrast this with the
execution of a shell script)...
Wenn ich eine Funktion in den Hintergrund schicke, dann allerdings wird offenbar eine Subshell gestartet und deren PID kann ebenfalls mit $! abgefragt werden.
Was unterschiedlich zu externen, im Hintergrund gestarteten Programmen ist: Innerhalb der Funktion ist $$ immer noch die PID der startenden Shell und der laufende Prozess kann nicht mit der Job-Kontrolle der Bash gelistet oder gesteuert werden.
Ich habe das mal mit einem kleinen Testprogramm ausprobiert:
Code:
jan@jack:~/tmp> nl bash_child.sh
1 function my_sleep() {
2 x=0
3 while test $x -lt 100; do
4 x=`expr $x + 1`
5 sleep 2
6 done
7 }
8 tty
9 echo MAIN $$
10 ps -p $$ -o cmd,args
11 my_sleep &
12 echo HINTERGRUND $!
13 ps -p $! -o cmd,args
Ruft man jetzt das Script auf, dann erscheint folgende Ausgabe:
Code:
jan@jack:~/tmp> bash bash_child.sh
/dev/pts/2
MAIN 22588
CMD COMMAND
bash bash_child. bash bash_child.sh
HINTERGRUND 22591
CMD COMMAND
bash bash_child. bash bash_child.sh
Nimmt man in Zeile 11 das & weg und sieht sich die Prozessausgabe in einem anderen Fenster an, dann sieht das Ganze so aus:
Code:
jan@jack:~> ps -ef | grep pts/2
jan 7386 7050 0 18:30 pts/2 00:00:00 /bin/bash
jan 22951 7386 0 19:17 pts/2 00:00:00 bash bash_child.sh
jan 22959 22951 0 19:17 pts/2 00:00:00 sleep 2
Hier läuft also tatsächlich nur ein Prozess.
Jan
Lesezeichen