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


12

我有一个脚本,当我通过SSH服务器自己执行该脚本时效果很好,但是在持续集成服务器Hudson运行该脚本时遇到了问题。

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

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

ssh -t -t ServerA bashScript.sh

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

服务器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排除在等式之外,但这会给该项目增加未知的时间,因此我更希望使用现有的解决方案。

Answers:


13

该消息cannot execute binary file与终端无关(我想知道是什么导致了您的想法,并且我建议避免在一个问题中做出这样的假设,因为这些假设往往会使您的实际问题陷入一团糟。)实际上,它是bash的表达方式ENOEXEC(通常表示为)exec format error

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

否则,此消息表示./executable内核格式不正确。我对发生的事情没有确切的猜测。如果您可以通过不同的方式在同一台计算机上运行脚本,则该脚本不仅可以是损坏的文件,也可以是结构错误的文件(也许是这样,但是还有更多)。我想知道目标的启动方式(也许是比赛条件)是否会有所不同。

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

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

如果脚本包含“ ../executable”,那么无论脚本如何调用,我都不会遇到此问题?当我调用“ ./kickOffTests.sh”时,在目标上调用“ ./executable”之前有几层脚本。没错,我不应该在这个问题上做假设,但是由于唯一不同的是父脚本的调用方式,一种方式是在开放的ssh终端中手动进行,另一种方式是由Hudson自动进行,因此答案似乎就在于差异。
jasper77

@ jasper77:我现在意识到错误消息并不完全代表我最初的想法(尽管如果您的问题与终端有关,则连接是非常间接的)。请参阅我的修改后答案,并尝试提供尽可能多的建议附加数据。
吉尔(Gilles)“所以,别再邪恶了”,2010年

我承认,为了他人的利益,红脸脚本并没有完全按照我的想法做。吉尔斯钉牢了它。可执行文件是为其他目标构建的。在一个脚本的“ make -C”行中,我省略了目标名称,因此构建了默认目标,而不是我想要的目标。一旦我解决了这个问题,哈德森就能成功驾驶minicom sesson。由于我一直遇到与从ssh运行的控制台应用程序有关的问题,并且一路了解'export TERM = console'和“ ssh -t -t”,所以我确信我的问题就在那里。谢谢吉尔!
jasper77

0

如果您缺少脚本顶部的shebang行,则可能会发生这种情况。确保脚本以以下内容开头:

#!/bin/bash

这只有在我运行脚本时才出现 sudo -u <user>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.