1

実行し続ける必要があるjarを起動するためにperlスクリプトを使用しています。ただし、perl プロセスを終了させたいです。このスレッドが私の問題を解決してくれると思いました: How can I fire and forget a process in Perl?

ただし、システム (cmd &) 手法のフォークと使用の両方を試しましたが、両方で perl スクリプトが実行されたままです。

フォークするコードは次のとおりです。

if (index($all_jars, 'myjar.jar') == -1) {
  unless(fork) {
  }
  else {
    exec("java -jar myjar.jar");
  }
}

システムのコードは次のとおりです(cmd &): これが cmd & my command を入力することを意味するのか、単に my command & を入力することを意味するのかはわかりませんでしたが、jar プロセスが終了するまで、両方のシステムが perl スクリプトを終了しませんでした。

system("cmd & java -jar myjar.jar");

OR

system("java -jar myjar.jar &");

何が間違っているのかわからない...助けやアイデアをくれてありがとう。

4

2 に答える 2

7

私はこの分野で多くの経験を積んでおり、親プロセスよりも長く存続できるバックグラウンド プロセスを作成する最善の方法は、オペレーティング システムによって異なることを学びました。

Unix ではsystem、バックグラウンドでジョブを実行するか、forkand を使用するように要求できexecます。

system("java -jar myjar.jar &");

if (fork() == 0) {
    exec("java -jar myjar.jar");
    die "exec shouldn't have returned";
}

ロジック ( unless(fork){...}else{exec(...)}) が逆execで、親プロセスで呼び出していることに注意してください。

Windows では、別のプロセス グループで実行されるバックグラウンド プロセスを作成する最善の方法は、system 1, ...ハックを使用することです。

system 1, "java -jar myjar.jar";

実行しているオペレーティング システムを確認$^Oします。

if ($^O eq 'MSWin32') {
    system 1, "java -jar myjar.jar";
} else {
    system "java -jar myjar.jar &";
}
于 2013-08-15T23:00:41.463 に答える
1

Perl には、バックグラウンドプロセスを起動する方法がいくつかあります

(注:通常、リンクのみの回答を投稿することは避けていますが、いくつかのモジュールがあり、そのページが消えることはない可能性が高いため、通常より安全だと感じています).

完全を期すために、ページからの短い引用を次に示します。

IPC::Open2またはIPC::Open3IPC::RunParallel::JobsParallel::ForkManagerPOEProc::BackgroundWin32::Processなど、いくつかの CPAN モジュールが役立つ場合があります。

于 2013-08-15T22:20:22.297 に答える