如何在不等待Perl CGI脚本完成的情况下运行外部进程?

时间:2010-04-19 14:22:44

标签: perl cgi subprocess

是否可以继续显示CGI脚本的HTML而无需等待子进程完成,但是当CGI脚本完成时,子进程应该保持活动状态。

这就是我所拥有的,

- 显示HTML页面

  

#html页面设置...所以标题/其他内容

     

#the -c,-h是params只是params
  system("perl subprocess.pm -c params -h 1 &");

     

#actually打印html页面设置
  ...

出于一些奇怪的原因,它在输出html页面之前等待子进程完成,即使我包含了对linux的异步系统调用。它不会立即呈现页面。是否可以在不等待子流程完成的情况下打印html页面?

3 个答案:

答案 0 :(得分:3)

  1. 这是可能的 - 请确保autofulush已开启($|=1;as discussed here,或“Perl Cookbook”(第7.12章.Flushing输出)中的问题。

    您还需要通过“守护”来解耦子进程 - see Ether's answer to a different question以获取示例

  2. 但是,这不可靠并且由于HTTP超时而容易破损。因此,在网页上显示连续变化输出的正确解决方案是:

    一个。更简单的解决方案:

    • 您的CGI脚本将打印到临时HTML文件

    • 偶尔接收该临时文件,关闭HTML并将当前最新版本复制到htdocs树中可见的某个临时位置(例如客户端可以通过URL引用 - 比如{{1 }}

    • 您的原始CGI会在创建临时文件的原始版本并生成子进程后生成重定向到http://your_server/tmp/AYZ122.html的HTTP响应。

    • 该位置的临时HTML文件有一个META REFRESH,它指示它每隔N秒刷新一次(比如10),并为用户发出相应的消息/ CSS警告加载正在进行中,请稍候。< / p>

    湾更难的解决方案:

    • 有些类似,因为主CGI脚本会创建一个发送给用户的“请稍候”HTML页面,并启动一个写入临时文件的子进程。

    • 子进程创建的临时文件不一定是整个HTML页面,而是一些数据文件。

    • 由原始CGI脚本创建的主HTML页面包含一个循环,该循环发出检索最新数据的AJAX调用(检索过程将读取子进程写入的临时文件)并根据最新数据更新HTML页面

答案 1 :(得分:2)

还有另一种解决方案:使用SSI(服务器端包含)。 您的CGI计划:

  • 1)创建一个临时网页“请稍候” 包含指令#include virtual log-file;
  • 2)初始化log-file,f.e。在那里写第一条消息;
  • 3)默默启动主子流程;
  • 4)默默启动checker子流程;
  • 5)生成一个带有META标签REFRESH的网页 重定向到临时网页。临时网页有 没有重定向的元标记REFRESH。

检查器子流程 每N秒检查一次主子进程的状态。当。。。的时候 主要过程正常或异常完成检查 process创建最终的网页,而不使用REFRESH元标记 与临时网页同名。

效果是日志文件会持续显示给用户 在主子流程完成之前每N秒更新一次。

答案 2 :(得分:0)