Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Bash: Wie forken?

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.09.2006
    Beiträge
    120

    Question Bash: Wie forken?

    Ich brauche in einem Skript einen Child-Prozess und die PID davon.

    Nimmt man dafür am Besten

    bash <command> &

    und wie bekommt man die PID davon heraus?

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Jeder Aufruf eines (nicht bash-builtin-) Programms aus einer Shell (es sei denn, per exec gestartet) macht einen fork. Es reicht also einfach der Kommandoaufruf.

    Die PID kriegst Du z. B. über pidof oder ps raus. Eine nette Variante ist auch, bei einem in den Hintergrund geschickten Prozess (also Kommando &) sich die PID mittels des Bash-Builtins jobs -l zu holen.

    Jan

  3. #3
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von Linus Beitrag anzeigen
    und wie bekommt man die PID davon heraus?
    Nach "command &" einfach die Variable $! auslesen:
    Code:
    sleep 1m &
    echo $!

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.09.2006
    Beiträge
    120
    Zitat Zitat von BLUESCREEN3D Beitrag anzeigen
    Nach "command &" einfach die Variable $! auslesen:
    Code:
    sleep 1m &
    echo $!
    Aha, funktioniert das auch mit Funktionen?

  5. #5
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    @BLUESCREEN3D: Den Parameter $! hatte ich ganz vergessen - man wird alt ;-)

    Zitat Zitat von Linus Beitrag anzeigen
    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

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.09.2006
    Beiträge
    120
    Aha, danke

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •