Linux 程序在 Ubuntu 机器上运行,但不在 Unix Web 服务器上运行

Linux 程序在 Ubuntu 机器上运行,但不在 Unix Web 服务器上运行

我下载了命令行程序“Whitaker's Words”,它适用于 Linux 和 Windows 等。

有一个名为 的主程序words。我尝试在我的 Ubuntu (11.10) 机器上通过命令行执行它,它起作用了:

./words

当我在我的 Linux Web 服务器(Linux 2.6.37-he-xeon-64gb+1 i686)上测试它时,它也能正常工作。

然后我决定对源代码进行一些更改并重新编译它。为此,我使用了以下命令(后四个是支持程序):

gnatmake -O3 words -bargs -static
gnatmake makedict -bargs -static
gnatmake makestem -bargs -static
gnatmake makeefil -bargs -static
gnatmake makeinfl -bargs -static

生成的程序再次在我的 Ubuntu 机器上正常运行,因为我可以在终端中看到正确的输出。

但是当我尝试使用 PHPshell_exec()或在我的网络服务器上执行它时passthru(),根本没有输出!根据ldd,该程序statically linked应该确实有效,不是吗?

我已经测试和调试了几个星期,但我找不到任何原因。你能帮助我吗?

您可以在这里获取该程序:下载链接位于 filedropper.com

(我想这不是编程问题,因为我的问题只是:如何让该程序在我的网络服务器上运行?)

我想在以下系统上编译程序:

Linux ubuntu 3.0.0-12-generic #20-Ubuntu x86 GNU/Linux

这是 Ubuntu 的最新 Wubi(32 位)版本。

ldd --version输出ldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13

我想在(网络服务器)上运行编译后的程序的系统:

Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux

ldd --version输出ldd (GNU libc) 2.7

笔记:

服务器端的错误可以排除,因为如果我用预编译的程序替换我自己的 Linux 程序,一切都会正常。

更新#1:

我尝试在 Ubuntu 5.10 下的 VirtualBox 中运行该程序(在 Ubuntu 11.10 下运行良好),但它也不起作用。好消息,所以这绝对不是服务器的错。 Ubuntu 5.10 刚刚说:floating point exception。这有帮助吗?为什么有异常但在Ubuntu 11.10下没有?

更新#2:

现在使用 GNAT 3.4 使用 Ubuntu 5.1 进行编译。但一切都没有希望 - 仍然没有输出,lddstatically linked(因为我已经这样编译了)并strace给出了相同的错误消息。这是什么意思?是否有文件丢失?这是它不起作用的原因吗?

execve("./words", ["./words"], [/* 15 vars */]) = 0
brk(0)                                  = 0x811e000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

答案1

当您从网络服务器或任何其他程序中以 shell 转义方式执行任何操作时,环境设置很可能不会被应用。例如,诸如:PATHLD_LIBRARY_PATH等变量有其默认设置或没有任何设置,因此当您进行 shell 转义时,您至少应该执行以下操作:

  • 通过完整路径调用程序:例如/usr/local/bin/gnatmake/usr/local/bin/words
  • 获取输出/usr/bin/env以确保在 shell 转义中它具有正确的设置。检查终端 shell 中的相同设置。
  • 如果您可以控制网络服务器,请尝试使其作为您的 UID 执行以避免权限问题。
  • 检查程序需要哪些库(如果有)ldd /usr/local/bin/words

额外的可能性

使用以下脚本代替直接执行程序:

#!/bin/sh
. /etc/profile

/usr/bin/env
pwd
./words 2>&1

并发布输出。这将告诉您程序是否执行以及是否崩溃。

另一件需要检查的事情是用户www-data或正在运行的任何内容./words是否能够访问所需的数据库(./words如果有)。

答案2

尝试不运行程序本身,而是运行运行该程序的脚本并记录其环境和 STDERR 输出。

您还应该查看一下 WEB 服务器日志。

答案3

呃...我是编程的超级初学者,但是...也许在网络服务器中编译程序?或者创建一个与您在网络服务器上运行的配置相同的虚拟机,以便在那里编译代码。

因为一个是x86,另一个是i686,对吗?

相关内容