バックグラウンドで2つのプロセスを開始し、2番目のタスクをフォアグラウンドにインポートするにはどうすればよいですか?

バックグラウンドで2つのプロセスを開始し、2番目のタスクをフォアグラウンドにインポートするにはどうすればよいですか?

これら2つのプロセスは次のとおりです。

cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &

バックグラウンドで実行する必要がありますが、2番目のタスクをフォアグラウンドにインポートすることはできません。

答え1

これが2つの一般的なジョブの場合、aa plainはfg2番目のジョブをフォアグラウンドにインポートします(これが最近一時停止されたバックグラウンドジョブ、または最近開始されたバックグラウンドジョブの場合(他のジョブは一時停止されません))。

ただし、最初の操作(読み取り)の性質により、/dev/ttyTTYで読み取りを試みるとすぐに停止します。fgしたがって、それはなりますそれフロントデスクに戻ります。

他の仕事がないことを考えると、ここで解決策は%-orを使用することです。%2


ジョブがバックグラウンドに切り替わると(終了コマンドを使用してジョブを開始するか、フォアグラウンドジョブの一時停止を使用してコマンドを&実行Ctrl+Zして)、ジョブbgに「ジョブID」または「ジョブ仕様」が表示されます。このジョブIDは通常、小数点以下の桁数%Nで表されます。N

waitなどの複数のコマンドでジョブIDを使用できますkill。たとえば、このコマンドは、ジョブIDを使用してバックグラウンドジョブにシグナルを送信するために使用できます。fgbgkill

デフォルトでは、このfgコマンドは「現在の操作」に適用されます。現在のジョブのジョブIDは、または%+で取得できます%%。現在のジョブは、直前に開始されたバックグラウンドジョブ、または中断されたジョブがある場合は、最新の中断されたジョブです。

バックグラウンドジョブをフォアグラウンドに移動するには、対応するジョブIDを使用してください。

$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 500 &
$ fg %1
sleep 1000

出力+jobs「現在の作業」を意味します(簡単な呼び出しに切り替えた作業ですfg)。

POSIX標準特殊ジョブID:

  • %%、現在の職業。
  • %+、のような上記と。
  • %-、以前の職業。
  • %N、ジョブ番号N
  • %string、コマンドがで始まるタスクstring
  • %?string、コマンドに含まれる操作ですstring

答え2

fgコマンドを試してみましたか?

fg %2

答え3

whileには$!プロセスIDが含まれています。最高最近バックグラウンドで開始された作業プロセスを把握することは困難です。働く確実な方法でIDを確認してください。

ジョブIDは再利用されるため、必ずしも最大のジョブIDである必要はありません。保留中のジョブが優先順位を持つため、参照できるジョブである必要はありません(または引数なしでジョブが実行されます)(あなたの場合、最初のジョブが%%代わり%+fgttyから読み取ろうとしているので中断することができます)。または、最後に開始されたジョブが終了した可能性があります(この場合、リスト%+の次のジョブが参照されます)。

jobsしたがって、目的のジョブのジョブ番号を知るために最初に実行する必要がありますfg(useを使用)、fg %thatnumber名前に他のジョブがない場合は、次のように実行する必要があります。zero

fg %\?zero

これにより、以下をzsh使用できます。

fg_most_recent() {
  local job=${(k)jobstates[(R)*:$!=*]}
  ((job)) && fg %$job
}

つまり、値がパターンに一致する連想配列を取得しますk(直接開始されたジョブのすべてのプロセス状態を提供するようです)。$jobstates*:$!=*$jobstatesrunning:+:20162=running:20163=runningzsh

関連情報