3

CGI Webページには、押されたときにフォームを送信し、次のようなサブルーチンが呼び出されるボタンがあります。

sub run {
     &emailDebug("Started " .localtime);
    system("(/tools/script1.pl &) ; (/tools/script2.pl &)");
    &emailDebug("Ended " .localtime);
}

どちらも11:08:05に開始します(したがって、派手なコマンドです)。スクリプト自体でタイムスタンプを取得し、電子メールで自分に送信します。

2番目は11:08:22、最初は11:08:36で終了しましたが、上から送信された電子メールには11:08:06が表示されます。

最も興味深いことに、2つのスクリプトのうち長い方が実行されている限り、ページは約30秒間読み込まれます。

ページの読み込みは気になりませんが、なぜこのように動作するのかわかりません。ページが読み込まれている間、明らかにサブルーチンrun自体は返されませんが、両方の電子メールがほぼ同時に送信されます。

4

3 に答える 3

6

system呼び出したコマンドが許可するとすぐに戻ります。この特定の例では、すぐに戻るはずですが、シェルによっては壊れることがあります。念のため、通話を2つに分割してみてください。

system("/tools/script1.pl &");
system("/tools/script2.pl &");

また、Webサーバーの構成によっては、フォークされた子でSTDOUTが開いていることに気付く場合があり、メインスクリプトが既に終了している場合でも、すべての子が終了するのを待ってから応答を提供します。生成されたスクリプトSTDOUT/ERRを/dev/ nullにリダイレクトclose(STDOUT)close(STDERR)、メインスクリプトで、出力が終了したときに応答をフラッシュする方法についてWebサーバー/フレームワークのドキュメントを参照してください。

于 2012-09-03T11:20:47.873 に答える
2

スクリプトをバックグラウンドプロセスとして実行しているため、システムはすぐに戻ります。完了を待ちたい場合は、を削除し&て順番に実行します。

system("(/tools/script1.pl) ; (/tools/script2.pl)");
于 2012-09-03T10:52:32.890 に答える
1

上記の印刷ステートメントとはどういう意味ですか?コードにprint呼び出しが表示されない

2つの子runプロセスが開始されるとすぐに、サブルーチンが返されます。systemコマンドラインで2つの呼び出しを行い、括弧を削除することで、状況をより明確にすることができます。末尾のアンパサンドのため、システムへの両方の呼び出しはすぐに戻り、子は独立して実行されます

の呼び出し後、他の何かがページの戻りを遅らせている必要がありますrun。おそらく、子プロセスの作業がいつ完了したかを何らかの形で検出しています。

ちなみに、単純な呼び出しを行うときは、サブルーチン名にアンパサンドを使用しないでください。18年前にPerl5を入手して以来、それは必要ありませんでした

于 2012-09-03T11:39:38.170 に答える