web-dev-qa-db-ja.com

バックグラウンドで最後の仕事を勘当しないのはなぜですか?

たとえば、プロセスのバックグラウンドを設定したとします。 VIM with ctrl-z。次に、次のコマンドを使用してxtermを開始しますxterm &> /dev/null &。 disownと入力すると、vimプロセスが失われます。代わりに、xtermプロセスのPIDを入力して勘当する必要があります。

これを回避する方法はありますか、それともこれが発生する理由がありますか?

4
Joe

修正方法(ショートバージョン)

それを行うにはいくつかの方法があります。

  • %-を使用すると、最後のバックグラウンドジョブを勘当するように求められます。

    xterm &> /dev/null & disown %-
    
  • 代わりに$!を使用すると、最後に実行されたジョブを(そのPIDを介して)勘当するように求められます。

    xterm &> /dev/null & disown $!
    

したがって、さらに数文字を書く必要がありますが、少なくともどれを選択することができます:-)

理由

理由はすべてここにあります:&を使用してバックグラウンドに送信するジョブを実行すると、基本的に現在のジョブは変更されず、前のジョブのみが変更されます。現在のジョブは以前のもの。

いくつかの言葉と例

コマンドjobsを使用して上記の内容を確認し、バックグラウンドでジョブを起動する前後の出力を比較できます。

  • Before:ターミナルから実行しているバックグラウンドプロセスがいくつかあるとします(たとえば、dolphin &kate &で起動します)。
    ここでvimを開始し、 Ctrl-Z
    jobsの出力は次のようになります。

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

    vimは現在のジョブであり、+のフラグが付けられ、kateは前のジョブであり、-のフラグが付けられます。

    実際、bashリファレンスマニュアルの7.1章 [ 1 ] と説明されています
    "ジョブに関連する出力(たとえば、jobsコマンドの出力)では、現在のジョブには常に「+」のフラグが付けられ、前のジョブには「-」のフラグが付けられます。 。 "

  • After:最後に、コマンドxterm &> /dev/null &disownなし)を記述します。

    jobsに尋ねると、今回は次のように答えます。

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

    vimにはまだaのフラグが付いていることに注意してください+およびxtermには-が付いています。
    -でマークされた最後のバックグラウンドジョブはxtermであり、これ以上kate &ではありません。

  • 言い換えれば、システムはまるで

    • 最初に実行されますxterm:新しいコマンド(xterm)が現在のコマンドになり、vimが前のコマンドになります。
    • 次に、xtermがバックグラウンドで送信され、コントロールがリスト内の前のコントロール(vimとそのステータス)に戻り、再び現在のコントロールになり、でマークされます。 +。代わりに、xtermは新しい前のジョブであり、-でマークされています。
    • 最後に、前のジョブ(-)のみが更新され、現在のジョブ(+)は更新されていないことがわかります。

disownに続けてジョブ番号またはPIDを呼び出すことができるため、2つのバリエーションがあります

  • %-前のジョブは%-を使用して参照できます。ジョブでも-でマークされていると考えると、覚えやすいかもしれません。

  • $!バックグラウンドで実行される最後のジョブのPIDは特別なパラメーターにあります$! [ 2 ]

コマンドdisownは両方を受け入れます。

参照

4
Hastur