Programa Linux rodando na máquina Ubuntu, mas não no servidor web Unix

Programa Linux rodando na máquina Ubuntu, mas não no servidor web Unix

Baixei o programa de linha de comando "Whitaker's Words", que estava disponível para Linux e Windows, etc.

Existe um programa principal chamado words. Tentei executá-lo em minha máquina Ubuntu (11.10) na linha de comando e funcionou:

./words

Quando testei em meu servidor Linux (Linux 2.6.37-he-xeon-64gb+1 i686), funcionou também.

Então decidi aplicar algumas alterações no código fonte e recompilá-lo. Para isso utilizei os seguintes comandos (os quatro últimos são programas de suporte):

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

O programa resultante funcionou corretamente na minha máquina Ubuntu novamente, pois pude ver a saída correta no terminal.

Mas quando tentei executá-lo em meu servidor web usando PHP shell_exec()ou passthru(), simplesmente não houve saída! Segundo ldd, o programa é statically linkedassim, deveria funcionar mesmo, não é?

Estou testando e depurando há semanas e não consigo encontrar nenhuma razão para isso. Pode me ajudar?

Você pode obter o programa aqui:link para download em filedropper.com

(Acho que não é uma questão de programação, pois meu problema é apenas: como fazer esse programa rodar no meu servidor web?)

Sistema no qual quero compilar o programa:

Linux ubuntu 3.0.0-12-genérico #20-Ubuntu x86 GNU/Linux

Esta é a versão mais recente do Wubi (32 bits) do Ubuntu.

ldd --versionsaídasldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13

Sistema no qual desejo executar o programa compilado (servidor web):

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

ldd --versionsaídasldd (GNU libc) 2.7

Observação:

Erros no lado do servidor podem ser excluídos, pois tudo funciona bem se eu substituir meu próprio programa Linux pelo pré-compilado.

Atualização nº 1:

Tentei executar o programa (que funciona bem no Ubuntu 11.10) no meu VirtualBox no Ubuntu 5.10 - e também não funcionou. Boas notícias, então definitivamente não é culpa do servidor. Ubuntu 5.10 acabou de dizer: floating point exception. Isso ajuda? Por que existe uma exceção, mas não no Ubuntu 11.10?

Atualização nº 2:

Agora compilado com Ubuntu 5.1 usando GNAT 3.4. Mas todos esperam por nada - ainda sem saída, ldddiz statically linked(já que compilei dessa forma) e stracedá a mesma mensagem de erro. O que isso significa? Está faltando algum arquivo? É esta a razão pela qual não está funcionando?

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 +++

Responder1

Quando você executa qualquer coisa como um escape de shell do servidor da web ou de qualquer outro programa, as configurações do ambiente provavelmente não são aplicadas. Por exemplo, variáveis ​​como: PATH, LD_LIBRARY_PATH, etc têm suas configurações padrão ou nenhuma configuração, então quando você estiver fazendo o escape do shell você deve pelo menos fazer o seguinte:

  • Chame o programa pelo caminho completo: por exemplo /usr/local/bin/gnatmakeou/usr/local/bin/words
  • obtenha a saída de /usr/bin/envpara garantir que no escape do shell ele tenha as configurações adequadas. Verifique as mesmas configurações no shell do seu terminal.
  • Se você tiver controle do servidor web, tente executá-lo como seu UID para evitar problemas de permissão.
  • Verifique quais bibliotecas são necessárias para o programa, se houverldd /usr/local/bin/words

POSSIBILIDADE ADICIONAL

Em vez de executar o programa diretamente, use o seguinte script:

#!/bin/sh
. /etc/profile

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

e poste a saída. Isso lhe dirá se o programa é executado e se trava.

Mais uma coisa a verificar é se o usuário www-dataou o que quer que esteja executando ./wordsé capaz de acessar o banco de dados ./wordsnecessário, se houver.

Responder2

Tente executar não o programa em si, mas um script executando este programa e registrando seu ambiente e a saída STDERR.

Você também deveria ter espiado os logs do servidor WEB.

Responder3

uh... sou um super iniciante em programação, mas... talvez compilar o programa no servidor web? Ou faça uma máquina virtual com a mesma configuração que você roda no servidor web, para compilar o código ali.

Porque um é x86 e o ​​outro é i686, certo?

informação relacionada