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
当不允许分叉并且backticks和system()不起作用时,异步脚本执行的Perl替代方案? 更新:通过指定外部脚本的完整路径,system()和backticks的问题已得到解决。我将自己进一步调查fork问题。谢谢大家的帮助。_Perl_Cgi_System_External_Backticks - Fatal编程技术网

当不允许分叉并且backticks和system()不起作用时,异步脚本执行的Perl替代方案? 更新:通过指定外部脚本的完整路径,system()和backticks的问题已得到解决。我将自己进一步调查fork问题。谢谢大家的帮助。

当不允许分叉并且backticks和system()不起作用时,异步脚本执行的Perl替代方案? 更新:通过指定外部脚本的完整路径,system()和backticks的问题已得到解决。我将自己进一步调查fork问题。谢谢大家的帮助。,perl,cgi,system,external,backticks,Perl,Cgi,System,External,Backticks,在一个答案中,提供以下两种调用外部Perl脚本以异步运行的方法之一: `myscript.pl &` system ('myscript.pl &') 我已经尝试在我的主CGI脚本中使用这两个脚本,但是它们都不会执行外部脚本,尽管我可以从web浏览器成功地执行外部脚本。外部脚本只是一个测试,用于将“hello”打印到屏幕上,并打开一个输出文本文件,其中包含时间戳和hello 我不怀疑这些建议方法的有效性,但也许我使用的虚拟web托管服务(Apache服务器上的某种Unix)配

在一个答案中,提供以下两种调用外部Perl脚本以异步运行的方法之一:

`myscript.pl &`

system ('myscript.pl &')
我已经尝试在我的主CGI脚本中使用这两个脚本,但是它们都不会执行外部脚本,尽管我可以从web浏览器成功地执行外部脚本。外部脚本只是一个测试,用于将“hello”打印到屏幕上,并打开一个输出文本文件,其中包含时间戳和hello

我不怀疑这些建议方法的有效性,但也许我使用的虚拟web托管服务(Apache服务器上的某种Unix)配置为不允许它们(?)我不知道为什么这些方法对我不起作用。如果有人知道这一点,我们将不胜感激

不过,接下来,我研究这两种方法的原因是,web托管服务告诉我不应该使用分叉,并说“分叉是一个复杂的过程,需要广泛的知识,CGI脚本不是真正的过程……如果你使用CGI脚本,你是在自找麻烦。”

事实上,我已经构建了一个CGI脚本,它使用fork()和exec()同时处理多个外部作业。然而,我还发现——在一些随机数目的fork之后(例如,在完全相同的foreach循环中进行了15-17次fork迭代之后)——Perl开始将父进程ID分配为一个新的子进程ID(好像它在进程中间循环主进程?),这导致主脚本执行
exec
,从而自杀。我只是问托管服务怎么可能发生这种情况。这是他们的答案,所以我想我最好不要做他们建议的事

如果没有forking,如果上述两种方法根本不起作用,我就不知所措了。

我在Ubuntu 20.04上用Apache发行版测试了这一点:

use feature qw(say);
use strict;
use warnings;
use CGI;

my $cgi = CGI->new();
print $cgi->header( -type => 'text/plain' );
my $res = system "date";
say "system('date') returned value: $res";
my $date = qx'date';
say "The date is: $date";
exit;
它在这里工作得很好。浏览器中的输出为:

Sun Dec 13 09:18:25 CET 2020
system('date') returned value: 0
The date is: Sun Dec 13 09:18:25 CET 2020
我在Ubuntu 20.04上用Apache发行版测试了这一点:

use feature qw(say);
use strict;
use warnings;
use CGI;

my $cgi = CGI->new();
print $cgi->header( -type => 'text/plain' );
my $res = system "date";
say "system('date') returned value: $res";
my $date = qx'date';
say "The date is: $date";
exit;
它在这里工作得很好。浏览器中的输出为:

Sun Dec 13 09:18:25 CET 2020
system('date') returned value: 0
The date is: Sun Dec 13 09:18:25 CET 2020

“。但它们都不会执行”:调用
system()
时返回值是多少?“Perl开始将父进程ID指定为新的子进程ID”-我认为这可能是错误的观察或误解,或者是(未知)脚本中的错误。无论如何,分配进程id不是由Perl决定的,这是由底层操作系统完成的。并且操作系统不会两次分配进程id,即不可能同时有两个进程具有相同的pid。1)“什么都不做”不是对问题的充分描述。2)
backticks
使用
fork
<代码>系统也可以。3) Perl不分配PID,操作系统分配。操作系统不会分配当前正在使用的PID。4)
系统
和反勾号工作正常,尽管
&命令只能在unix系统上工作。5) 将使用
&如果不进行daemonize,则可以正常工作?@SteffenUllrich好的,Steffen。您和igekami都在说不可能将父ID重新分配为分叉子进程,因此我将在更简单的分叉脚本上下文中重新检查返回的进程ID,以排除任何我以前没有看到的原因。@igekami使用外部脚本的完整路径时需要系统和backticks调用,即使它在同一个目录中,我发现。是的,有包括。没错,根据Perl文档,系统肯定使用了fork,但我正在寻找一种不显式使用fork的方法。Daemonizing超出了我的理解范围,但我的问题似乎通过backticks和系统调用得到了解决。我将更深入地研究我的fork问题可能是什么。感谢您的响应。“…但它们都不会执行”:当您调用
system()
时,返回值是多少?“Perl开始将父进程ID指定为新的子进程ID”-我认为这可能是一个错误的观察或误解,或者是(未知)脚本中的错误。无论如何,分配进程id不是由Perl决定的,这是由底层操作系统完成的。并且操作系统不会两次分配进程id,即不可能同时有两个进程具有相同的pid。1)“什么都不做”不是对问题的充分描述。2)
backticks
使用
fork
<代码>系统
也可以。3) Perl不分配PID,操作系统分配。操作系统不会分配当前正在使用的PID。4)
系统
和反勾号工作正常,尽管
&命令只能在unix系统上工作。5) 将使用
&如果不进行daemonize,则可以正常工作?@SteffenUllrich好的,Steffen。您和igekami都在说不可能将父ID重新分配为分叉子进程,因此我将在更简单的分叉脚本上下文中重新检查返回的进程ID,以排除任何我以前没有看到的原因。@igekami使用外部脚本的完整路径时需要系统和backticks调用,即使它在同一个目录中,我发现。是的,有包括。没错,根据Perl文档,系统肯定使用了fork,但我正在寻找一种不显式使用fork的方法。Daemonizing超出了我的理解范围,但我的问题似乎通过backticks和系统调用得到了解决。我将更深入地研究我的fork问题可能是什么。谢谢你的回复。嗨,Håkon。谢谢你费心检查。系统的返回值为“0”,尽管f