关闭进程并在perl脚本完成后继续运行

时间:2013-08-15 22:07:34

标签: perl process

我正在使用perl脚本来启动需要保持运行的jar。但是,我希望我的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&我的命令或只是我的命令&但是两个系统都没有退出perl脚本,直到之后 jar进程死了。

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

OR

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

不确定我做错了什么...感谢你给我的任何帮助或想法。

2 个答案:

答案 0 :(得分:7)

我有a lot of experience in this domain,我了解到创建可以比父进程更长的后台进程的最佳方式取决于您的操作系统。

在Unix中,您可以要求system在后​​台运行作业或使用forkexec

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 &";
}

答案 1 :(得分:1)

Perl has several ways to launch background processes

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

为了完整起见,这是页面上的简短引用:

  

多个CPAN模块可能会提供帮助,包括IPC::Open2IPC::Open3IPC::RunParallel::JobsParallel::ForkManagerPOE,{ {3}}和Proc::Background