我有一个在 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
。