./ executable : 이진 파일을 실행할 수 없습니다


12

서버에 직접 실행하여 서버를 실행할 때 잘 작동하는 스크립트가 있지만 지속적인 통합 서버 인 Hudson 이 스크립트를 실행할 때 문제 가 있습니다.

임베디드 리눅스 시스템 (대상)에서 테스트를 자동화하고 있습니다. 대상은 직렬을 통해 서버 A (RHEL 5)에 연결되며 미니 컴을 통해 작동합니다. 서버 B (FC 12)는 실제로 대상에서 실행되는 테스트를 빌드하고 서버 A에 ssh 할 수 있습니다. 서버 C (RH)는 Hudson을 호스트하고 서버 B는 슬레이브로 사용합니다.

실제 대상에 필요한 모든 것을 수행하기 위해 runscript (http://linux.die.net/man/1/runscript) 스크립트를 작성했습니다. 이미지를 부팅하고 서버 B에서 디렉토리를 마운트하고 테스트를 실행합니다. 서버 B의 bash 스크립트는 실행 스크립트와 함께 일부 수행 조치와 함께 minicom을 호출합니다. 서버 B에 bash 스크립트가 있습니다.

ssh -t -t ServerA bashScript.sh

해당 테스트를 대상에서 실행하십시오. 나는 서버 C에 있으며 서버 B에 ssh'ing하고 runscript로 미니 컴을 실행하는 서버 A에 ssh의 스크립트를 실행하여 해당 테스트를 실행할 수 있습니다. 아휴. 검토:

서버 A : Hudson은 슬레이브 메커니즘을 사용하여 서버 B에 ssh합니다.

서버 B : kickOffTests.sh라인ssh -t -t ServerA runTests.sh

서버 A : runTests.sh호출하는 펄 스크립트를 호출minicom -S my.script ttyE1

부팅 후 대상 : 테스트가 수행되는 서버 B에서 디렉토리를 마운트하고 해당 디렉토리로 들어갑니다. 테스트를 실행하는 또 다른 bash 스크립트를 호출하며 컴파일 된 C 실행 파일입니다.

지금 때 나는 이 스크립트의 나 자신을 실행, 그들은 그들이해야 할. 그러나, 허드슨은의 C 실행 파일을 호출하는 "또 다른 bash는 스크립트"에서 선에 대한 불만 사항을 제기 전무 세션에서 이상 같은 일을 시도 ./executable와 함께,./executable: cannot execute binary file

나는 아직도 리눅스에 대해 배울 것이 많지만 허드슨이 콘솔에 연결하지 않은 결과라고 생각한다. 허드슨이 노예를 통제하기 위해 무엇을하는지 정확히 모르겠습니다. export TERM=consolekickOffTests.sh를 실행하기 직전에 구성 에서 라인 을 사용해 보았지만 문제는 남아 있습니다.

누구나 무슨 일이 일어나고 있고 어떻게 해결할 수 있는지 설명해 줄 수 있습니까? 이 방정식에서 서버를 제거 할 수 없습니다. 미니 컴을 방정식에서 빼는 것이 가능할 수도 있지만,이 프로젝트에 알려지지 않은 시간이 추가 될 것이므로 이미 가지고있는 것을 사용하는 솔루션을 선호합니다.

답변:


13

이 메시지 cannot execute binary file는 터미널과 아무 관련이 없습니다 (무슨 생각이 들었는지 궁금합니다. 실제 청각 문제가 붉은 청어를 어지럽히는 경향이 있으므로 질문에 그러한 가정을 피하는 것이 좋습니다). 실제로, 그것은 bash의 표현 방식입니다 ENOEXEC(보다 일반적으로로 표현됨) exec format error.

먼저, 실수로이 실행 파일을 스크립트로 실행하지 않았는지 확인하십시오. 을 작성한 경우 . ./executablebash ./executable는 별도의 프로세스가 아닌 호출 스크립트와 동일한 환경에서 bash가 실행되도록 지시 합니다. 파일이 스크립트가 아닌 경우에는 수행 할 수 없습니다.

그렇지 않으면이 메시지 ./executable는 커널이 인식하는 형식이 아님을 의미합니다 . 그래도 무슨 일이 일어나고 있는지에 대한 확실한 추측은 없습니다. 다른 머신에서 다른 방식으로 스크립트를 호출하여 동일한 머신에서 스크립트를 실행할 수 있다면, 파일이 손상되거나 잘못된 아키텍처에 대한 파일 일 수는 없습니다. 대상이 부팅되는 방식에 차이가 있는지 궁금합니다 (아마도 경쟁 조건).

다음은 도움이 될 수있는 추가 데이터 목록입니다.

  • file …/executable서버 B의 출력
  • uname -a유닉스와 같은 경우 의 출력과 같은 대상에 대한 일부 정보 .
  • 대상이 동일한 파일 내용을 각 시간을 볼 수 있는지 확인 : 실행 cksum ./executable하거나 md5sum ./executable또는 어떤 방법 대상 직전 아직 다른-bash는 스크립트의 호출로 있습니다 ./executable. Hudson 호출, 성공적인 수동 호출 및 서버 B에서 결과가 동일한 지 확인하십시오.
  • set -x아직 또 다른 bash 스크립트 상단에 추가하십시오 ( #!/bin/bash줄 바로 아래 ). 스크립트가 수행하는 모든 작업을 추적합니다. 추적을 비교하고 차이 또는 이상한 점을보고하십시오.
  • 스크립트를 수동으로 실행할 때와 Hudson이 관련된 경우 대상이 어떻게 부팅되는지 설명하십시오. 대상이 다르게 부팅 ./executable되고 Hudson 호출에서 형식을 지원하는 일부로드 가능한 모듈이 로드되지 않거나 아직로드되지 않았을 수 있습니다. set -x다른 스크립트에서 사용 하면 도움이되고 대상에서 부팅 로그를 검사 할 수 있습니다.

스크립트에 ". ./ executable"이 포함되어 있으면 스크립트 호출 방식에 관계없이이 문제가 발생하지 않습니까? "./kickOffTests.sh"를 호출하면 대상에서 "./ executable"이 호출되기 전에 여러 계층의 스크립트가 다운됩니다. 내가 질문에 대한 가정을해서는 안된다는 것이 맞지 만, 다른 유일한 것은 부모 스크립트가 어떻게 호출되는지에 달려 있기 때문에 한 가지 방법은 개방형 ssh 터미널에서 수동으로 다른 하나는 자동으로 Hudson에 의해 수행됩니다. 그 대답은 그 차이에있는 것 같습니다.
jasper77

@ jasper77 : 이제 오류 메시지가 처음에 생각한 것을 의미하지는 않는다는 것을 알고 있습니다 (문제는 터미널과 관련이 있지만 연결은 매우 간접적입니다). 내 수정 된 답변을 참조하고 가능한 한 제안 된 추가 데이터를 최대한 많이 제공하십시오.
Gilles 'SO- 악마 그만

나는 대본이 내가 생각한 것을 정확하게 하지 않았다는 다른 사람들의 이익을 위해 빨간 얼굴을 인정 합니다. 질은 그것을 못 박았다; 실행 파일은 다른 대상을 위해 작성되었습니다. 한 스크립트의 "make -C"행에서 대상 이름을 생략 했으므로 기본 대상이 내가 의도 한 대상 대신 작성되었습니다. 내가 고치면 허드슨은 미니 콤 sesson을 성공적으로 운전할 수 있습니다. ssh에서 실행되는 콘솔 응용 프로그램과 관련된 문제가 발생하여 'export TERM = console'및 "ssh -t -t"에 대해 배웠으므로 문제가 있음을 확신했습니다. 고마워 질스!
jasper77

0

스크립트 상단에 shebang 줄이 없으면 이런 일이 발생할 수 있습니다. 스크립트가 다음으로 시작하는지 확인하십시오.

#!/bin/bash

이것은 스크립트를 실행할 때만 나타났습니다. sudo -u <user>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.