./executable: ไม่สามารถเรียกใช้ไฟล์ไบนารี


12

ฉันมีสคริปต์ที่ทำงานได้ดีเมื่อฉันส่งไฟล์ไปยังเซิร์ฟเวอร์เพื่อรันด้วยตัวเอง แต่มีปัญหาเมื่อฮัดสันซึ่งเป็นเซิร์ฟเวอร์รวมอย่างต่อเนื่องรันได้

ฉันกำลังทำการทดสอบอัตโนมัติบนระบบลินุกซ์ในตัว (เป้าหมาย) เป้าหมายเชื่อมต่อกับเซิร์ฟเวอร์ A (RHEL 5) ผ่านทางอนุกรมและดำเนินการผ่าน minicom เซิร์ฟเวอร์ B (FC 12) สร้างการทดสอบที่ทำงานบนเป้าหมายจริงและสามารถ ssh ไปที่เซิร์ฟเวอร์ A เซิร์ฟเวอร์ C (RH) โฮสต์ฮัดสันโดยเซิร์ฟเวอร์ B เป็นทาส

ฉันได้เขียนสคริปต์ runcript (http://linux.die.net/man/1/runscript) เพื่อทำทุกอย่างที่จำเป็นในเป้าหมายจริง มันบูทอิมเมจติดตั้งไดเรกทอรีจากเซิร์ฟเวอร์ B และดำเนินการทดสอบ สคริปต์ทุบตีบนเซิร์ฟเวอร์ B จะเรียกใช้ minicom ด้วยสคริปต์ runcript พร้อมกับการดำเนินการร่วมกัน ฉันมีสคริปต์ทุบตีบนเซิร์ฟเวอร์ B ซึ่งใช้

ssh -t -t ServerA bashScript.sh

เพื่อให้การทดสอบเหล่านั้นทำงานตามเป้าหมาย ฉันอยู่บนเซิร์ฟเวอร์ C ฉันสามารถรับการทดสอบเหล่านั้นที่ดำเนินการโดย ssh'ing ไปยังเซิร์ฟเวอร์ B และดำเนินการสคริปต์ที่ ssh's ไปยังเซิร์ฟเวอร์ A ซึ่งรัน minicom ด้วย runcript ต๊าย วิธีตรวจสอบ:

เซิร์ฟเวอร์ A: Hudson ใช้กลไกการทาสเพื่อ ssh ไปยัง Server B

เซิร์ฟเวอร์ B: kickOffTests.shมีบรรทัดssh -t -t ServerA runTests.sh

เซิร์ฟเวอร์ A: runTests.shเรียกสคริปต์ perl ที่เรียกใช้minicom -S my.script ttyE1

เป้าหมายหลังจากบูท: ติดตั้งไดเรกทอรีจากเซิร์ฟเวอร์ B ซึ่งการทดสอบอยู่ที่และเข้าสู่ไดเรกทอรีนั้น มันยังเรียกอีกสคริปต์ทุบตีซึ่งเรียกใช้การทดสอบซึ่งเป็นคอมไพล์ executables C

ตอนนี้เมื่อฉันรันสคริปต์เหล่านี้ด้วยตัวเองพวกเขาก็ทำในสิ่งที่ควรทำ อย่างไรก็ตามเมื่อฮัดสันพยายามที่จะทำสิ่งเดียวกันในช่วงมินิคอมมันบ่นเกี่ยวกับบรรทัดใน "สคริปต์อื่นทุบตี" ที่เรียกใช้ C ปฏิบัติการ./executableด้วย./executable: cannot execute binary file

ฉันยังมีอะไรอีกมากมายให้เรียนรู้เกี่ยวกับ linux แต่ฉันคิดว่าปัญหานี้เกิดจากฮัดสันไม่ได้เชื่อมต่อกับคอนโซล ฉันไม่รู้ว่าฮัดสันทำอะไรเพื่อควบคุมทาสของมัน ฉันพยายามใช้บรรทัดexport TERM=consoleในการกำหนดค่าก่อนเรียกใช้ kickOffTests.sh แต่ปัญหายังคงอยู่

ใครสามารถอธิบายให้ฉันฟังว่าเกิดอะไรขึ้นและฉันจะแก้ไขได้อย่างไร ฉันไม่สามารถลบเซิร์ฟเวอร์ใด ๆ ออกจากสมการนี้ อาจเป็นไปได้ที่จะนำ minicom ออกจากสมการ แต่นั่นจะเพิ่มเวลาที่ไม่รู้จักในโครงการนี้ดังนั้นฉันจึงชอบโซลูชันที่ใช้สิ่งที่ฉันมีอยู่แล้ว

คำตอบ:


13

ข้อความcannot execute binary fileไม่เกี่ยวกับเทอร์มินัล (ฉันสงสัยว่าอะไรทำให้คุณคิดว่า - และฉันขอแนะนำให้หลีกเลี่ยงการตั้งสมมติฐานในคำถาม ในความเป็นจริงมันเป็นวิธีการทุบตีของการแสดง(แสดงมากกว่าปกติเป็นENOEXECexec format error

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณไม่ได้พยายามเรียกใช้ไฟล์ปฏิบัติการนี้ในฐานะสคริปต์ หากคุณเขียน. ./executableสิ่งนี้จะบอกว่าทุบตีเพื่อดำเนินการ./executableในสภาพแวดล้อมเดียวกันกับสคริปต์การโทร (ตรงข้ามกับกระบวนการที่แยกต่างหาก) ไม่สามารถทำได้หากไฟล์ไม่ใช่สคริปต์

มิฉะนั้นข้อความนี้หมายความว่าไม่ได้./executableอยู่ในรูปแบบที่เคอร์เนลรู้จัก ฉันไม่ได้คาดเดาอะไรแน่นอนว่าเกิดอะไรขึ้น หากคุณสามารถเรียกใช้สคริปต์บนเครื่องเดียวกันได้โดยการเรียกใช้งานในวิธีที่ต่างกันมันไม่เพียง แต่เป็นไฟล์ที่เสียหายหรือไฟล์สำหรับสถาปัตยกรรมที่ไม่ถูกต้อง (อาจเป็นไปได้ว่ามี แต่มันมีมากกว่านั้น) ฉันสงสัยว่าอาจมีความแตกต่างในวิธีที่รองเท้าบู๊ตเป้าหมายหรือไม่ (อาจเป็นสภาพการแข่งขัน)

นี่คือรายการข้อมูลเพิ่มเติมที่อาจช่วยได้:

  • ผลลัพธ์ของfile …/executableบนเซิร์ฟเวอร์ B.
  • ข้อมูลบางอย่างเกี่ยวกับเป้าหมายเช่นผลลัพธ์ของuname -aถ้ามันเหมือนยูนิกซ์
  • ตรวจสอบว่าเป้าหมายเห็นเนื้อหาไฟล์เดียวกันทุกครั้ง: เรียกใช้cksum ./executableหรือmd5sum ./executableวิธีการใด ๆ ที่คุณมีกับเป้าหมายก่อนที่จะมีการเรียกใช้สคริปต์./executableอื่นอีก ตรวจสอบว่าผลลัพธ์เหมือนกันในการภาวนาของฮัดสันในการร้องขอด้วยตนเองที่สำเร็จและบนเซิร์ฟเวอร์ B
  • เพิ่มset -xที่ด้านบนของสคริปต์สคริปต์อื่น (ด้านล่าง#!/bin/bashบรรทัด) สิ่งนี้จะสร้างร่องรอยของทุกสิ่งที่สคริปต์ทำ เปรียบเทียบการติดตามและรายงานความแตกต่างหรือสิ่งแปลก ๆ
  • อธิบายว่าเป้าหมายนั้นถูกบูทได้อย่างไรเมื่อคุณรันสคริปต์ด้วยตนเองและเกี่ยวข้องกับฮัดสัน อาจเป็นไปได้ว่าเป้าหมายนั้นถูกบู๊ตต่างกันและโมดูลที่โหลดได้บางส่วนที่ให้การสนับสนุนสำหรับรูปแบบที่./executableไม่ได้รับการโหลด (หรือยังไม่ได้โหลด) ในการร้องขอฮัดสัน คุณอาจต้องการใช้set -xในสคริปต์อื่น ๆ เพื่อช่วยคุณและตรวจสอบบันทึกการบูตจากเป้าหมาย

หากสคริปต์มี ". ./executable" ฉันจะไม่พบปัญหานี้ไม่ว่าสคริปต์จะถูกเรียกใช้อย่างไร เมื่อฉันเรียกใช้ "./kickOffTests.sh" มีสคริปต์หลายเลเยอร์ก่อน "./executable" ถูกเรียกใช้บนเป้าหมาย คุณพูดถูกว่าฉันไม่ควรตั้งสมมติฐานในคำถาม แต่เนื่องจากสิ่งเดียวที่แตกต่างกันก็คือวิธีที่สคริปต์แม่ถูกเรียกใช้โดยวิธีหนึ่งคือการใช้เทอร์มินัล ssh แบบเปิดและอีกวิธีหนึ่งคือฮัดสันโดยอัตโนมัติ ดูเหมือนว่าคำตอบนั้นแตกต่างกัน
jasper77

@ jasper77: ฉันรู้แล้วว่าข้อความแสดงข้อผิดพลาดไม่ได้หมายความว่าฉันคิดในตอนแรก (แม้ว่าปัญหาของคุณเกี่ยวกับเทอร์มินัล ดูคำตอบที่แก้ไขแล้วของฉันและพยายามให้ข้อมูลเพิ่มเติมที่แนะนำมากที่สุดเท่าที่จะทำได้
Gilles 'หยุดชั่วร้าย'

ฉันยอมรับว่าหน้าแดงเพื่อผลประโยชน์ของคนอื่น ๆ ที่สคริปต์ไม่ได้ทำสิ่งที่ฉันคิด Gilles ตอกมัน executables ที่ถูกสร้างขึ้นสำหรับเป้าหมายที่แตกต่างกัน ในบรรทัด "make -C" ของสคริปต์หนึ่งฉันทิ้งชื่อเป้าหมายไว้ดังนั้นเป้าหมายเริ่มต้นจึงถูกสร้างขึ้นแทนที่จะเป็นชื่อที่ฉันต้องการ เมื่อฉันแก้ไขแล้วฮัดสันก็สามารถขับรถแข่ง minicom ได้สำเร็จ เนื่องจากฉันพบปัญหาเกี่ยวกับแอปพลิเคชันคอนโซลที่รันจาก ssh และเรียนรู้เกี่ยวกับ 'export TERM = console' และ "ssh -t -t" ตลอดทางฉันจึงมั่นใจว่าปัญหาของฉันอยู่ที่นั่น ขอบคุณ Gilles!
jasper77

0

สิ่งนี้อาจเกิดขึ้นได้หากคุณไม่มีบรรทัด shebang ที่ด้านบนสุดของสคริปต์ ตรวจสอบให้แน่ใจว่าสคริปต์เริ่มต้นด้วย:

#!/bin/bash

สิ่งนี้จะปรากฏขึ้นสำหรับฉันเมื่อฉันรันสคริปต์ด้วย sudo -u <user>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.