たとえば、プロセスのバックグラウンドを設定したとします。 VIM with ctrl-z。次に、次のコマンドを使用してxtermを開始しますxterm &> /dev/null &
。 disownと入力すると、vimプロセスが失われます。代わりに、xtermプロセスのPIDを入力して勘当する必要があります。
これを回避する方法はありますか、それともこれが発生する理由がありますか?
それを行うにはいくつかの方法があります。
%-
を使用すると、最後のバックグラウンドジョブを勘当するように求められます。
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
は両方を受け入れます。
参照