LinuxプログラムはUbuntuシステムで実行されますが、Unix Webサーバーでは実行されません。

LinuxプログラムはUbuntuシステムで実行されますが、Unix Webサーバーでは実行されません。

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

というメインプログラムがありますwords。 Ubuntu(11.10)システムでコマンドラインで実行してみましたが、正常に動作しました。

./words

Linux Webサーバー(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-一般 #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 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

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存在する場合)へのアクセス権を持っているかどうかです。

おすすめ記事