Программа Linux работает на машине Ubuntu, но не на веб-сервере Unix

Программа Linux работает на машине Ubuntu, но не на веб-сервере Unix

Я загрузил программу командной строки «Whitaker's Words», которая была доступна как для Linux, так и для Windows и т. д.

Есть основная программа с именем words. Я попробовал запустить ее на моей машине Ubuntu (11.10) в командной строке, и это сработало:

./words

Когда я протестировал это на своем веб-сервере Linux (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, и я увидел корректный вывод в терминале.

Но когда я попытался выполнить его на моем веб-сервере с помощью PHP shell_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 11.10) в моем VirtualBox под Ubuntu 5.10 — и она тоже не сработала. Хорошие новости, так что это точно не вина сервера. Ubuntu 5.10 только что сказал: floating point exception. Это помогает? Почему есть исключение, но не под Ubuntu 11.10?

Обновление №2:

Сейчас скомпилировал с Ubuntu 5.1 с использованием GNAT 3.4. Но все надежды напрасны - по-прежнему нет вывода, 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

Когда вы выполняете что-либо как выход из оболочки с веб-сервера или любой другой программы, настройки среды, скорее всего, не будут применены. Например, переменные, такие как: PATH, LD_LIBRARY_PATH, и т. д. имеют свои настройки по умолчанию или вообще не имеют настроек, поэтому, когда вы выполняете выход из оболочки, вы должны как минимум сделать следующее:

  • Вызовите программу по полному пути: например /usr/local/bin/gnatmakeили/usr/local/bin/words
  • получить вывод, /usr/bin/envчтобы убедиться, что в оболочке escape у него правильные настройки. Проверьте те же настройки в вашей терминальной оболочке.
  • Если у вас есть контроль над веб-сервером, попробуйте заставить его выполняться от вашего UID, чтобы избежать проблем с разрешениями.
  • Проверьте, какие библиотеки требуются для программы, если таковые имеются.ldd /usr/local/bin/words

ДОПОЛНИТЕЛЬНАЯ ВОЗМОЖНОСТЬ

Вместо непосредственного выполнения программы используйте следующий скрипт:

#!/bin/sh
. /etc/profile

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

и опубликуйте вывод. Это скажет вам, выполняется ли программа или она вылетает.

Еще одна вещь, которую следует проверить, — имеет ли пользователь www-dataили то, что запускает, ./wordsвозможность доступа к необходимой базе данных ( ./wordsесли таковая имеется).

решение2

Попробуйте запустить не саму программу, а скрипт, запускающий эту программу и регистрирующий ее окружение и вывод STDERR.

Вам также следовало бы заглянуть в журналы вашего веб-сервера.

решение3

эээ... Я супер-новичок в программировании, но... может быть, скомпилировать программу на веб-сервере? Или создать виртуальную машину с той же конфигурацией, что вы запускаете на веб-сервере, чтобы скомпилировать код там.

Потому что один — x86, а другой — i686, верно?

Связанный контент