バックグラウンドでいくつかのプログラムを実行するスクリプトがあるのですが、実行後、コマンド「jobs」でそれらのプログラムがリストされません。なぜでしょうか?
(./m_prog -t m_prog1 m_config) &
(./m_prog -t m_prog2 m_config) &
(./m_prog -t m_prog3 m_config) &
しかし、ターミナルからそれぞれを実行すると、それらは「ジョブ」に表示されます。
スクリプト内で実行されるコマンドから同じ効果を得るにはどうすればよいですか?
答え1
jobs は、ジョブを作成したシェルのインスタンス化に対してのみ機能します。pid jobs n
ではなく、数字を使用します。シェルがスクリプト (別の新しいプロセス) 内で実行されると、スクリプトを起動した古いシェル、jobs (古いシェルで発行) は、新しいシェルでジョブ # 1 を参照できなくなります。
なぜでしょうか? 現在のシェルが独自のジョブ #1 を持つことができるためです。UNIX/Linux は、プロセス グループまたはセッションと呼ばれるものを維持します。セッションのグループ リーダーは、tty を所有し、キーボードを介してそれと対話するプロセスです。マニュアルで setsid() 関数の説明を調べてください。プロセスが起動され、古い親シェル (リーダー) の下で子としてまだ実行されている場合、jobs コマンドは機能します。それ以外の場合は機能しません。