Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在IIS下用Perl CGI将进程完全后台化_Perl_Iis_Cgi_Background Process - Fatal编程技术网

如何在IIS下用Perl CGI将进程完全后台化

如何在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

多亏了这里的其他一些好文章(如和),我有了几种可靠的方法来为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::Pretty qw(:标准);
打印头;
打印start_html;
打印“hi
”; 系统(1,qw(睡眠10)); 打印“再见”; 打印结束html;
睡眠过程运行时,浏览器将保持“连接”10秒钟。“hi”和“bye”都会显示在屏幕上,但浏览器似乎在等待来自服务器的更多信息(Firefox 4和IE6的进度条在这10秒内一直缓慢移动)

我希望用户(对于我的真实应用程序)相信这个过程是完全可靠的,并且能够完全轻松地关闭网页。由于进度条仍在移动,我相信他们会坐下来等待它停止,然后再关闭或导航离开

只是想澄清一下,这个过程似乎有背景。我可以关闭web浏览器。真正的bacgrouind作业继续运行(有时长达一个小时),没有任何问题。我只是想从UI的角度来清理这个问题


谢谢

您的问题是CGI程序已经完成,但是Web服务器还没有被告知它已经完成,并且在实际告诉浏览器它已经完成之前正在等待。你需要弄清楚如何传达这些信息,或者想出一个解决bug的方法。以下是一些可能的策略

  • 在Unix中,告诉Web服务器该离开的正确方法是后台进程的后台监控。如何做到这一点的细节与Unix非常相关。不过,通过谷歌搜索Win32 perl守护进程,我会找到和,这可能会帮助您在Windows上执行类似的操作。我看到过一些没有细节的评论,暗示这会奏效。如果你需要帮助解决这个问题,我建议你去那里问问。这里有比这里更多的Perl专业知识

  • 假设您有某种批处理作业调度器可用。然后,您可以只计划要完成的任务,而不是启动作业。任务将被拾取并运行。如果您需要运行的作业非常密集,以至于您希望它在Web服务器以外的其他地方运行,则此策略特别有用

  • 您的CGI脚本可以返回并向Web服务器发出http请求以启动作业,而不会等待。下面是一个简单的示例,向您展示如何做到这一点:

    #! /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的方法。以下是一些可能的策略

  • 在Unix中,告诉Web服务器该离开的正确方法是后台进程的后台监控。如何做到这一点的细节与Unix非常相关。不过,通过谷歌搜索Win32 perl守护进程,我会找到和,这可能会帮助您在Windows上执行类似的操作。我看到过一些没有细节的评论,暗示这会奏效。如果你需要帮助解决这个问题,我建议你去那里问问。这里有比这里更多的Perl专业知识

  • 假设您有某种批处理作业调度器可用。然后,您可以只计划要完成的任务,而不是启动作业。任务将被拾取并运行。如果您需要运行的作业非常密集,以至于您希望它在Web服务器以外的其他地方运行,则此策略特别有用

  • 您的CGI脚本可以返回并向Web服务器发出http请求以启动作业,而不会等待。下面是一个简单的示例,向您展示如何做到这一点:

    #! /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的任务