
Ich habe 2 Fragen zum Starten der Prozesse im Hintergrund:
Warum funktioniert das Starten eines Prozesses im Hintergrund so:
./my_program &
(
my_program
natü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.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
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).
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_command
jetzt 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_command
nun beendet ist.Um herauszufinden, welche Hintergrundjobs Bash derzeit verfolgt, können Sie das
jobs
integrierte 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 unter
help jobs