./executable: 无法执行二进制文件

jas*_*r77 12 bash executable shell-script

我有一个脚本,当我通过 ssh 连接到服务器以自己执行它时运行良好,但是当Hudson(一个持续集成服务器)运行它时会出现问题。

我正在对嵌入式 linux 系统(目标)进行自动化测试。目标通过串行连接到服务器 A (RHEL 5) 并通过 minicom 操作。服务器 B (FC 12) 构建实际在目标上运行的测试,并且可以通过 ssh 连接到服务器 A。服务器 C (RH) 托管 Hudson,服务器 B 作为从服务器。

我已经编写了一个 runscript (http://linux.die.net/man/1/runscript) 脚本来完成实际目标上所需的一切;它启动映像,从服务器 B 挂载一个目录并执行测试。服务器 B 上的 bash 脚本使用 runscript 脚本以及一些伴随操作调用 minicom。我在服务器 B 上有一个 bash 脚本,它使用

ssh -t -t ServerA bashScript.sh
Run Code Online (Sandbox Code Playgroud)

让这些测试在目标上运行。我在服务器 C 上,我可以通过 ssh 到服务器 B 并执行 ssh 到服务器 A 的脚本来运行这些测试,服务器 A 用 runscript 执行 minicom。哇。 回顾:

服务器 A:Hudson 使用其从属机制通过 ssh 连接到服务器 B。

服务器B:kickOffTests.sh有线路ssh -t -t ServerA runTests.sh

服务器 A:runTests.sh调用 perl 脚本来调用minicom -S my.script ttyE1

目标,启动后:从服务器 B 挂载一个目录,测试所在的目录,并进入该目录。它调用另一个 bash 脚本,该脚本运行测试,这些测试是已编译的 C 可执行文件。

现在,当我自己执行这些脚本中的任何一个时,它们都会做它们应该做的。然而,当哈德森试图做同样的事情,比它抱怨在“另一个bash脚本”调用的C可执行文件,行小型机会议./executable,与./executable: cannot execute binary file

我仍然有很多关于 linux 的知识要学习,但我推测这个问题是 Hudson 没有连接到控制台的结果。我不知道哈德森究竟做了什么来控制它的奴隶。我export TERM=console在运行 kickOffTests.sh 之前尝试在配置中使用该行,但问题仍然存在。

任何人都可以向我解释发生了什么以及我如何解决它?我无法从这个等式中删除任何服务器。有可能将 minicom 排除在等式之外,但这会给这个项目增加未知的时间,所以我更喜欢使用我已有的解决方案。

Gil*_*il' 14

该消息cannot execute binary file与终端无关(我想知道是什么让你这么想——我建议避免在问题中做出这样的假设,因为它们往往会把你的实际问题淹没在一堆红鲱鱼中)。事实上,它是 bash 的表达方式ENOEXEC(更常见的表达为exec format error.

首先,确保您没有意外尝试将此可执行文件作为脚本运行。如果你写了. ./executable,这会告诉 bash./executable在与调用脚本相同的环境中执行(而不是一个单独的进程)。如果文件不是脚本,则无法完成。

否则,此消息意味着它./executable不是内核识别的格式。我对正在发生的事情没有任何明确的猜测。如果您可以通过以不同方式调用脚本在同一台机器上运行该脚本,它就不能只是损坏的文件或用于错误架构的文件(可能是这样,但还有更多内容)。我想知道目标引导的方式是否会有所不同(可能是比赛条件)。

以下是可能有帮助的其他数据列表:

  • file …/executable服务器 B 上的输出。
  • 有关目标的一些信息,例如uname -a是否为类 unix的输出。
  • 检查目标是否每次都看到相同的文件内容: runcksum ./executablemd5sum ./executable您在目标上使用的任何方法就在 Yet-another-bash-script invokes 之前./executable。检查 Hudson 调用、成功的手动调用和服务器 B 中的结果是否相同。
  • 添加set -x到还有一个 bash 脚本的顶部(就在该#!/bin/bash行的下方)。这将生成脚本所做的一切的跟踪。比较跟踪并报告任何差异或奇怪之处。
  • 描述当您手动运行脚本以及涉及 Hudson 时目标是如何启动的。可能是目标的启动方式不同,并且某些支持格式的可加载模块./executable在 Hudson 调用中未加载(或尚未加载)。您可能希望set -x在其他脚本中使用以帮助您,并检查来自目标的引导日志。