Ausführen eines Prozesses im Hintergrund

Ausführen eines Prozesses im Hintergrund

Ich habe 2 Fragen zum Starten der Prozesse im Hintergrund:

  1. Warum funktioniert das Starten eines Prozesses im Hintergrund so:

    ./my_program &

    ( my_programnatürlich muss die EXE-Berechtigung gesetzt sein) bewirkt die Bash nicht, dass die Eingabeaufforderung wie bei allen anderen Befehlen gedruckt wird? Es hinterlässt nur eine leere neue Zeile mit blinkendem Cursor.

  2. Wenn ich einen der nächsten neuen Prozesse im Hintergrund ausführe, zeigt Bash so etwas an:

    ./my_program & [30] 1439 [27] Done ./my_program [28] Done ./my_program [29] Done ./my_program

    bedeutet dies, dass das Starten weiterer zusätzlicher Prozesse im Hintergrund dazu führt, dass das System Informationen über die Vorschauprozesse ( [27], [28], [29] Zeilen) anzeigt, solange diese aktuell gestartet sind ( [30]Zeile)?

Antwort1

  1. Das sollte nicht passieren. Wenn Sie einen Befehl im Hintergrund ausführen, druckt Bash normalerweise nur die Jobnummer und die PID (siehe unten) und wechselt dann zurück zu einer Eingabeaufforderung.

    Der einzige mir bekannte Grund, der dazu führt, dass Bash in dieser Situation eine neue Zeile hinterlässt, ist, wenn Ihr Befehl tatsächlich nicht existiert, da nach dem Drucken von PS1 irgendwie die entsprechende Fehlermeldung ausgegeben wird:

    $ nonexistant_command &
    [1] 13856
    $
    nonexistant_command: command not found
    <empty line with blinking cursor here>
    

    Was auch immer die Ursache sein mag, wenn Sie in dieser leeren Zeile die Eingabetaste drücken, sollte eine neue Zeile mit Ihrer üblichen Eingabeaufforderung gedruckt werden (und möglicherweise die Meldung, dass der gerade gestartete Job beendet wurde; siehe unten).

  2. Die zusätzliche Ausgabe, die Sie sehen, ist Bash, das Sie über aktuelle Hintergrundjobs informiert:

    Zunächst wird Ihnen die aktuelle Jobnummer aller neu erstellten Hintergrundprozesse zusammen mit ihrer PID angezeigt, und zwar wie folgt:

    $ some_command &
    [1] 1234
    

    Dies bedeutet, dass der Befehl some_commandjetzt mit der PID 1234 als Job 1 ausgeführt wird.

    Wenn ein Hintergrundjob beendet ist, werden Sie von Bash beim nächsten Drucken einer Eingabeaufforderung darüber benachrichtigt (sei es, weil Sie einen anderen Hintergrundprozess gestartet, einen Befehl im Vordergrund ausgeführt oder einfach bei einer leeren Befehlszeile die Eingabetaste gedrückt haben), indem eine Meldung wie die folgende gedruckt wird:

    [1]  Done                    some_command
    

    Dies bedeutet, dass der ausgeführte Job mit der Nummer 1 some_commandnun beendet ist.

    Um herauszufinden, welche Hintergrundjobs Bash derzeit verfolgt, können Sie das jobsintegrierte Tool wie folgt verwenden:

    $ jobs
    [1]  Running                 some_command &
    [2]  Running                 some_other_command &
    

    Um einen Job in den Vordergrund zu bringen, können Sie Folgendes verwenden fg:

    $ fg 2
    some_other_command
    

    Weitere Informationen hierzu finden Sie unterhelp jobs

verwandte Informationen