./executable:バイナリファイルを実行できません


12

私は自分でそれを実行するためにサーバーにsshするときにうまく機能するスクリプトを持っていますが、継続的統合サーバーであるHudsonがそれを実行するときに問題があります。

組み込み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にsshします。

サーバーB: kickOffTests.sh回線ありssh -t -t ServerA runTests.sh

サーバーA: runTests.sh呼び出すperlスクリプトを呼び出しますminicom -S my.script ttyE1

起動後のターゲット:テストがあるサーバーBからディレクトリをマウントし、そのディレクトリに入ります。コンパイルされたC実行可能ファイルであるテストを実行する、さらに別のbashスクリプトを呼び出します。

とき今、私はこれらのスクリプトのいずれかの自分自身を実行し、彼らは、彼らが必要何。しかし、ハドソンは、それは、Cの実行ファイルを起動します「さらに別のbashスクリプト」内の行文句minicomのセッションでオーバー、同じことをしようとする./executableと、./executable: cannot execute binary file

Linuxについて学ぶべきことはまだたくさんありますが、この問題はHudsonがコンソールに接続していないことが原因だと推測しています。Hudsonがそのスレーブを制御するために何をするのか、正確にはわかりません。export TERM=consolekickOffTests.shを実行する直前に構成内の行を使用しようとしましたが、問題は残ります。

誰が私に何が起こっているのか、どうすればそれを修正できるのかを説明できますか?この方程式からサーバーを削除することはできません。方程式からミニコムを取り出すことは可能かもしれませんが、それはこのプロジェクトに未知の時間を追加しますので、私はすでに持っているものを使用するソリューションを大いに望みます。

回答:


13

このメッセージcannot execute binary fileは端末とは何の関係もありません(どうしてあなたはそれを考えたのでしょうか?そして、質問でそのような仮定をすることを避けることをお勧めします。実際、それはbashの表現方法ですENOEXEC(より一般的にはとして表現されexec format errorます。

最初に、誤ってこの実行可能ファイルをスクリプトとして実行しようとしていないことを確認してください。あなたが書いた場合. ./executable、これはbashに実行するように伝えます./executable呼び出しスクリプトと同じ環境でにます(別個のプロセスとは対照的に)。ファイルがスクリプトでない場合、これは実行できません。

それ以外の場合、このメッセージは./executable、カーネルが認識する形式ではないことを意味します。しかし、何が起こっているのかについて明確な推測はありません。別の方法で呼び出すことにより、同じマシン上でスクリプトを実行できる場合、それは単に破損したファイルまたは間違ったアーキテクチャのファイルではありません(それかもしれませんが、それだけではありません)。ターゲットの起動方法(おそらく競合状態)に違いがあるのではないかと思います。

役立つ可能性のある追加データのリストを次に示します。

  • file …/executableサーバーBの出力。
  • uname -aunixライクの場合の出力など、ターゲットに関するいくつかの情報。
  • ターゲットが同じファイルの内容を毎回見ることを確認してください:run cksum ./executablemd5sum ./executableまたはyet-another-bash-scriptが呼び出される直前にターゲット上で持っているメソッド./executable。Hudson呼び出し、成功した手動呼び出し、およびサーバーBで結果が同じであることを確認します。
  • set -xyet-another-bash-scriptの先頭(#!/bin/bash行のすぐ下)に追加します。これにより、スクリプトが実行するすべてのトレースが生成されます。トレースを比較し、違いや奇妙な点を報告します。
  • スクリプトを手動で実行するときと、Hudsonが関与するときのターゲットの起動方法を説明します。ターゲットの起動方法が異なり./executable、Hudsonの呼び出しで、形式のサポートを提供する一部のロード可能モジュールがロードされない(またはまだロードされていない)可能性があります。set -xそこで役立つ他のスクリプトで使用し、ターゲットからのブートログを検査することができます。

スクリプトに「。./executable」が含まれている場合、スクリプトの起動方法に関係なく、この問題は発生しませんか?「./kickOffTests.sh」を呼び出すと、ターゲット上で「./executable」が呼び出される前に、いくつかのスクリプト層があります。私は質問で前提を立てるべきではないことは正しいですが、異なるのは親スクリプトの呼び出し方法だけであるため、一方は開いているsshターミナルで、もう一方はハドソンによって自動的に行われます。答えはその違いにあるようです。
jasper77

@ jasper77:現在、エラーメッセージは当初考えていたものとはまったく異なります(ただし、問題が端末に関連している場合、接続は非常に間接的です)。私の修正された答えを見て、できるだけ多くの提案された追加データを提供するようにしてください。
ジル「SO-悪であるのをやめる」

私は、スクリプトが私が思っていたとおりに動作していないことを他人の利益のために直面​​していることを認めます。ジルはそれを打ちました。実行可能ファイルは別のターゲット用にビルドされていました。1つのスクリプトの「make -C」行では、ターゲット名を省略していたため、デフォルトのターゲットが意図したものの代わりにビルドされました。これを修正すると、Hudsonはminicom sessonを正常に駆動できます。sshから実行されるコンソールアプリケーションに関連する問題に遭遇し、途中で 'export TERM = console'および "ssh -t -t"について学習していたので、問題があると確信しました。ありがとう、ジル!
jasper77

0

これは、スクリプトの先頭にあるシェバン行が欠落している場合に発生する可能性があります。スクリプトが次で始まることを確認してください。

#!/bin/bash

これは、スクリプトを実行したときにのみ表示されました sudo -u <user>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.