Wenn Sie einen Prozess gestartet haben, können Sie ihn im Hintergrund starten, indem Sie ihn zunächst stoppen (drücken Sie Strg-Z) und dann bg
eingeben, damit er im Hintergrund fortgesetzt wird. Es handelt sich jetzt um einen “Job”, und seine stdout
/stderr
/stdin
sind immer noch mit Ihrem Terminal verbunden.
Sie können einen Prozess sofort als Hintergrundprozess starten, indem Sie ein “&” an das Ende anhängen:
firefox &
Um ihn im Hintergrund stummzuschalten, verwenden Sie dies:
firefox </dev/null &>/dev/null &
Einige zusätzliche Informationen:
nohup
ist ein Programm, mit dem Sie Ihre Anwendung mit ausführen können, so dass ihr stdout/stderr stattdessen in eine Datei gesendet werden kann und das Schließen des Elternskripts das Kind nicht SIGHUPEN wird. Sie müssen jedoch die Voraussicht gehabt haben, es vor dem Start der Anwendung benutzt zu haben. Aufgrund der Art und Weise, wie nohup
funktioniert, können Sie es nicht einfach auf einen laufenden Prozess anwenden.
disown
ist eine eingebaute Bash, die einen Shell-Job aus der Jobliste der Shell entfernt. Das bedeutet im Grunde genommen, dass Sie fg
, bg
nicht mehr darauf verwenden können, aber was noch wichtiger ist, wenn Sie Ihre Shell schließen, wird sie nicht mehr hängen oder eine SIGHUP
an dieses Kind senden. Im Gegensatz zu nohup
wird disown
nach dem Start des Prozesses und im Hintergrund verwendet.
Was Sie nicht tun können, ist, die stdout/stderr/stdin eines Prozesses zu ändern, nachdem Sie ihn gestartet haben. Zumindest nicht von der Shell aus. Wenn Sie Ihren Prozess starten und ihm sagen, dass sein stdout Ihr Terminal ist (was Sie standardmäßig tun), dann ist dieser Prozess so konfiguriert, dass er auf Ihr Terminal ausgibt. Ihre Shell hat mit dem FD-Setup des Prozesses nichts zu tun, das ist etwas, das der Prozess selbst verwaltet. Der Prozess selbst kann entscheiden, ob sein stdout/stderr/stdin geschlossen werden soll oder nicht, aber Sie können Ihre Shell nicht benutzen, um ihn dazu zu zwingen.
Um die Ausgabe eines Hintergrundprozesses zu verwalten, haben Sie viele Optionen von Skripten, wobei “nohup” wahrscheinlich das erste ist, was Ihnen in den Sinn kommt. Aber für interaktive Prozesse, die Sie starten, aber vergessen haben, sie zum Schweigen zu bringen (firefox < /dev/null &>/dev/null &
), können Sie eigentlich nicht viel tun.
Ich empfehle Ihnen GNU screen
. Mit screen können Sie einfach Ihre laufende Shell schließen, wenn die Ausgabe des Prozesses lästig wird, und eine neue öffnen (^Ac
).
Oh, und übrigens, benutzen Sie “$@
” nicht dort, wo Sie es benutzen.
$@
bedeutet, $1
, $2
, $3
, $1
…, was Ihren Befehl in:
gnome-terminal -e "vim $1" "$2" "$3" ...
verwandeln würde. Das ist wahrscheinlich nicht das, was Sie wollen, denn -e benötigt nur ein Argument. Verwenden Sie gnome-terminal -e
, um zu zeigen, dass Ihr Skript nur ein Argument verarbeiten kann.
Es ist wirklich schwierig, mehrere Argumente in dem Szenario, das Sie (mit dem -e
) angegeben haben, richtig zum Funktionieren zu bringen, weil &007 nur ein Argument benötigt, nämlich eine Shell-Befehlszeichenfolge. Sie müssten Ihre Argumente in einem einzigen verschlüsseln. Der beste und robusteste, aber eher klobige Weg ist wie folgt:
gnome-terminal -e "vim $(printf "%q " "$@")"