在 apache2 上运行二进制文件

在 apache2 上运行二进制文件

我有一个在 Apache 2 上运行的 CGI 脚本。它由几个外部命令组成,其中有一个signalp命令:

./signalp -t -m mature.fsa -euk -f all input.fsa > output.fsa

Signalp 是一个 perl 脚本,它利用了 中的 FASTA.pm/usr/local/bin/signalp-4.1/lib和系统架构二进制文件 Ie(nnhowplayer.platform_architecture,对于我的系统而言是 )nnhowplayer.Linux_x86_64 and it is located in /usr/local/bin/signalp-4.1/bin

问题是,当我在我的系统上运行此命令时,它运行正常,但每当我尝试在 apache 2 服务器上运行它时,它都会出现以下错误:

File /usr/local/bin/signalp-4.1/bin/nnhowplayer. cannot be found. 

答案1

从 Web 运行命令与从系统运行命令没有什么不同。造成差异的主要原因是环境变量路径

测试两者(从系统运行和从 Apache2 运行)之间的变量和路径并纠正差异。

您可以按照以下步骤检查您的 Apache2 环境变量和路径:

创建一个简单的脚本来展示您的环境:

/usr/local/bin/set.sh

#!/bin/bash

set

使用 PHP 或 Perl 在 Web 上运行它:

使用 Perl:

#!/usr/bin/perl

use warnings;
use strict;

print "\n\n";

print system("/usr/local/bin/set.sh");

使用 PHP:

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <pre>
 <?php echo '<p>Hello World</p>'; 
 system("/usr/local/bin/set.sh");
 ?> 
 </pre>
 </body>
</html>

最好的起点是确保您的登录路径包含在 Apache2 上运行的程序的路径中。

在这种情况下,Apache2 报告此路径:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

当我从终端运行时,我得到了这个:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin

如果您在运行程序时尝试将所有路径变量添加到 Web 实例,则应获得与从终端运行相同的结果。运行后,您可以系统地修剪您发现不需要的路径元素,例如/usr/games/usr/local/games/snap/bin

相关内容