2017-10-17 8 views
1

私はスクリプトが実行されているのを見てきました(myDir/myScript.sh arg1 arg2 &)なぜサブシェルからバックグラウンドプロセスを開始するのですか/なぜ(someCommand&)を偽るのですか?

私の理解では、スクリプトはサブシェルとそのサブシェルのバックグラウンドで実行されています。

新しいサブシェルを作成するかっこなしでスクリプトmyDir/myScript.sh arg1 arg2 &を実行した場合、副作用はありますか?

+0

これは、ダブルフォークに相当するシェルです。 https://stackoverflow.com/questions/881388/what-is-the-reason-for-performing-a-double-fork-when-creating-a-daemon –

答えて

3

サブシェルで実行する通常の理由は、バックグラウンドプロセスの開始と終了時にシェルがメッセージを出力しないようにするためです。

また、スクリプトでwaitコマンドを使用した場合、サブシェルで開始されたバックグラウンドプロセスは待たされません(プロセスは孫ではなく子を待つのみ)。

これは、サブシェルで起動されている場合、スクリプトがバックグラウンドプロセスの終了ステータスを取得できないことを意味します。これを取得するには、waitを使用する必要があります。また、$!変数は、バックグラウンドプロセスのPIDに設定されません(元のシェルプロセスではなく、サブシェル内で設定されます)。

元のシェルがバックグラウンドプロセスに対処する必要がない場合、基本的には(command&)を使用します。バックグラウンドプロセスを処理する必要がない場合は、起動して忘れてしまいます。

+0

アンパサンドが新しいプロセスをバックグラウンドでフォークすると思ったしかし、サブシェルとはどのように違いますか? – avaldez1412

+0

すべての非組み込みコマンドは、新しいプロセスをフォークします。アンパサンドはそのプロセスをバックグラウンドで実行させます。つまり、元のシェルが終了するのを待たずに続行します。 – Barmar

+0

'()'が新しいシェルプロセスをフォークすると、そのサブシェルは '&'があるかどうかによってフォアグラウンドまたはバックグラウンドのいずれかで新しいプロセスをフォークします。おかげさまで – Barmar

関連する問題