ジョブ制御は、ユーザーが単一の対話型シェルから複数のジョブを管理できるようにするシェルと tty ドライバーの機能の集合です。
ジョブは、単一のコマンドまたはパイプラインです。実行する場合ls
、それは仕事です。を実行するls|more
と、それはまだ 1 つのジョブにすぎません。実行するコマンドが独自のサブプロセスを開始する場合、意図的に切り離されない限り、それらも同じジョブに属します。
&
ジョブ制御がなければ、コマンド ラインに追加することでジョブをバックグラウンドに置くことができます。そして、それはあなたが持っているすべてのコントロールについてです。
ジョブ制御を使用すると、さらに次のことができます。
- 実行中のフォアグラウンド ジョブを中断するCtrlZ
- 中断されたジョブをフォアグラウンドで再開する
fg
- バックグラウンドでサスペンドジョブを再開する
bg
- 実行中のバックグラウンド ジョブをフォアグラウンドに移動する
fg
シェルは、コマンドを実行することで確認できるジョブのリストを維持しますjobs
。それぞれにジョブ番号が割り当てられます (ジョブを構成するプロセスの PID とは異なります)。のプレフィックスが付いたジョブ番号を%
引数として使用しfg
たりbg
、フォアグラウンドまたはバックグラウンドにするジョブを選択したりできます。%jobnumber 表記は、シェルの組み込みkill
コマンドでも受け入れられます。ジョブ番号は 1 から割り当てられるため、PID よりも短いので便利です。
%+
直前にフォアグラウンド化されたジョブと前にフォアグラウンド化されたジョブのショートカットもあるため、数字を覚えなくても (現在のジョブを一時停止し、別のジョブを再開) を実行%-
することで、2 つのジョブをすばやく切り替えることができます。または、コマンド自体の先頭を使用できます。コマンドを一時停止した場合、それを再開するのは簡単です(他のアクティブなジョブが "ff" で始まるものではないことを前提としています)。最後のショートカットとして、. を入力する必要はありません。コマンドとして入力するだけで、前のジョブがフォアグラウンドになります。CtrlZfg %-
ffmpeg
fg %ff
fg
%-
「しかし、なぜこれが必要なのですか?」私はあなたが尋ねるのを聞くことができます。「別のコマンドを実行したい場合は、別のシェルを起動できます。」確かに、マルチタスクには多くの方法があります。通常の日に、ログイン シェルを tty1 から tty10 で実行しています (6 つ以上あります。アクティブ化する必要があります)。そのうちの 1 つは 4 つの画面で画面セッションを実行し、別のシェルでは ssh を実行している可能性があります。リモート マシンで実行されている別の screen セッションと、3 つまたは 4 つの xterm を使用した X セッションがあります。そして、私はまだジョブコントロールを使用しています。
vi
またはless
またはaptitude
または その他のインタラクティブな処理の途中で、他のいくつかのクイック コマンドを実行して続行方法を決定する必要がある場合CtrlZは、コマンドを実行しますfg
。自然で迅速です。(多くの場合、対話型プログラムには!
、外部コマンドを実行するためのキーバインドがあります。シェルの履歴、コマンド ライン エディター、および補完システムの利点が得られないため、これはあまり良くないと思います。)誰かが 2 番目の xterm/screen/whatever を起動して 1 つのコマンドを実行し、それを 2 秒間見てから終了するのを見るたびに悲しくなります。
さて、あなたのこのスクリプトについて。一般的に、それは有能に書かれているようには見えません。問題の行:
bash -i -c "ssh -D 7070 -N user@my-ssh.example.com > /dev/null"
紛らわしいです。ssh コマンドがメイン スクリプトから直接実行されるのではなく、別のシェルに渡される理由がわかりません-i
。この-i
オプションは、シェルに対話的に実行するように指示し、ジョブ制御を (とりわけ) 有効にします。しかし、実際にはインタラクティブに使用されていません。別のシェルと の背後にある目的が何であれ、-i
ジョブ制御に関する警告は副作用でした。sshの望ましくない機能を回避するためのハックだったと思います。それは、それを行うときにコメントする必要があるようなものです。