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

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

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スクリプトを呼び出します。

今、いつ私はこれらのスクリプトの1つを直接実行し、彼らは何をすべきかをします。しかし、Hudsonがminicomセッションで同じことを試みると、C実行可能ファイルを呼び出す行を含む「もう1つのbashスクリプト」について文句を言います./executable./executable: cannot execute binary file

私はまだLinuxについて学ぶことがたくさんありますが、ハドソンがコンソールに接続していないため、問題が発生したと推測しています。私はハドソンが奴隷を制御するために正確に何をしたのかわかりません。export TERM=consolekickOffTests.shを実行する前に、設定でその行を試してみましたが、問題は解決しません。

何が起こっていて、どのように解決できるかを説明できる人はいますか?この式からどのサーバーも削除できません。 minicomを除外することは可能かもしれませんが、そうすることでこのプロジェクトに未知の時間が追加されるため、すでに持っているソリューションを使用することをお勧めします。

答え1

メッセージはcannot execute binary file端末とは何の関係もありません。 (何がそう思うのか疑問に思います。実際の問題を赤いニシンの山に陥る傾向があるので、質問でそのような仮定をしないことをお勧めします。)実際にはbash式ですENOEXEC(もっと一般的にexec format error

まず、誤ってこの実行可能ファイルをスクリプトとして実行しようとしないことを確認してください。作成した場合、bashは呼び出しスクリプトと同じ環境で. ./executable(別のプロセスではなく)実行するように指示します。./executableファイルがスクリプトでないと、この操作を完了できません。

それ以外の場合、このメッセージはカーネルが./executableフォーマットを認識しないことを意味します。しかし、何が起こっているのかについては確かな推測はありません。別の方法で呼び出して同じシステムでスクリプトを実行できる場合、これは単に破損したファイルや無効なアーキテクチャを持つファイルではありません(そうであるかもしれませんが、それよりも多くあります)。ターゲットの開始方法(おそらく競争条件)に違いがあるかどうか疑問に思います。

以下は、役立つ可能性がある追加データのリストです。

  • file …/executableサーバBに出力されます。
  • uname -aUnixファミリーかどうかの出力など、ターゲットに関する情報です。
  • Yet-another-bash-scriptを呼び出す前に、ターゲットで実行するか、ターゲット内のすべてのメソッドを実行するたびに、ターゲットが同じファイルのcksum ./executable内容を見ることを確認してください。 Hudson呼び出し、成功した手動呼び出し、およびサーバーBの結果が同じであることを確認してください。md5sum ./executable./executable
  • set -x別のbashスクリプトの上部(この行の直下)に追加します#!/bin/bash。これにより、スクリプトが実行するすべての操作のトレースが生成されます。トレースを比較し、違いや例外を報告します。
  • スクリプトを手動で実行するときにターゲットの起動方法を説明し、Hudsonを含めます。ターゲットが異なるように起動され、フォーマットサポートを提供する一部のロード可能モジュールが、./executableHudson呼び出しでロードされていないか、ロードされていない可能性があります。set -x他の役に立つスクリプトを使用してターゲットの起動ログを確認することもできます。

答え2

スクリプトの上部にshebang行がない場合、これが発生する可能性があります。スクリプトが次から始まることを確認してください。

#!/bin/bash

これはスクリプトを実行した場合にのみ表示されます。sudo -u <user>

関連情報