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

12

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

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

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

ssh -t -t ServerA bashScript.sh

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

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

Сервер B: kickOffTests.shимеет линиюssh -t -t ServerA runTests.sh

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

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

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

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

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

jasper77
источник

Ответы:

13

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

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

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

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

  • Вывод file …/executableна сервер Б.
  • Некоторая информация о цели, такая как вывод, uname -aесли это unix-like.
  • Убедитесь, что цель видит каждый раз одно и то же содержимое файла: run cksum ./executableили md5sum ./executableлюбой другой метод, который вы используете для цели, непосредственно перед тем, как вызовет another-bash-script ./executable. Убедитесь, что результаты одинаковы при вызове Hudson, при успешном вызове вручную и на сервере B.
  • Добавьте set -xвверху еще один-bash-скрипт (чуть ниже #!/bin/bashстроки). Это произведет след всего, что делает скрипт. Сравните следы и сообщите любую разницу или странность.
  • Опишите, как загружается цель, когда вы запускаете сценарии вручную и когда участвует Хадсон. Возможно, цель загружается по-другому, и какой-то загружаемый модуль, обеспечивающий поддержку формата ./executable, не загружается (или еще не загружен) в вызовах Hudson. Возможно, вы захотите использовать set -xв других сценариях, чтобы помочь вам там, и проверить журналы загрузки от цели.
Жиль "ТАК - перестань быть злым"
источник
Если скрипт содержит «. ./Executable», я не столкнусь с этой проблемой, независимо от того, как скрипт вызывается? Когда я вызываю «./kickOffTests.sh», перед тем, как «./executable» будет вызван на цели, есть несколько уровней сценариев. Вы правы, что я не должен делать предположения в этом вопросе, но поскольку единственное, что отличается, это то, как вызывается родительский скрипт, когда один путь выполняется вручную в открытом ssh-терминале, а другой - автоматически Хадсоном, кажется, ответ заключается в этой разнице.
jasper77
@ jasper77: Теперь я понимаю, что сообщение об ошибке не совсем то, что я первоначально думал (хотя, если ваша проблема связана с терминалами, соединение очень косвенное). Посмотрите мой пересмотренный ответ и постарайтесь предоставить как можно больше предлагаемых дополнительных данных.
Жиль "ТАК - перестать быть злым"
Я признаю, что с красным лицом ради блага других, сценарии делали не совсем то, что я думал. Жиль прибил его; исполняемые файлы были созданы для другой цели. В строке «make -C» одного сценария я исключил целевое имя, поэтому вместо того, который я собирался, была создана цель по умолчанию. После того, как я это исправил, Хадсон успешно справился с мини-уроком. Так как я столкнулся с проблемами, связанными с консольным приложением, запущенным из ssh, и узнал о «export TERM = console» и «ssh -t -t», я был убежден, что мои проблемы были там. Спасибо, Жиль!
jasper77
0

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

#!/bin/bash

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

Кевин Ламс
источник