ラッパースクリプトのexecの理由


27

簡単に言えば、次のラッパースクリプトの例を見てきました。

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

上で見たように、それらはexec、新しく作成されたシェルをほぼ即座にに置き換えるために使用し$myprogます。なしで同じことを達成できexecます:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

この最後の例では、新しいbashインスタンスが開始$myprogされ、bashインスタンスの子プロセスとして開始されます。

最初のアプローチの利点は何ですか?



回答:


31

を使用execすると、ラッパーがより透明になります。つまり、スクリプトを呼び出すユーザーまたはアプリケーションが、「実際の」プログラムを起動するリレーであることを認識する必要が少なくなります。

特に、呼び出し元がプログラムを強制終了したい場合、起動したプロセスを強制終了します。ラッパースクリプトが子プロセスを実行する場合、呼び出し元は、ラッパーの子を見つけて、代わりにそれを強制終了する必要があることを知る必要があります。ラッパースクリプトは、いくつかのシグナルを中継するトラップを設定できますが、キャッチできないSIGSTOPまたはSIGKILLでは機能しません。

execまた、呼び出すと、余分なシェルを残しておく必要がないため、メモリ(およびPIDなどのその他のリソース)が少し節約されます。

複数のラッパーがある場合、問題が増えます(強制終了する適切なプロセスを見つけるのが難しい、メモリのオーバーヘッドなど)。

一部のシェル(Kornシェルなど)は、コマンドが最後のものであり、アクティブなトラップexecがないことを自動的に検出し、暗黙的なを入れますが、すべてがそうではありません(たとえば、bashではありません)。


10

重複を見つけない... FreeBSDハンドブックを参照してください。十分な理由があります:

このexecステートメントは、シェルプロセスを指定されたプログラムに置き換えます。場合はexec省略され、シェルプロセスは、プログラムの実行中にメモリに残り、不消費システムリソースを。

これは本質的にかなり前に(ポーターの1人によって)私に説明された理由であり、かなりよく知られています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.