3

sqlldrを呼び出し、フラットファイルからテーブルにデータをロードするPerlスクリプトがあります。

さて、私の問題は、sqlldrがテーブルを正常にロードしても、終了コードを-1(を使用して取得)として返すことです。$?これを使用しようとすると、と表示されます。$!No child processes

sudoコマンドを使用してこのスクリプトを実行しています

sudo -u <uname> bash
<script_name>.pl

このPerlスクリプトは、ユーザーIDから直接実行すると正常に機能します。sudoユーザーを介して実行した場合にのみこのエラーが表示される理由がよくわかりません。

このエラーを理解するのを手伝ってください。

$SIG{CHLD} = 'DEFAULT';編集:私が私のコードを与えるならば、それはうまく働いています。しかし、このステップを削除すると、問題が再び発生します。このエラーについて閲覧していたときに、WWWからこのコードを取得しました。それが何をするのか分かりますか?

4

1 に答える 1

1

ほとんどの Unix プラットフォームでは、CHLD( としても知られるCLD) シグナルは、 の値に関して特別な動作をします'IGNORE'。このようなプラットフォームで を設定$SIG{CHLD}すると、親プロセスがその子プロセスで失敗したときにゾンビ プロセスを作成しないという効果があります (つまり、子プロセスは自動的にリープされます)。set toで呼び出すと、通常、そのようなプラットフォームで返されます。http://perl.active-venture.com/pod/perlipc-signal.htmlより抜粋'IGNORE'wait()wait()$SIG{CHLD}'IGNORE'-1

基本的に何が起こっているかというと、CHLDシグナルがIGNORE おそらく sqlldr によってどこかに設定されているということです。子プロセスのステータスを確認しようとすると、-1と呼ばれることもある が表示されECHILDます。CHLDこれは、シグナルの無視により、子プロセスの完了ステータスに関する情報が破棄されたために発生します。設定$SIG{CHLD} = 'DEFAULT';することにより、CHLD シグナルが DEFAULT ハンドラーによって処理され、無視されないことを示します。

CHLDスクリプトが sudo ユーザーから実行されたときと、ユーザー ID から直接実行されたときに信号が無視される理由がわかりません。

于 2011-06-09T22:00:10.273 に答える