Warum funktioniert disown nicht für den letzten Job, wenn ich ihn stelle?

1117
Joe

Angenommen, ich habe einen Prozess hinterlegt, z. B. VIM mit Strg-z. Dann starte ich ein xterm mit dem folgenden Befehl xterm &> /dev/null &. Wenn ich nur nicht getippt tippe, werde ich meinen vim-Prozess verlieren. Ich muss stattdessen die PID des Xterm-Prozesses eingeben, um ihn zu deaktivieren.

Gibt es eine Möglichkeit, dies zu umgehen, oder gibt es einen Grund dafür?

4

1 Antwort auf die Frage

4
Hastur

Wie zu beheben (kurze Version)

Sie haben mehrere Möglichkeiten, dies zu tun:

  • Mit werden %-Sie aufgefordert, den letzten Hintergrundjob zu deaktivieren .

    xterm &> /dev/null & disown %- 
  • Mit $!stattdessen fragen Sie den letzten enteignen ausgeführt Job (durch seine PID).

    xterm &> /dev/null & disown $! 

Es wird also erforderlich sein, ein paar Zeichen mehr zu schreiben, aber Sie können zumindest auswählen, welche der folgenden Charaktere :-)

Die Gründe

Der Grund ist alles hier: Wenn Sie einen Job ausführen, der ihn in den Hintergrund sendet &, ändert er im Wesentlichen nicht den aktuellen Job, sondern nur den vorherigen. Der aktuelle Job bleibt der zuvor.

Einige Wörter mehr und ein Beispiel

Sie können mit dem Befehl überprüfen, ob der Befehl oben jobsund danach ausgegeben wurde, um einen Job im Hintergrund zu starten.

  • Vorher : Angenommen, Sie haben einige Hintergrundprozesse, die gerade von einem Terminal aus ausgeführt werden (z. B. mit dolphin &und gestartet kate &).
    Jetzt fängst du an vimund suspendierst es mit Ctrl-Z.
    Die Ausgabe von jobswird sein:

    [1] Running dolphin . & [2]- Running kate & [3]+ Stopped vim 

    vimist der aktuelle Job, gekennzeichnet mit a +, und kateder vorherige, markiert mit a -.

    Tatsächlich wird im bash-Referenzhandbuch in Kapitel 7.1 [ 1 ] erklärt: "In der Ausgabe, die sich auf Jobs bezieht
    (z. B. die Ausgabe des Jobs-Befehls), wird der aktuelle Job immer mit einem '+' und der vorherige Job mit einem gekennzeichnet '-'. "

  • Nachher : Zum Schluss schreibst du deinen Befehl xterm &> /dev/null &(ohne disown).

    Wenn Sie darum bitten, jobswird es diesmal antworten:

    [1] Running dolphin . [2] Running kate  [3]+ Stopped vim [4]- Running xterm &> /dev/null & 

    Beachten Sie, dass vimnoch mit a + und xtermmit a gekennzeichnet ist -.
    Der letzte Hintergrundjob, der mit markiert -ist, ist xtermund nicht mehr kate &.

  • Das System verhält sich also so, als ob

    • Zuerst wird es ausgeführt xterm: Der neue Befehl ( xterm) wird zum aktuellen und vimzum vorherigen.
    • Dann xtermwird im Hintergrund gesendet und die Steuerung kehrt zum vorherigen in der Liste zurück ( vimmit Status), der wieder zum aktuellen wird und mit erneut markiert wird +. xtermStattdessen ist der neue vorherige Job und mit einem gekennzeichnet -.
    • Am Ende finden Sie nur den vorherigen Job (-) und nicht den aktuellen (+) aktualisiert .

Da Sie anrufen können, disowngefolgt von einer Jobnummer oder einer PID, haben Sie die beiden Varianten

  • %-: Auf den vorherigen Job kann mit verwiesen werden%-, möglicherweise einfacher zu merken, wenn Sie der Meinung sind, dass auch in Jobs ein gekennzeichnet ist-

  • $!: Die PID des letzten Jobs, der im Hintergrund ausgeführt wird, befindet sich im speziellen Parameter [ 2 ] .$!

Der Befehl disownakzeptiert beide.

Verweise