Warum arbeitet disown nicht am letzten Job, wenn ich ihn im Hintergrund habe?

4

Angenommen, ich habe einen Prozess hinterlegt, z. VIM mit Strg-Z. Dann starte ich ein xterm mit dem folgenden Befehl xterm &> /dev/null &. Wenn ich nur disown eingebe, verliere ich meinen vim-Prozess. Ich muss stattdessen die PID des xterm-Prozesses eingeben, um ihn zu verwerfen.

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

Joe
quelle

Antworten:

4

Wie zu beheben (kurze Version)

Sie haben mehrere Möglichkeiten, dies zu tun:

  • Mit %- Sie werden darum bitten, den letzten zu verleugnen Hintergrundjob .

    xterm &> /dev/null & disown %-
    
  • Mit $! Stattdessen werden Sie darum bitten, das Letzte zu ignorieren ausgeführter Auftrag (über seine PID).

    xterm &> /dev/null & disown $!
    

Es wird also einige Zeichen mehr erfordern, aber zumindest können Sie auswählen, welche :-)

Die Gründe

Der Grund ist alles hier: wenn Sie einen Auftrag ausführen, der mit in den Hintergrund gesendet wird &Im Grunde ändert es nicht den aktuellen Job, sondern nur den vorherigen. Der aktuelle Job bleibt der vorherige.

Einige Worte mehr und ein Beispiel

Sie können überprüfen, was oben mit dem Befehl gesagt wurde jobsVergleichen der Ausgabe vor und nach dem Starten eines Jobs im Hintergrund.

  • Vor : Nehmen wir an, Sie haben ein paar Hintergrundprozesse, die nur von einem Terminal ausgeführt werden (z. B. gestartet mit dolphin & und kate & ).
    Jetzt fängst du an vim und du setzt es aus mit Strg-Z .
    Die Ausgabe von jobs wird sein:

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

    vim ist der aktuelle Job, gekennzeichnet mit einem +, und kate ist die vorherige, gekennzeichnet mit einem -.

    In der Bash-Referenzanleitung, Kapitel 7.1 [ 1 ] wird das erklärt
    "Bei Ausgaben, die sich auf Aufträge beziehen (z. B. die Ausgabe des Befehls" Aufträge "), wird der aktuelle Auftrag immer mit einem" + "und der vorherige Auftrag mit einem" - "gekennzeichnet."

  • Nach dem : Schließlich schreiben Sie Ihren Befehl xterm &> /dev/null & (ohne disown ).

    Fragen an jobsDiesmal wird es antworten:

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

    Beachten Sie, dass vim ist noch mit einem gekennzeichnet + und xterm mit einer -.
    Der letzte mit gekennzeichnete Hintergrundjob - ist xterm und nicht mehr kate &.

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

    • Zuerst läuft es xterm: der neue Befehl ( xterm ) wird die aktuelle und vim Der vorherige.
    • Dann xterm wird im Hintergrund gesendet und die Steuerung kehrt zum vorherigen in der Liste zurück vim mit seinem Status) wird das wieder der aktuelle und es wird wieder mit markiert +. xterm stattdessen ist das neue vorherige Arbeit und es ist mit einem gekennzeichnet -.
    • Am Ende findest du nur das aktualisierte vorherige Arbeit (-) und nicht der aktuelle (+).

Da kannst du anrufen disown Nach einer Auftragsnummer oder einer PID haben Sie die beiden Varianten

  • %-: Auf den vorherigen Job kann mit verwiesen werden %-, vielleicht einfacher zu merken, wenn Sie denken, dass auch in Jobs mit einem gekennzeichnet ist -

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

Der Befehl disown wird beides akzeptieren.

Verweise

Hastur
quelle