【问题标题】:Fire a process off and have it keep running after perl script is done关闭进程并在 perl 脚本完成后继续运行
【发布时间】:2013-08-15 22:07:34
【问题描述】:

我正在使用 perl 脚本来启动需要保持运行的 jar。但是,我希望我的 perl 进程结束。我认为这个线程会解决我的问题:How can I fire and forget a process in Perl?

但是,我已经尝试了 fork 和使用系统(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 &");

不知道我做错了什么...感谢您能给我的任何帮助或想法。

【问题讨论】:

  • 请描述“都不起作用”是什么意思。一般来说,当说某事不起作用时,您必须确切地解释发生了什么(错误消息、错误输出、计算机变成一滩熔融金属和硅......)
  • @JimGarrison 抱歉,我编辑了主题。我的意思是 perl 脚本直到 jar 进程死后才死。
  • 只是出于好奇,您使用的是什么操作系统?
  • 我目前使用的是 OEL6,但它需要在任何 Windows/Unix 机器上工作

标签: perl process


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Perl has several ways to launch background processes.

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 2019-08-05
      • 2014-07-31
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      相关资源
      最近更新 更多