如何在IIS下用Perl CGI将进程完全后台化
多亏了这里的其他一些好文章(如和),我有了几种可靠的方法来为Perl脚本中的进程提供背景 然而,在我的环境中(WindowsServer2003上的IIS6),它似乎并不完全是后台的。以这个脚本为例:如何在IIS下用Perl CGI将进程完全后台化,perl,iis,cgi,background-process,Perl,Iis,Cgi,Background Process,多亏了这里的其他一些好文章(如和),我有了几种可靠的方法来为Perl脚本中的进程提供背景 然而,在我的环境中(WindowsServer2003上的IIS6),它似乎并不完全是后台的。以这个脚本为例: use CGI::Pretty qw(:standard); print header; print start_html; print "hi<br>"; system(1,qw(sleep 10)); print "bye"; print end_html; 使用CGI::Pre
use CGI::Pretty qw(:standard);
print header;
print start_html;
print "hi<br>";
system(1,qw(sleep 10));
print "bye";
print end_html;
使用CGI::Pretty qw(:标准);
打印头;
打印start_html;
打印“hi
”;
系统(1,qw(睡眠10));
打印“再见”;
打印结束html;
睡眠过程运行时,浏览器将保持“连接”10秒钟。“hi”和“bye”都会显示在屏幕上,但浏览器似乎在等待来自服务器的更多信息(Firefox 4和IE6的进度条在这10秒内一直缓慢移动)
我希望用户(对于我的真实应用程序)相信这个过程是完全可靠的,并且能够完全轻松地关闭网页。由于进度条仍在移动,我相信他们会坐下来等待它停止,然后再关闭或导航离开
只是想澄清一下,这个过程似乎有背景。我可以关闭web浏览器。真正的bacgrouind作业继续运行(有时长达一个小时),没有任何问题。我只是想从UI的角度来清理这个问题
谢谢 您的问题是CGI程序已经完成,但是Web服务器还没有被告知它已经完成,并且在实际告诉浏览器它已经完成之前正在等待。你需要弄清楚如何传达这些信息,或者想出一个解决bug的方法。以下是一些可能的策略
#! /usr/bin/perl -w
use strict;
use Carp qw(croak);
use Data::Dumper qw(Dumper);
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
$ua->add_handler(response_header => sub {croak "complete"}, m_code => 200);
my $response = $ua->get("http://www.perl.com/");
if ($response->is_success) {
print "Request backgrounded\n";
}
else {
print "Uh, oh.\n";
}
你的问题是CGI程序已经完成了,但是Web服务器还没有被告知它已经完成了,并且在实际告诉浏览器它已经完成之前等待着。你需要弄清楚如何传达这些信息,或者想出一个解决bug的方法。以下是一些可能的策略
#! /usr/bin/perl -w
use strict;
use Carp qw(croak);
use Data::Dumper qw(Dumper);
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
$ua->add_handler(response_header => sub {croak "complete"}, m_code => 200);
my $response = $ua->get("http://www.perl.com/");
if ($response->is_success) {
print "Request backgrounded\n";
}
else {
print "Uh, oh.\n";
}
CGI脚本在标准输出重定向的情况下运行,直接重定向到TCP套接字或管道。通常,在句柄及其所有副本关闭之前,连接不会关闭。默认情况下,子流程将继承句柄的副本 有两种方法可以防止连接等待子进程。一个是防止子流程继承句柄,另一个是子流程在启动时关闭其句柄副本 如果子流程使用Perl,我认为可以非常简单地关闭句柄:
close(STDOUT);
如果要阻止子进程继承句柄,可以使用SetHandleInformation函数(如果您有权访问Win32 API)或在调用CreateProcess时将bInheritHandles设置为FALSE。或者,在启动子流程之前关闭句柄。CGI脚本在运行时会将标准输出重定向到TCP套接字或管道。通常,在句柄及其所有副本关闭之前,连接不会关闭。默认情况下,子流程将继承句柄的副本 有两种方法可以防止连接等待子进程。一个是防止子流程继承句柄,另一个是子流程在启动时关闭其句柄副本 如果子流程使用Perl,我认为可以非常简单地关闭句柄:
close(STDOUT);
如果要阻止子进程继承句柄,可以使用SetHandleInformation函数(如果您有权访问Win32 API)或在调用CreateProcess时将bInheritHandles设置为FALSE。或者,在启动子流程之前关闭句柄。谢谢您的建议。关于选项:1)对于这个特定的小UI“nit”,解决方案太复杂;2) 当然考虑过了,但是我们在这台服务器上运行了足够多的计划任务,所以我讨厌添加另一个仅仅是pol的任务