A mensagem cannot execute binary file
não tem nada a ver com terminais (eu me pergunto o que te levou a pensar isso - e eu recomendo evitar fazer tais suposições em uma questão, já que elas tendem a afogar seu problema real em uma confusão de pistas falsas) . Na verdade, é a maneira como o bash expressa ENOEXEC
(mais comumente expresso como exec format error
.
Primeiro, certifique-se de que você não tenha tentado acidentalmente executar esse executável como um script. Se você escreveu . ./executable
, isso diz ao bash para executar ./executable
no mesmo ambiente que o script de chamada (em oposição a um processo separado). Isso não pode ser feito se o arquivo não for um script.
Caso contrário, esta mensagem significa que ./executable
não está em um formato que o kernel reconheça. Eu não tenho nenhum palpite definitivo sobre o que está acontecendo. Se você puder executar o script na mesma máquina invocando-o de uma maneira diferente, ele não poderá ser apenas um arquivo corrompido ou um arquivo para a arquitetura incorreta (pode ser que, mas há mais). Pergunto-me se poderia haver uma diferença na forma como o alvo inicia (talvez uma condição de corrida).
Veja uma lista de dados adicionais que podem ajudar:
- Saída de
file …/executable
no servidor B. - Algumas informações sobre o destino, como a saída de
uname -a
, se for do tipo unix. - Verifique se o destino vê o mesmo conteúdo de arquivo a cada vez: execute
cksum ./executable
oumd5sum ./executable
ou qualquer método que você tenha no destino antes de ainda-outro-bash-script invocar./executable
. Verifique se os resultados são os mesmos na chamada de Hudson, na sua invocação manual bem-sucedida e no servidor B. - Adicione
set -x
na parte superior do script yet-another-bash (logo abaixo da linha#!/bin/bash
). Isso produzirá um rastro de tudo o que o script faz. Compare os traços e relate qualquer diferença ou esquisitice. - Descreva como o alvo está inicializando quando você executa os scripts manualmente e quando o Hudson está envolvido. Pode ser que o destino seja inicializado de forma diferente e algum módulo carregável que forneça o suporte para o formato de
./executable
não seja carregado (ou não seja carregado ainda) nas chamadas do Hudson. Você pode querer usarset -x
em outros scripts para ajudá-lo lá e inspecionar os logs de inicialização do destino.