SSH를 통해 서버에 연결하고 직접 실행할 때 제대로 실행되는 스크립트가 있지만 다음과 같은 경우 문제가 발생합니다.허드슨 강지속적인 통합 서버인 가 이를 실행합니다.
임베디드 Linux 시스템(대상)에서 자동화 테스트를 수행하고 있습니다. 대상은 직렬을 통해 서버 A(RHEL 5)에 연결되고 minicom을 통해 작동합니다. 서버 B(FC 12)는 대상에서 실제로 실행되는 테스트를 빌드하고 서버 A에 SSH로 연결할 수 있습니다. 서버 C(RH)는 서버 B를 슬레이브로 사용하여 Hudson을 호스팅합니다.
나는 실제 목표에 필요한 모든 작업을 수행하는 runscript(http://linux.die.net/man/1/runscript)를 작성했습니다. 이는 이미지를 부팅하고 서버 B에서 디렉터리를 마운트하고 테스트를 실행합니다. 서버 B의 bash 스크립트는 몇 가지 수반되는 작업과 함께 runscript 스크립트를 사용하여 minicom을 호출합니다. 서버 B에 다음을 사용하는 bash 스크립트가 있습니다.
ssh -t -t ServerA bashScript.sh
이러한 테스트를 대상에서 실행해 보세요. 저는 서버 C에 있고 서버 B에 ssh로 연결하고 runscript를 사용하여 minicom을 실행하는 서버 A로 ssh의 스크립트를 실행하여 이러한 테스트를 실행할 수 있습니다.부르다. 검토:
서버 A: 슬레이브 메커니즘을 사용하여 서버 B에 대한 Hudson SSH입니다.
서버 B: kickOffTests.sh
줄이 있어요ssh -t -t ServerA runTests.sh
서버 A: runTests.sh
다음을 호출하는 Perl 스크립트를 호출합니다.minicom -S my.script ttyE1
시작 후 목표: 테스트가 있는 서버 B에서 디렉터리를 마운트하고 해당 디렉터리로 들어갑니다. 컴파일된 C 실행 파일인 테스트를 실행하기 위해 또 다른 bash 스크립트를 호출합니다.
지금, 언제나나는 이러한 스크립트 중 하나를 직접 실행하고 그들은 해야 할 일을 수행합니다. 그러나 Hudson이 minicom 세션에서 동일한 작업을 시도하면 C 실행 파일을 호출하는 줄이 포함된 "아직 또 다른 bash 스크립트"에 대해 불평합니다 ./executable
../executable: cannot execute binary file
아직 리눅스에 대해 배울 것이 많지만 허드슨이 콘솔에 연결되지 않아서 문제가 발생했다고 추측하고 있습니다. 나는 허드슨이 노예들을 통제하기 위해 정확히 무엇을 했는지 모릅니다. export TERM=console
kickOffTests.sh를 실행하기 전에 구성에서 해당 라인을 사용해 보았지만 문제가 지속됩니다.
무슨 일이 일어나고 있고 어떻게 해결할 수 있는지 설명해 줄 수 있는 사람이 있나요? 이 방정식에서 어떤 서버도 제거할 수 없습니다. minicom을 제외하는 것이 가능할 수도 있지만 그렇게 하면 이 프로젝트에 알 수 없는 시간이 추가되므로 이미 가지고 있는 솔루션을 사용하는 것을 선호합니다.
답변1
메시지는 cannot execute binary file
터미널과 아무 관련이 없습니다. (무엇이 그렇게 생각하게 만드는지 궁금합니다. 실제 문제를 붉은 청어 더미에 빠뜨리는 경향이 있으므로 질문에서 그러한 가정을 하지 않는 것이 좋습니다.) 실제로 이는 bash 표현식입니다 ENOEXEC
(더 일반적으로 exec format error
.
먼저, 실수로 이 실행 파일을 스크립트로 실행하려고 시도하지 않는지 확인하세요. 작성했다면 bash는 호출 스크립트와 동일한 환경에서 . ./executable
(별도의 프로세스가 아닌) 실행하도록 지시합니다. ./executable
파일이 스크립트가 아니면 이 작업을 완료할 수 없습니다.
그렇지 않으면 이 메시지는 ./executable
커널이 형식을 인식하지 못한다는 의미입니다. 하지만 무슨 일이 일어나고 있는지에 대해 확실한 추측은 없습니다. 다른 방식으로 호출하여 동일한 시스템에서 스크립트를 실행할 수 있다면 이는 단순히 손상된 파일이나 잘못된 아키텍처를 가진 파일이 아닙니다(그럴 수도 있지만 그보다 더 많은 것이 있습니다). 대상이 시작되는 방식(아마도 경쟁 조건)에 차이가 있는지 궁금합니다.
다음은 도움이 될 수 있는 추가 데이터 목록입니다.
file …/executable
서버 B에 출력됩니다.uname -a
유닉스 계열인지 여부에 대한 출력 과 같은 대상에 대한 일부 정보입니다 .- Yet-another-bash-script 를 호출하기 전에 대상에서 실행하거나 대상에 있는 모든 메소드를 실행할 때
cksum ./executable
마다 대상이 동일한 파일 내용을 보는지 확인하십시오 . Hudson 호출, 성공적인 수동 호출 및 서버 B의 결과가 동일한지 확인합니다.md5sum ./executable
./executable
set -x
다른 bash 스크립트 상단(이 줄 바로 아래 ) 에 추가합니다#!/bin/bash
. 그러면 스크립트가 수행하는 모든 작업에 대한 추적이 생성됩니다. 추적을 비교하고 차이점이나 예외 사항을 보고합니다.- 스크립트를 수동으로 실행할 때 대상이 시작되는 방법을 설명하고 Hudson을 포함합니다. 대상이 다르게 시작되고 형식 지원을 제공하는 일부 로드 가능한 모듈이
./executable
Hudson 호출에서 로드되지 않거나 로드되지 않았을 수 있습니다 .set -x
도움이 되는 다른 스크립트를 사용하고 대상의 시작 로그를 확인할 수도 있습니다 .
답변2
스크립트 상단에 shebang 줄이 누락된 경우 이런 일이 발생할 수 있습니다. 스크립트가 다음으로 시작하는지 확인하세요.
#!/bin/bash
이것은 스크립트를 실행할 때만 나타납니다.sudo -u <user>