1

我正在使用 perl 脚本来启动需要保持运行的 jar。但是,我希望我的 perl 进程结束。我认为这个线程会解决我的问题: 如何在 Perl 中触发并忘记一个进程?

但是,我已经尝试过分叉和使用 system(cmd &) 技术,并且在我的 perl 脚本中都保持运行。

这是我要分叉的代码:

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

这是我的系统代码(cmd &):我不确定这是否意味着输入 cmd & 我的命​​令或只是我的命令 & 但两个系统直到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, ...hack

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 有几种启动后台进程的方法。

(注意:我通常避免发布仅链接的答案,但由于有几个模块并且该页面可能永远不会消失,我觉得它比平时更安全)。

为了完整起见,以下是该页面的简短引用:

几个 CPAN 模块可能会有所帮助,包括IPC::Open2IPC::Open3IPC::RunParallel::JobsParallel::ForkManagerPOEProc::BackgroundWin32::Process

于 2013-08-15T22:20:22.297 回答