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,對嗎?

相關內容