1

ライブサーバーで 1 つの問題が発生しました。

ほぼ 1 日 15 から 18 時間実行されるスクリプト (perl) があります。毎日100以上のサブプロセスを作成します。perlコード内のバックティックでトリガーされているコマンド(コマンドラインsolarisボックスで実行する製品コマンド)がある場所。

back ticks コマンドがランダムにスキップまたは失敗したようです。

たとえば。50 人の顧客に対して実行する必要がある場合、2 つまたは 3 つがランダムに失敗します。

コマンドがトリガーされたという証拠はどこにもありません。

ライブサーバーであるため、問題が明確になるまで、コードを大幅に変更することさえできません。

ここにコードがあります..

my $comm = "inventory -noX customer1"; #sample command i have given here
my $newLogFile = "To capture command output here we have path whre the file gets created");
my $piddy = `$comm 2>&1 > $newLogFile`;                            

バックティックが原因なのか、よくわかりません:(。

また、メモリ/CPU/ディスクスペース/LD_LIBRARY_PATH に librtld_db.so を追加するなどのさまざまな分析を試みました....しかし運がありません...また、perl は 64 ビットです...他に何ができますか? :(

4

3 に答える 3

5

エラーをチェックしていないのではないかと思います (そして、perl ではバッククォートを正しく行うのは簡単ではありません)。

バックティック/qx の代わりにIPC::System::Simpleのキャプチャを使用することを検討してください。そのドキュメントが言うように、「エラーが発生した場合、問題の詳細な説明とともに終了します。」

于 2012-11-26T01:45:47.720 に答える
1

バックティックだけで失敗することはありませんが、新しいプロセスを生成しているため、そのプロセスはシステム条件(sysLoadなど)によって定期的に失敗する可能性があります。バックティックは実際には「ファイアアンドフォーゲット」方式であり、実稼働環境で重要なものには使用しないでください。以前に提案したように、スポーンする外部プロセスを管理するためのはるかに詳細な方法があります。

バッファリングが原因でコマンドの出力が失われている場合は、バッファリングをオフにしてみてください。ただし、パフォーマンスの低下に注意してください(通常は重要ではありません)。

スクリプト全体のバッファリングをオフにするには、これを上部に追加します。

$|=1;
于 2012-11-26T02:59:03.443 に答える
1

外部コマンドを呼び出すとき、私はIPC ::System::SimpleのシステムまたはIPC::Open3open3 を使用しています。

于 2012-11-26T04:52:42.900 に答える