./executable: неможливо виконати бінарний файл


12

У мене є сценарій, який добре працює, коли я сш на сервер, щоб виконати його сам, але є проблеми, коли Хадсон , сервер безперервної інтеграції, запускає його.

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

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

ssh -t -t ServerA bashScript.sh

щоб запустити ці тести на ціль Я перебуваю на сервері C, я можу отримати ті тести, які виконуються ssh'ing на сервері B та виконавши скрипт, що ssh's на сервері A, який виконує minicom з runcript. Вау. Огляд:

Сервер A: Хадсон використовує свій підлеглий механізм для отримання ssh на сервер B.

Сервер B: kickOffTests.shмає лініюssh -t -t ServerA runTests.sh

Сервер A: runTests.shвикликає сценарій perl, який викликаєminicom -S my.script ttyE1

Завдання після завантаження: монтує каталог із сервера B, де є тести, і вводить цей каталог. Він викликає ще один скрипт bash, який запускає тести, складені C виконуваними файлами.

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

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

Хтось може мені пояснити, що відбувається і як я можу це виправити? Я не можу видалити жодного із серверів із цього рівняння. Можливо, можна вийняти мініком з рівняння, але це додасть невідомої кількості часу в цей проект, тому я б більше віддав перевагу рішенню, яке використовує те, що я вже маю.

Відповіді:


13

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

По-перше, переконайтеся, що ви випадково не намагалися запустити цей виконуваний файл як сценарій. Якщо ви писали . ./executable, це повідомляє bash виконуватись ./executableу тому ж середовищі, що і викличний сценарій (на відміну від окремого процесу). Це неможливо зробити, якщо файл не є сценарієм.

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

Ось перелік додаткових даних, які можуть допомогти:

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

Якщо сценарій містить "./executable", чи не зіткнувся б я з цією проблемою незалежно від того, як викликається сценарій? Коли я викликаю "./kickOffTests.sh", перед тим, як викликати "./executable", націлюється кілька шарів скриптів. Ви маєте рацію, що я не повинен робити припущення у питанні, але оскільки єдине, що відрізняється, це те, як викликається батьківський скрипт, коли один спосіб вручну знаходиться у відкритому ssh-терміналі, а інший автоматично - Хадсон, здається, відповідь полягає в цій різниці.
jasper77

@ jasper77: Я розумію, що зараз повідомлення про помилку не зовсім означає те, що я спочатку думав (хоча якщо ваша проблема пов'язана з терміналами, з'єднання дуже непряме). Перегляньте мою переглянуту відповідь і спробуйте надати якомога більше запропонованих додаткових даних.
Жил "ТАК - перестань бути злим"

Я визнаю, що червоний стикався з користю для інших, що сценарії не роблять саме так, як я думав. Жиль прибив її; виконувані файли були побудовані для іншої цілі. У рядку "make -C" одного сценарію я залишив цільове ім'я, тому ціль за замовчуванням була побудована замість тієї, яку я призначив. Після того, як я це зафіксував, Хадсон успішно може управляти мініком сесоном. Оскільки я зіткнувся з проблемами, пов’язаними з консольною програмою, що працює від ssh, і дізнався про "експортувати TERM = консоль" та "ssh -t -t" по дорозі, я був переконаний, що мої проблеми існують. Дякую Жилле!
jasper77

0

Це може статися, якщо ви пропустили рядок shebang у верхній частині сценарію. Переконайтеся, що сценарій починається з:

#!/bin/bash

Це виявилося для мене лише тоді, коли я запускав сценарій sudo -u <user>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.