./executable: बाइनरी फ़ाइल निष्पादित नहीं कर सकता


12

मेरे पास एक स्क्रिप्ट है जो अच्छी तरह से काम करती है जब मैं सर्वर पर इसे निष्पादित करने के लिए ssh करता हूं, लेकिन समस्या है जब हडसन , एक निरंतर एकीकरण सर्वर, इसे चलाता है।

मैं एक एम्बेडेड लिनक्स सिस्टम (लक्ष्य) पर परीक्षणों को स्वचालित कर रहा हूं। लक्ष्य धारावाहिक के माध्यम से सर्वर ए (आरएचईएल 5) से जुड़ा हुआ है और मिनिकॉम पर संचालित है। सर्वर बी (एफसी 12) उन परीक्षणों का निर्माण करता है जो वास्तव में लक्ष्य पर चलते हैं, और सर्वर ए। सर्वर सी (आरएच) के लिए ssh कर सकते हैं, सर्वर बी के साथ एक दास के रूप में होस्ट करता है।

मैंने वास्तविक लक्ष्य पर आवश्यक सब कुछ करने के लिए एक स्क्रिप्टस्क्रिप्ट (http://linux.die.net/man/1/runscript) स्क्रिप्ट लिखी है; यह छवि को बूट करता है, सर्वर बी से एक निर्देशिका को मापता है और परीक्षणों को निष्पादित करता है। सर्वर बी पर एक बैश स्क्रिप्ट कुछ साहचर्य क्रियाओं के साथ न्यूनतम स्क्रिप्ट के साथ मिनिकॉम को आमंत्रित करती है। मेरे पास सर्वर B पर एक bash स्क्रिप्ट है जो उपयोग करता है

ssh -t -t ServerA bashScript.sh

उन परीक्षणों को लक्ष्य पर चलाने के लिए। मैं सर्वर सी पर हूं, मैं उन परीक्षणों को सर्वर बी में ssh'ing द्वारा चला सकता हूं और स्क्रिप्ट ए को सर्वर ए पर निष्पादित कर सकता हूं जो कि रीकॉम के साथ मिनिकॉम को निष्पादित करता है। वाह। समीक्षा करने के लिए:

सर्वर A: हडसन अपने गुलाम तंत्र का उपयोग सर्वर B को ssh करने के लिए करता है।

सर्वर B: kickOffTests.shकी रेखा हैssh -t -t ServerA runTests.sh

सर्वर A: runTests.shएक पर्ल स्क्रिप्ट को कॉल करता है जो इनवोक करता हैminicom -S my.script ttyE1

बूट करने के बाद टारगेट करें: सर्वर B से एक डायरेक्टरी को Mounts करता है, जहां परीक्षण होते हैं, और उस डायरेक्टरी में प्रवेश करता है। यह अभी तक एक और बैश स्क्रिप्ट को आमंत्रित करता है, जो परीक्षण चलाता है, जो सी निष्पादन योग्य हैं।

अब, जब मैं इनमें से किसी भी स्क्रिप्ट को निष्पादित करता हूं, तो वे वही करते हैं जो उन्हें करना चाहिए। हालांकि, जब हडसन एक ही बात करने की कोशिश करता है, तो मिनिकॉम सत्र में यह "अभी तक एक और बैश स्क्रिप्ट" में एक पंक्ति के बारे में शिकायत करता है जो सी निष्पादन योग्य को आमंत्रित करता है ./executable, के साथ,./executable: cannot execute binary file

मुझे अभी भी linux के बारे में जानने के लिए बहुत कुछ है, लेकिन मुझे लगता है कि यह समस्या हडसन के सांत्वना से न जुड़ने का परिणाम है। मुझे नहीं पता कि हडसन अपने दास को नियंत्रित करने के लिए क्या करता है। मैंने export TERM=consoleकिकऑफ़टेस्ट.श को चलाने से ठीक पहले कॉन्फ़िगरेशन में लाइन का उपयोग करने की कोशिश की , लेकिन समस्या बनी हुई है।

क्या कोई मुझे समझा सकता है कि क्या हो रहा है और मैं इसे कैसे ठीक कर सकता हूं? मैं इस समीकरण से कोई भी सर्वर नहीं निकाल सकता। यह संभव हो सकता है कि मिनिकॉम को समीकरण से बाहर ले जाया जाए, लेकिन इससे इस परियोजना में एक अनजान राशि जुड़ जाएगी, इसलिए मैं एक ऐसे समाधान को पसंद करूंगा जो मेरे पास पहले से ही है।

जवाबों:


13

संदेश cannot execute binary fileका टर्मिनलों से कोई लेना-देना नहीं है (मुझे आश्चर्य है कि आपने ऐसा क्या सोचा है - और मैं एक प्रश्न में ऐसी धारणा बनाने से बचने की सलाह देता हूं, क्योंकि वे आपकी वास्तविक समस्या को लाल झुंडों में डुबो देते हैं)। वास्तव में, यह बाश करने का तरीका है ENOEXEC(अधिक सामान्यतः व्यक्त किया गया) exec format error

पहले, सुनिश्चित करें कि आपने गलती से इस निष्पादन योग्य को स्क्रिप्ट के रूप में चलाने की कोशिश नहीं की थी। यदि आपने लिखा है . ./executable, तो यह ./executableकॉलिंग स्क्रिप्ट (एक अलग प्रक्रिया के विपरीत) के रूप में एक ही वातावरण में निष्पादित करने के लिए बैश बताता है । यदि फाइल स्क्रिप्ट नहीं है तो ऐसा नहीं किया जा सकता है।

अन्यथा, इस संदेश का अर्थ है कि ./executableवह प्रारूप में नहीं है जिसे कर्नेल पहचानता है। मुझे कोई निश्चित अनुमान नहीं है कि हालांकि क्या हो रहा है। यदि आप उसी मशीन पर स्क्रिप्ट को एक अलग तरीके से लागू करके चला सकते हैं, तो यह केवल एक भ्रष्ट फ़ाइल या गलत आर्किटेक्चर के लिए एक फ़ाइल नहीं हो सकती है (यह ऐसा हो सकता है, लेकिन इसके लिए और भी बहुत कुछ है)। मुझे आश्चर्य है कि अगर लक्ष्य के जूते (शायद एक दौड़ की स्थिति) के तरीके में अंतर हो सकता है।

यहां अतिरिक्त डेटा की एक सूची दी गई है जो मदद कर सकती है:

  • file …/executableसर्वर बी पर आउटपुट ।
  • लक्ष्य के बारे में कुछ जानकारी, जैसे कि uname -aयदि यह यूनिक्स जैसा है , तो इसका आउटपुट ।
  • जांचें कि लक्ष्य हर बार एक ही फ़ाइल सामग्री को देखता है: रन cksum ./executableया md5sum ./executableया आपके पास लक्ष्य पर अभी तक जो भी विधि है, वह दूसरे-बश-स्क्रिप्ट-इनवोक से पहले है ./executable। जाँचें कि परिणाम हडसन आह्वान में समान हैं, आपके सफल मैनुअल आह्वान और सर्वर बी पर।
  • set -xअभी तक एक और बैश-स्क्रिप्ट ( #!/bin/bashलाइन के नीचे ) के शीर्ष पर जोड़ें । यह सब कुछ स्क्रिप्ट का एक निशान का उत्पादन करेगा। निशान की तुलना करें और किसी भी अंतर या विषमता की रिपोर्ट करें।
  • वर्णन करें कि जब आप स्क्रिप्ट को मैन्युअल रूप से चलाते हैं और हडसन शामिल होता है तो लक्ष्य कैसे बूट हो रहा है। यह हो सकता है कि लक्ष्य को अलग तरह से बूट किया गया हो और कुछ लोड करने योग्य मॉड्यूल ./executableहडसन इनवोकेशन में लोड नहीं होने (या अभी तक लोड नहीं हुआ है) के प्रारूप के लिए समर्थन प्रदान करता है। आप set -xअन्य लिपियों का उपयोग करना चाहते हैं ताकि आप वहां मदद कर सकें, और लक्ष्य से बूट लॉग का निरीक्षण कर सकें।

यदि स्क्रिप्ट में "" ./executable "है, तो क्या मैं इस समस्या का सामना नहीं कर पाऊंगा कि स्क्रिप्ट कैसे लागू होती है? जब मैं "./kickOffTests.sh" आह्वान करता हूं, तो लक्ष्य से पहले "//executable "की कई परतें नीचे लिखी जाती हैं। आप सही हैं कि मैं प्रश्न में धारणाएँ नहीं बनाऊँगा, लेकिन केवल एक चीज अलग है कि मूल लिपि को कैसे लागू किया जाए, जहाँ एक रास्ता खुले ssh टर्मिनल में है और दूसरा स्वचालित रूप से हडसन द्वारा है, यह लगता है कि उत्तर में अंतर है।
jasper77

@ jasper77: मुझे पता है कि त्रुटि संदेश का मतलब यह नहीं है कि मैंने शुरू में क्या सोचा था (हालांकि यदि आपका मुद्दा टर्मिनलों से संबंधित है, तो कनेक्शन बहुत अप्रत्यक्ष है)। मेरा संशोधित उत्तर देखें, और सुझाए गए अतिरिक्त डेटा को जितना संभव हो उतना प्रदान करने का प्रयास करें।
गाइल्स का SO- दुष्ट होना बंद हो '

मैं दूसरों के लाभ के लिए लाल का सामना करना पड़ता है कि स्क्रिप्ट बिल्कुल वैसा नहीं कर रहे थे जैसा मैंने सोचा था। गिल्स ने उसे नंगा किया; निष्पादनों को एक अलग लक्ष्य के लिए बनाया गया था। एक स्क्रिप्ट की "मेक-सी" लाइन में, मैंने एक लक्ष्य नाम छोड़ दिया था, इसलिए डिफ़ॉल्ट लक्ष्य का निर्माण मेरे इच्छित उद्देश्य के बजाय किया गया था। एक बार जब मैंने तय कर लिया कि, हडसन मिनिकॉम सेसन को सफलतापूर्वक चलाने में सक्षम है। चूँकि मैं ssh से चलने वाले कंसोल एप्लिकेशन से संबंधित समस्याओं में चल रहा था, और रास्ते में 'TERM = कंसोल' और "ssh -t -t" के बारे में सीखा, मुझे विश्वास था कि मेरी समस्याएँ हैं। धन्यवाद गिल्स!
jasper77

0

ऐसा तब हो सकता है जब आप अपनी स्क्रिप्ट के शीर्ष पर शेबंग लाइन को याद कर रहे हों। सुनिश्चित करें कि स्क्रिप्ट के साथ शुरू होता है:

#!/bin/bash

यह केवल मेरे लिए दिखाया गया जब मैंने स्क्रिप्ट को चलाया sudo -u <user>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.