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

2

Eu fiz o download do programa de linha de comando "Whitaker's Words" que estava disponível para Linux, Windows, etc.

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

./words

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

Então decidi aplicar algumas alterações no código-fonte e recompilá-lo. Para isso, usei os seguintes comandos (os últimos quatro 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 no meu servidor usando shell_exec() ou passthru() do PHP, simplesmente não havia saída! De acordo com ldd , o programa é statically linked , então deve funcionar, não é?

Estou testando e depurando há semanas e não consigo encontrar nenhum motivo para isso. Você pode me ajudar?

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

(Eu acho que isso não é uma questão de programação, como o meu problema é apenas: Como obter esse programa em execução no meu servidor web?)

Sistema que eu quero compilar o programa em:

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

Este é o mais novo lançamento Wubi (32 bits) do Ubuntu.

ldd --version outputs ldd (Ubuntu EGLIBC 2.13-20ubuntu5) 2.13

Sistema Eu quero rodar o programa compilado em (webserver):

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

ldd --version outputs ldd (GNU libc) 2.7

Nota:

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

Atualização # 1:

Eu 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. O Ubuntu 5.10 acabou de dizer: floating point exception . Isso ajuda? Por que há uma exceção, mas não no Ubuntu 11.10?

Atualização nº 2:

Agora compilado com o Ubuntu 5.1 usando o GNAT 3.4. Mas toda a esperança para nada - ainda sem saída, ldd diz statically linked (como eu compilei dessa forma) e strace dá a mesma mensagem de erro. O que isso significa? Existe algum arquivo faltando? É este o motivo pelo 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 +++
    
por caw 03.04.2012 / 23:32

3 respostas

3

Quando você executa algo 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ê está fazendo o escape do shell você deve pelo menos fazer o seguinte:

  • Chame o programa por caminho completo: por exemplo, /usr/local/bin/gnatmake ou /usr/local/bin/words
  • obtenha a saída de /usr/bin/env para ter certeza de que no escape do shell ele tenha configurações adequadas. Verifique as mesmas configurações no seu terminal shell.
  • Se você tiver o controle do servidor da Web, tente executá-lo como seu UID para evitar problemas de permissões.
  • Verifique quais bibliotecas são necessárias para o programa, se houver ldd /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. Isto irá dizer-lhe se o programa é executado e se falha.

Uma coisa mais a verificar é se o usuário www-data ou o que estiver executando o ./words é capaz de acessar o banco de dados que o ./words precisa, se houver.

    
por 04.04.2012 / 16:09
2

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

Você também deveria ter espiado em seus registros do servidor WEB.

    
por 08.04.2012 / 06:45
1

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

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

    
por 12.04.2012 / 01:49