通过说我已经阅读了关于SO以及网络搜索的许多不同文章来开始我的问题,但找不到适合我实际情况的任何内容。
实际上,问题很简单。我有一个CGI脚本(Perl)在Web服务器上提供动态页面,并且当用户加载某个页面时,我想让CGI脚本使用system()
调用.pl文件来进行一些“整理”。它正在Windows NT环境中运行。
用于测试目的的CGI脚本是test1.pl或test1.cgi,例如“ https://www.awebsite.com/test1.pl”。
test1.pl(生成网页的CGI脚本)
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello user, this is a test page.";
system("start C:/path/to/script/test2.pl");
print "Page is fully loaded and housekeeping is being done, even though this page is now fully loaded";
test2.pl(正在执行“内务处理”的独立.pl文件,与test1.pl正在执行的操作异步)]
#!/usr/bin/perl
#just a counter that takes a while to complete, to verify test2.pl is running
for ($x=0; $x <= 100000; $x++){print "$x ";}
确定,请记住,这是为了测试操作,而不是功能。从命令行运行test1.pl时,它可以正常工作。
[从浏览器运行test1.pl时,这会一直在服务器上提示“ openWith.exe”(在任务管理器中查看)。我的.pl文件是可执行文件,因此这与文件类型未知或不知道如何与Perl命令行解释器一起运行无关。我无法弄清楚这里发生了什么,以及当通过Web界面调用时为什么它无法运行来自test1.pl的系统命令。
没有从用户输入传递任何参数。 test1.pl只需运行test2.pl来做一些内务处理,但是我无法让test1.pl等待test2.pl完成后再继续。因此,test2.pl应该由test1.pl启动并继续运行-同时,test1.pl已经完成其工作。我确实[[not需要或想要捕获test2.pl的任何输出。
我希望我已经清楚地解释了这一点。即使实际代码会复杂得多,我也使用了简单的示例。在这一点上,它甚至没有运行这些简单的示例脚本,因此,此时的实际功能代码并不重要。感谢任何可以帮助我的人。顺便说一句,我尝试为test1.pl设置“完全控制”权限,但这无济于事。同样,此“ openwith.exe”确实让我在这里循环。
start C:/path/to/script/test2.pl
依赖于在.pl文件和perl可执行文件之间建立关联。您可能已经在用户上进行了设置,但Web服务器可能没有。您可以进行设置。或者您不能使用start
,而是直接将程序传递给perl
。具体执行方式取决于Perl的安装方式和Web服务器的设置。您也许可以只使用perl.exe
。
system('perl.exe C:/path/to/script/test2.pl');
或者您可能必须通过完整路径。
system('C:/path/to/perl.exe C:/path/to/script/test2.pl');
请参见the documentation forstart
以获取更多详细信息。
请注意,从Perl程序运行Perl程序并不理想。一旦开始传递数据并检查错误,就会有很多难以调试的东西会出错。而不是考虑将该代码用作子例程,并使用
start
或fork
在后台运行它。或者更好的方法是,将threads
和Dancer之类的Web框架用于link it之类的作业队列。
特别是这里的这一部分:
您必须在.pl文件扩展名和Perl运行时之间创建文件关联。在命令提示符下,键入以下内容。
Perl not running in Windows 10
我希望这可以帮助可能遇到相同问题的人。
assoc .pl=PerlScript
ftype PerlScript=c:\perl\bin\perl.exe %1 %*
。但是您必须小心,不能从外部调用script2,例如通过检查客户端IP。而且,由于这是一个cgi,script1可能可以并行运行多次,因此script2也是如此,但是最终您将其调用。因此,您必须确保在发生这种情况时不要弄乱事情。