./executable: không thể thực thi tệp nhị phân


12

Tôi có một kịch bản hoạt động tốt khi tôi ssh đến máy chủ để tự thực thi nó, nhưng gặp vấn đề khi Hudson , một máy chủ tích hợp liên tục, chạy nó.

Tôi đang tự động kiểm tra trên một hệ thống linux nhúng (mục tiêu). Mục tiêu được kết nối với Máy chủ A (RHEL 5) thông qua nối tiếp và được vận hành qua minicom. Máy chủ B (FC 12) xây dựng các thử nghiệm thực sự chạy trên mục tiêu và có thể ssh đến Máy chủ A. Máy chủ C (RH) lưu trữ Hudson, với Máy chủ B là nô lệ.

Tôi đã viết một tập lệnh runcript (http://linux.die.net/man/1/runscript) để làm mọi thứ cần thiết trên mục tiêu thực tế; nó khởi động hình ảnh, gắn một thư mục từ Máy chủ B và thực hiện các bài kiểm tra. Một tập lệnh bash trên Máy chủ B gọi minicom với tập lệnh runcript cùng với một số hành động đồng hành. Tôi có một tập lệnh bash trên Máy chủ B sử dụng

ssh -t -t ServerA bashScript.sh

để có được những bài kiểm tra chạy trên mục tiêu. Tôi đang ở trên Máy chủ C, tôi có thể thực hiện các thử nghiệm đó bằng cách chạy đến Máy chủ B và thực thi tập lệnh ssh's đến Máy chủ A thực thi minicom với runcript. Phù Xem lại:

Máy chủ A: Hudson sử dụng cơ chế nô lệ của nó để ssh đến Máy chủ B.

Máy chủ B: kickOffTests.shcó dòngssh -t -t ServerA runTests.sh

Máy chủ A: runTests.shgọi một tập lệnh perl gọiminicom -S my.script ttyE1

Target, sau khi khởi động: Gắn một thư mục từ Máy chủ B, nơi kiểm tra và vào thư mục đó. Nó gọi thêm một tập lệnh bash khác, chạy các bài kiểm tra, được biên dịch C thực thi.

Bây giờ, khi tôi thực hiện bất kỳ kịch bản nào trong số chúng, chúng sẽ làm những gì chúng cần. Tuy nhiên, khi Hudson cố gắng làm điều tương tự, trong phiên minicom, nó phàn nàn về một dòng trong "kịch bản bash khác" gọi lệnh thực thi C ./executable, với./executable: cannot execute binary file

Tôi vẫn còn nhiều điều để tìm hiểu về linux, nhưng tôi cho rằng vấn đề này là kết quả của việc Hudson không kết nối với bảng điều khiển. Tôi không biết chính xác những gì Hudson làm để kiểm soát nô lệ của nó. Tôi đã thử sử dụng dòng export TERM=consoletrong cấu hình ngay trước khi chạy kickPackTests.sh, nhưng vấn đề vẫn còn.

Bất cứ ai có thể giải thích cho tôi những gì đang xảy ra và làm thế nào tôi có thể sửa chữa nó? Tôi không thể loại bỏ bất kỳ máy chủ khỏi phương trình này. Có thể lấy minicom ra khỏi phương trình nhưng điều đó sẽ thêm một lượng thời gian không xác định cho dự án này, vì vậy tôi rất thích một giải pháp sử dụng những gì tôi đã có.

Câu trả lời:


13

Thông điệp cannot execute binary filenày không liên quan gì đến thiết bị đầu cuối (tôi tự hỏi điều gì đã khiến bạn nghĩ như vậy - và tôi khuyên bạn nên tránh đưa ra những giả định như vậy trong một câu hỏi, vì chúng có xu hướng nhấn chìm vấn đề thực tế của bạn trong mớ hỗn độn của những kẻ thừa kế đỏ). Trên thực tế, đó là cách thể hiện của bash ENOEXEC(thường được biểu thị là exec format error.

Trước tiên, hãy chắc chắn rằng bạn đã không vô tình cố chạy chương trình thực thi này dưới dạng tập lệnh. Nếu bạn đã viết . ./executable, điều này sẽ cho bash thực thi ./executabletrong cùng môi trường với tập lệnh gọi (trái ngược với một quy trình riêng). Điều đó không thể được thực hiện nếu tập tin không phải là một tập lệnh.

Mặt khác, thông báo này có nghĩa ./executablelà không ở định dạng mà kernel nhận ra. Tôi không có bất kỳ dự đoán chắc chắn về những gì đang xảy ra mặc dù. Nếu bạn có thể chạy tập lệnh trên cùng một máy đó bằng cách gọi nó theo một cách khác, thì đó không thể là một tệp bị hỏng hoặc một tệp cho kiến ​​trúc sai (có thể là vậy, nhưng có nhiều hơn thế). Tôi tự hỏi liệu có thể có một sự khác biệt trong cách khởi động mục tiêu (có lẽ là một điều kiện cuộc đua).

Dưới đây là danh sách các dữ liệu bổ sung có thể giúp:

  • Đầu ra của file …/executablemáy chủ B.
  • Một số thông tin về mục tiêu, chẳng hạn như đầu ra uname -anếu nó không giống nhau.
  • Hãy kiểm tra xem mục tiêu nhìn thấy các nội dung tập tin giống nhau mỗi lần: chạy cksum ./executablehoặc md5sum ./executablehoặc bất cứ phương pháp mà bạn có trong các mục tiêu gọi ngay trước khi chưa-khác-bash-script ./executable. Kiểm tra xem các kết quả có giống nhau trong lệnh gọi Hudson, trong lệnh gọi thủ công thành công của bạn và trên máy chủ B.
  • Thêm set -xở đầu tập lệnh-bash-script khác (ngay bên dưới #!/bin/bashdòng). Điều này sẽ tạo ra một dấu vết của tất cả mọi thứ mà kịch bản làm. So sánh các dấu vết và báo cáo bất kỳ sự khác biệt hoặc kỳ lạ.
  • Mô tả cách mục tiêu khởi động khi bạn chạy các tập lệnh theo cách thủ công và khi Hudson có liên quan. Có thể là mục tiêu được khởi động khác nhau và một số mô-đun có thể tải được cung cấp hỗ trợ cho định dạng ./executablekhông được tải (hoặc chưa được tải) trong các yêu cầu Hudson. Bạn có thể muốn sử dụng set -xtrong các tập lệnh khác để giúp bạn ở đó và kiểm tra nhật ký khởi động từ mục tiêu.

Nếu tập lệnh chứa ". ./Executable" thì tôi sẽ không gặp phải vấn đề này cho dù tập lệnh được gọi như thế nào? Khi tôi gọi "./kick OfferTests.sh", có một số lớp tập lệnh trước khi "./executable" được gọi trên mục tiêu. Bạn nói đúng rằng tôi không nên đưa ra các giả định trong câu hỏi, nhưng vì điều duy nhất khác biệt là cách tập lệnh gốc được gọi, trong đó một cách là bằng tay trong một thiết bị đầu cuối ssh mở và cách khác là tự động bởi Hudson, nó dường như câu trả lời nằm ở sự khác biệt đó
jasper77

@ jasper77: Bây giờ tôi nhận ra thông báo lỗi không hoàn toàn có nghĩa là những gì tôi nghĩ ban đầu (mặc dù nếu vấn đề của bạn liên quan đến thiết bị đầu cuối, kết nối rất gián tiếp). Xem câu trả lời sửa đổi của tôi và cố gắng cung cấp càng nhiều dữ liệu được đề xuất càng tốt.
Gilles 'SO- ngừng trở nên xấu xa

Tôi thừa nhận màu đỏ phải đối mặt vì lợi ích của người khác rằng các kịch bản không làm đúng như những gì tôi nghĩ. Gilles đóng đinh nó; các tệp thực thi đã được xây dựng cho một mục tiêu khác. Trong một dòng "make -C" của một tập lệnh, tôi đã bỏ đi một tên mục tiêu, vì vậy mục tiêu mặc định được xây dựng thay vì mục tiêu tôi dự định. Khi tôi đã sửa nó, Hudson có thể lái chiếc minicom sesson thành công. Vì tôi đã gặp phải các vấn đề liên quan đến ứng dụng bảng điều khiển chạy từ ssh và đã tìm hiểu về 'export TERM = console' và "ssh -t -t" trên đường đi, tôi đã tin rằng vấn đề của mình đã ở đó. Cảm ơn Gilles!
jasper77

0

Điều này có thể xảy ra nếu bạn thiếu dòng shebang ở đầu tập lệnh của bạn. Đảm bảo tập lệnh bắt đầu bằng:

#!/bin/bash

Điều này chỉ hiển thị cho tôi khi tôi chạy kịch bản với sudo -u <user>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.