バックグラウンドでプロセスを実行することは正確に何を意味しますか?
$program
と:の違い $program&
は、入力ファイル記述子がシェルから継承されないということですか、それとも別のものがありますか?
答え1
program &
stdin
は依然としてとstdout
同じprogram
ですが、通常は(端末設定に応じて)システムが信号を介して停止しない限りprogram &
読み取ることができません(参照stdin
SIGTTIN
https://en.wikipedia.org/wiki/Job_control_(Unix)#実装)。
バックグラウンドプロセスはキーボードショートカット()からシグナルを受け取らずCtrl-C, Ctrl-\, Ctrl-Z
、もちろんバックグラウンドでプロセスを実行してもシェルを引き続き使用できます(たとえば、他のプロセスの起動など)。
答え2
これは多くのことを意味します。
- バックグラウンドプロセスは端末をブロックしません。完了するまで待たないため、「非同期的に」実行されます。強制的に切断すると、まだ死ぬ。
- したがって、応答は必ずしも「アクティブ」ではなく「手動」である必要があり、後でチェックするために出力をファイルにリダイレクトするのが良い形式です。
- バッチソリューション(コマンドファイル、応答ファイル、または予想)を考慮しない限り、対話型入力は問題になります。
- 「長期実行」ジョブの場合は、サービスとして開始することを検討できます。
- 背後に問題がある場合は、tmuxとscreenを参照して選択肢を見つけてください。
答え3
フォアグラウンドでプロセスを開始すると、シェルはwait()
次のコマンドを読み取る前にプロセスが完了するのを待ちます(一連のシステムコールの1つを使用)。バックグラウンドでプロセスを開始すると、シェルはプロセスが完了するか状態が変更されるのを待たずに、完了するか状態が変更されるのを待ちます。次のコマンドをすぐに読み込み、実行します。
あなたがスタートバックグラウンドプロセスでは、必要に応じてバックグラウンドと前景の間を移動できます(^Z
および使用bg
または使用fg
)。この点で、すべての職業は同じです。唯一の制限は、特定の時間に最大1つのフォアグラウンドジョブがある可能性があり、バックグラウンドジョブがシェルのttyを使用しようとすると停止することです。
前景ジョブがないと、シェルは次のコマンド(スクリプトファイルまたは標準入力から)を読み込み、実行します。