./executable: tidak dapat mengeksekusi file biner

12

Saya memiliki skrip yang berfungsi dengan baik ketika saya ssh ke server untuk mengeksekusinya sendiri, tetapi memiliki masalah ketika Hudson , server integrasi berkelanjutan, menjalankannya.

Saya mengotomatiskan tes pada sistem linux tertanam (target). Target terhubung ke Server A (RHEL 5) melalui serial dan dioperasikan melalui minicom. Server B (FC 12) membangun tes yang benar-benar berjalan pada target, dan dapat ssh ke Server A. Server C (RH) host Hudson, dengan Server B sebagai budak.

Saya telah menulis skrip skrip skrip (http://linux.die.net/man/1/runscript) untuk melakukan semua yang diperlukan pada target aktual; mem-boot gambar, me-mount direktori dari Server B dan menjalankan tes. Skrip bash di Server B memanggil minicom dengan skrip skrip berjalan bersama beberapa tindakan pendamping. Saya memiliki skrip bash di Server B yang menggunakan

ssh -t -t ServerA bashScript.sh

untuk menjalankan tes tersebut pada target. Saya di Server C, saya bisa menjalankan tes tersebut dengan ssh'ing ke Server B dan mengeksekusi skrip yang ssh ke Server A yang mengeksekusi minicom dengan runcript. Wah. Untuk meninjau:

Server A: Hudson menggunakan mekanisme slave-nya untuk ssh ke Server B.

Server B: kickOffTests.shmemiliki garisssh -t -t ServerA runTests.sh

Server A: runTests.shmemanggil skrip perl yang memanggilminicom -S my.script ttyE1

Target, setelah boot: Memasang direktori dari Server B, tempat pengujian, dan memasuki direktori itu. Ini memanggil skrip bash lain, yang menjalankan tes, yang dikompilasi C executable.

Sekarang, ketika saya mengeksekusi salah satu dari skrip ini sendiri, mereka melakukan apa yang seharusnya. Namun, ketika Hudson mencoba untuk melakukan hal yang sama, selama sesi minicom itu mengeluh tentang garis dalam "skrip bash lain" yang memanggil C executable ./executable,, dengan./executable: cannot execute binary file

Saya masih harus banyak belajar tentang linux, tetapi saya menduga masalah ini adalah akibat Hudson tidak terhubung dengan konsol. Saya tidak tahu persis apa yang dilakukan Hudson untuk mengendalikan budaknya. Saya mencoba menggunakan baris export TERM=consoledalam konfigurasi sebelum menjalankan kickOffTests.sh, tetapi masalahnya tetap ada.

Adakah yang bisa menjelaskan kepada saya apa yang terjadi dan bagaimana saya bisa memperbaikinya? Saya tidak dapat menghapus server mana pun dari persamaan ini. Dimungkinkan untuk mengambil minicom dari persamaan tetapi itu akan menambah jumlah waktu yang tidak diketahui untuk proyek ini, jadi saya lebih suka solusi yang menggunakan apa yang sudah saya miliki.

jasper77
sumber

Jawaban:

13

Pesannya cannot execute binary filetidak ada hubungannya dengan terminal (saya ingin tahu apa yang membuat Anda berpikir demikian - dan saya sarankan menghindari membuat asumsi seperti itu dalam pertanyaan, karena mereka cenderung menenggelamkan masalah Anda yang sebenarnya dalam kekacauan ikan haring merah). Bahkan, ini adalah cara bash untuk mengekspresikan ENOEXEC(lebih umum dinyatakan sebagai exec format error.

Pertama, pastikan Anda tidak secara tidak sengaja mencoba menjalankan executable ini sebagai skrip. Jika Anda menulis . ./executable, ini memberitahu bash untuk mengeksekusi ./executabledi lingkungan yang sama dengan skrip panggilan (sebagai lawan dari proses terpisah). Itu tidak dapat dilakukan jika file tersebut bukan skrip.

Jika tidak, pesan ini berarti ./executabletidak dalam format yang dikenali kernel. Saya tidak memiliki dugaan pasti tentang apa yang terjadi. Jika Anda dapat menjalankan skrip pada mesin yang sama dengan menjalankannya dengan cara yang berbeda, itu tidak bisa hanya berupa file yang rusak atau file untuk arsitektur yang salah (mungkin itu, tetapi ada lebih dari itu). Saya bertanya-tanya apakah mungkin ada perbedaan dalam cara sepatu bot target (mungkin kondisi lomba).

Berikut daftar data tambahan yang dapat membantu:

  • Output dari file …/executablepada server B.
  • Beberapa informasi tentang target, seperti output uname -ajika itu seperti unix.
  • Periksa apakah target melihat konten file yang sama setiap kali: jalankan cksum ./executableatau md5sum ./executableatau metode apa pun yang Anda miliki pada target sebelum memanggil-bash-script lagi ./executable. Pastikan hasilnya sama di doa Hudson, dalam doa manual sukses Anda dan di server B.
  • Tambahkan set -xdi bagian atas skrip bash-lain (tepat di bawah #!/bin/bashgaris). Ini akan menghasilkan jejak dari semua yang dilakukan skrip. Bandingkan jejak dan laporkan perbedaan atau keanehan.
  • Jelaskan bagaimana target boot ketika Anda menjalankan skrip secara manual dan ketika Hudson terlibat. Bisa jadi targetnya di-boot secara berbeda dan beberapa modul yang dapat dimuat yang menyediakan dukungan untuk format ./executabletidak dimuat (atau belum dimuat) dalam doa Hudson. Anda mungkin ingin menggunakan set -xskrip lain untuk membantu Anda di sana, dan memeriksa log boot dari target.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jika skrip berisi "./executable" maka bukankah saya akan menghadapi masalah ini tidak peduli bagaimana skrip dipanggil? Ketika saya memanggil "./kickOffTests.sh", ada beberapa lapisan skrip sebelum "./executable" dipanggil pada target. Anda benar bahwa saya tidak boleh membuat asumsi dalam pertanyaan, tetapi karena satu-satunya hal yang berbeda adalah bagaimana script induk dipanggil, di mana satu cara adalah dengan tangan di terminal ssh terbuka dan yang lainnya secara otomatis oleh Hudson, itu sepertinya jawabannya ada pada perbedaan itu.
jasper77
@ jasper77: Saya menyadari sekarang pesan kesalahan tidak cukup berarti apa yang awalnya saya pikirkan (meskipun jika masalah Anda terkait dengan terminal, koneksi sangat tidak langsung). Lihat jawaban saya yang telah direvisi, dan cobalah untuk memberikan sebanyak mungkin data tambahan yang disarankan.
Gilles 'SANGAT berhenti menjadi jahat'
Saya akui wajah merah untuk kepentingan orang lain bahwa skrip tidak melakukan persis apa yang saya pikirkan. Gilles memakukannya; executable telah dibangun untuk target yang berbeda. Dalam baris "make -C" dari satu skrip, saya telah meninggalkan nama target, jadi target default dibuat alih-alih yang saya maksudkan. Setelah saya memperbaikinya, Hudson berhasil mengendarai minicom sesson. Karena saya telah mengalami masalah yang berkaitan dengan aplikasi konsol yang berjalan dari ssh, dan belajar tentang 'export TERM = console' dan "ssh -t -t" di sepanjang jalan, saya yakin masalah saya ada di sana. Gilles terima kasih!
jasper77
0

Ini bisa terjadi jika Anda kehilangan garis shebang di bagian atas skrip Anda. Pastikan skrip dimulai dengan:

#!/bin/bash

Ini hanya muncul untuk saya ketika saya menjalankan skrip dengan sudo -u <user>

Kevin Lamse
sumber