我相信有人可以很快回答这个问题,但我只是新来的...
我正在尝试修改demarc(一个简单的网络监视工具)来对一个简单的脚本进行系统调用.脚本本身什么都不做,我只是想做一个'概念验证',因为我不断收到内部服务器错误.脚本的权限已设置为777.当我评论system()调用时,一切都很好.所以这让我怀疑它是发生错误的system()调用.我也尝试过exec(),但这也不起作用.错误不能出现在脚本本身,因为其中只有一个echo"test".
我是否错过了任何权限或是否有其他方法使这项工作?任何建议将不胜感激.
sub generate_ticket {
my @args = ("$base_path/test.pl");
exec(@args);
}
Run Code Online (Sandbox Code Playgroud)
这在文件中的某处称为:
} elsif ($FORM{'delete_type'}=~/generate/) {
my $message = &generate_ticket($delete_array_ref);
#&ack_events($delete_array_ref);
$events_deleted = (@$delete_array_ref);
&push_message("<FONT COLOR=red><B>Result: $message.</B></FONT>");
}
Run Code Online (Sandbox Code Playgroud)
test.pl:
#!/usr/bin/perl
print "Test";
Run Code Online (Sandbox Code Playgroud)
错误日志:[Mon Nov 30 14:58:22 2009] [错误] [client 127.0.0.1]脚本标题过早结束:demarc,referer:http:// localhost/dm/demarc?td = show_events&limit = 60&sid = 35
"脚本标题的过早结束"本身并不是一个非常有用的错误消息.它可能是由许多事情引起的,例如:
但是,在这种情况下,如果我们要逐字地采用您的示例脚本(print "TEST"),并在HTTP标头之前输出它,那么您不会首先生成HTTP标头,因此它是最后一个.Web服务器需要标头,而不是"TEST".
如果情况并非如此,我们需要查看代码的更多内容以了解可能发生的情况.test.pl例如,可能是执行权限问题.
找到过早发生的原因的一种方法是将错误发送到浏览器。您只需在应用程序的早期发送内容类型标头,例如像这样,在代码顶部的某个位置:
BEGIN {
print "Content-type: text/plain\n\n";
}
Run Code Online (Sandbox Code Playgroud)
现在您应该能够在浏览器中看到错误。
听起来您想捕获 的输出test.pl。使用system或exec不会实现这一点(并且使用,您的主脚本在运行exec时将不再运行)。test.pl
相反,您可以使用反引号:
my $message = `$base_path/test.pl`;
Run Code Online (Sandbox Code Playgroud)