Linux プログラムは Ubuntu マシンでは動作しますが、Unix Web サーバーでは動作しません

Linux プログラムは Ubuntu マシンでは動作しますが、Unix Web サーバーでは動作しません

Linux や Windows などで利用可能なコマンドライン プログラム「Whitaker's Words」をダウンロードしました。

という名前のメイン プログラムがありますwords。Ubuntu (11.10) マシンでコマンド ラインから実行してみましたが、うまくいきました。

./words

Linux ウェブサーバー (Linux 2.6.37-he-xeon-64gb+1 i686) でテストしたところ、同様に動作しました。

そこで、ソース コードにいくつかの変更を加えて再コンパイルすることにしました。そのために、次のコマンドを使用しました (最後の 4 つはサポート プログラムです)。

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

ターミナルに正しい出力が表示され、結果として得られたプログラムは Ubuntu マシン上で再び正常に動作しました。

shell_exec()しかし、PHP のまたは を使用して Web サーバー上で実行しようとしたところpassthru()、出力がまったくありませんでした。 によるとldd、プログラムは なのでstatically linked、実際に動作するはずですよね?

何週間もテストとデバッグをしていますが、なぜそうなるのか理由がわかりません。助けてもらえますか?

プログラムはここから入手できます:ダウンロードリンクはfiledropper.com

(これはプログラミングに関する質問ではないと思います。私の問題は、そのプログラムを Web サーバーで実行するにはどうすればよいかということです。)

プログラムをコンパイルしたいシステム:

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

コンパイルされたプログラムを実行するシステム (Web サーバー):

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 でコンパイルされています。しかし、期待はずれです。まだ出力がなく、(そのようにコンパイルしたため)同じエラー メッセージが表示されlddます。これはどういう意味ですか? ファイルが不足していますか? これが動作しない理由ですか?statically linkedstrace

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

Web サーバーまたは他のプログラムからシェル エスケープとして何かを実行する場合、環境設定は適用されない可能性が高くなります。たとえば、、などの変数にはPATHデフォルトLD_LIBRARY_PATH設定が設定されている、またはまったく設定されていないため、シェル エスケープを実行するときは、少なくとも次の操作を行う必要があります。

  • フルパスでプログラムを呼び出します: 例:/usr/local/bin/gnatmakeまたは/usr/local/bin/words
  • の出力を取得して、/usr/bin/envシェル エスケープに適切な設定があることを確認します。ターミナル シェルで同じ設定を確認します。
  • Web サーバーを制御できる場合は、権限の問題を回避するために、自分の UID として実行するようにしてください。
  • プログラムに必要なライブラリがあるかどうかを確認しますldd /usr/local/bin/words

さらなる可能性

プログラムを直接実行する代わりに、次のスクリプトを使用します。

#!/bin/sh
. /etc/profile

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

出力を投稿します。これにより、プログラムが実行されたかどうか、クラッシュしたかどうかがわかります。

確認する必要があるもう 1 つの点は、ユーザーwww-dataまたは実行しているものが、必要な./wordsデータベースにアクセスできるかどうかです./words

答え2

プログラム自体ではなく、このプログラムを実行し、その環境と STDERR 出力をログに記録するスクリプトを実行してみてください。

また、WEB サーバーのログも確認しておく必要があります。

答え3

えーと...私はプログラミングの超初心者ですが...プログラムをウェブサーバーでコンパイルするのでしょうか? または、ウェブサーバーで実行するのと同じ構成の仮想マシンを作成して、そこでコードをコンパイルします。

一方が x86 で、もう一方が i686 だからですか?

関連情報