【问题标题】:Executing Perl through PHP returns Exit Status 2通过 PHP 执行 Perl 返回退出状态 2
【发布时间】:2014-03-17 01:33:21
【问题描述】:

我正在尝试通过以下命令通过 PHP 执行 Perl 脚本:

$last_line = exec('/usr/bin/perl /path/to/perl/script.pl ' . escapeshellarg($argument),$output,$status);

脚本不执行其功能,退出状态始终为 2(shell 内置函数使用不当)。 Perl 和脚本都可以被任何用户读取和执行。在命令行上运行脚本就可以了。有什么想法吗?

【问题讨论】:

  • 执行php脚本的用户和shell执行脚本的用户有区别吗?
  • 是的,apache2用户执行脚本失败,而我的普通用户可以正常执行。
  • STDERR 打印出什么错误?
  • 最常见的错误:权限错误,或者脚本假定当前工作目录是正在执行的脚本所在的目录。
  • 因为我在失败时通过 Web 服务器运行脚本,所以我没有收到任何错误输出消息。另外,我使用完整的文件路径来避免工作目录错误。

标签: php perl bash


【解决方案1】:

我使用此代码运行与 php 文件位于同一文件夹中的 file.pl

$output = passthru("perl relative_path/file.pl ".$_POST["var1"]." ".$_POST["var2"]);

【讨论】:

  • 这两个脚本位于非常不同的目录中。
  • 好的,然后在文件名前添加相对路径,passthru是可行的选项,试试吧
  • 我按照你的方法试过了,没有骰子。另外,我需要分析文件的输出,根据PHP手册(php.net/manual/en/function.passthru.php),使用passthru无法得到输出。
【解决方案2】:

我使用 perl 脚本作为 PHP 的数据库接口,代码如下:

exec ( $cmdToPass . " 2>&1" , $output , $returnVar);

地点:

  • $cmdToPass 是我正在执行的命令(perl 脚本),stderr 重定向到 stdout。
  • $output 保存命令的输出
  • $returnVar 保存退出代码

然后您应该能够打印$output 以确定脚本的原因。您可能还希望检查 PHP 错误日志(通常与 Web 服务器的错误日志相同),看看那里是否捕获了任何内容。

如果您需要有关 exec 函数的更多信息,请参阅PHP manual on exec

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2017-08-14
    • 1970-01-01
    • 2017-05-18
    • 2013-12-23
    相关资源
    最近更新 更多