./executable: невозможно выполнить двоичный файл

У меня есть сценарий, который хорошо работает, когда я ssh на сервере, чтобы выполнить его сам, но имеет проблемы, когда Hudson , сервер непрерывной интеграции, запускает его.

Я автоматизирую тесты во встроенной системе Linux (цель). Цель подключена к серверу A (RHEL 5) через последовательный и управляемый миникомпьютер. Сервер B (FC 12) создает тесты, которые фактически выполняются на целевом сервере, и может ssh на сервер A. Сервер C (RH) размещает Hudson, а сервер B – как подчиненный.

Я написал сценарий сценария (http://linux.die.net/man/1/runscript), чтобы сделать все необходимое для фактической цели; он загружает изображение, монтирует каталог с сервера B и выполняет тесты. Сценарий bash на сервере B вызывает minicom с скриптом сценария вместе с некоторыми действиями сопутствующих. У меня есть сценарий bash на сервере B, который использует

ssh -t -t ServerA bashScript.sh 

чтобы эти тесты выполнялись на цели. Я на сервере C, я могу получить эти тесты, запущенные ssh'ing, на сервер B и выполнение сценария, который ssh ​​на сервере A, который выполняет minicom с помощью скрипта. Уф. Для обзора:

Сервер A: Хадсон использует свой подчиненный механизм для ssh на сервере B.

Сервер B: kickOffTests.sh имеет строку ssh -t -t ServerA runTests.sh

Сервер A: runTests.sh вызывает скрипт perl, который вызывает minicom -S my.script ttyE1

Target, после загрузки: монтирует каталог с сервера B, где проходят тесты, и входит в этот каталог. Он вызывает еще один скрипт bash, который запускает тесты, которые скомпилированы исполняемыми файлами C.

Теперь, когда я сам запускаю любой из этих скриптов, они делают то, что должны. Однако, когда Хадсон пытается сделать то же самое, в сеансе minicom он жалуется на строку в «еще одном сценарии bash», который вызывает исполняемый файл C. ./executable с ./executable: cannot execute binary file

Мне все еще нужно много узнать о Linux, но я предполагаю, что эта проблема является результатом того, что Хадсон не подключается к консоли. Я не знаю точно, что Хадсон делает, чтобы контролировать своего раба. Я попытался использовать строку export TERM=console в конфигурации перед запуском kickOffTests.sh, но проблема остается.

Может ли кто-нибудь объяснить мне, что происходит, и как я могу это исправить? Я не могу удалить ни один из серверов из этого уравнения. Возможно, выберем minicom из уравнения, но это добавит неизвестное количество времени к этому проекту, поэтому я бы предпочел решение, которое использует то, что у меня уже есть.

Сообщение cannot execute binary file , не имеет ничего общего с терминалами (интересно, что заставило вас думать об этом – и я рекомендую избегать принятия таких предположений в вопросе, поскольку они, как правило, утоляют вашу реальную проблему в беспорядке красных сельдей). Фактически, это способ bash выразить ENOEXEC (чаще выражается как exec format error .

Во-первых, убедитесь, что вы случайно не попытались запустить этот исполняемый файл в качестве скрипта. Если вы написали . ./executable . ./executable , это говорит bash выполнить ./executable в той же среде, что и вызывающий скрипт (в отличие от отдельного процесса). Это невозможно, если файл не является скриптом.

В противном случае это сообщение означает, что ./executable не в формате, который распознает ядро. Я не имею никакого определенного предположения относительно того, что происходит, хотя. Если вы можете запустить сценарий на том же компьютере, вызывая его по-другому, он не может быть просто поврежденным файлом или файлом для неправильной архитектуры (возможно, это так, но есть еще что-то). Интересно, может ли быть разница в том, как ботинок цели (возможно, состояние гонки).

Вот список дополнительных данных, которые могут помочь:

  • Вывод file …/executable на сервере B.
  • Некоторая информация о цели, такая как вывод uname -a если она похожа на unix.
  • Убедитесь, что цель видит одно и то же содержимое файла каждый раз: запустите cksum ./executable или md5sum ./executable или какой-либо другой метод, который у вас есть на целевом компьютере, перед тем как еще один-другой-bash-script вызывает ./executable . Убедитесь, что результаты совпадают в вызове Хадсона, в вашем успешном ручном вызове и на сервере B.
  • Добавьте set -x в начало еще-еще-bash-скрипта (чуть ниже строки #!/bin/bash ). Это создаст след всего, что делает скрипт. Сравните следы и сообщите о любой разнице или странности.
  • Опишите, как загружается цель при запуске скриптов вручную и когда задействован Хадсон. Возможно, что цель загружается по-разному, а какой-то загружаемый модуль, поддерживающий формат ./executable , не загружается (или еще не загружен) в ./executable Hudson. Возможно, вы захотите использовать set -x в других сценариях, чтобы помочь вам там, и проверить журналы загрузки с целевого объекта.

Это может произойти, если вам не хватает строки shebang в верхней части вашего скрипта. Убедитесь, что сценарий начинается с:

 #!/bin/bash 

Это только показалось мне, когда я запускал скрипт с помощью sudo -u <user>