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的输出。cksum ./executable
或md5sum ./executable
您在目标上使用的任何方法就在 Yet-another-bash-script invokes 之前./executable
。检查 Hudson 调用、成功的手动调用和服务器 B 中的结果是否相同。set -x
到还有一个 bash 脚本的顶部(就在该#!/bin/bash
行的下方)。这将生成脚本所做的一切的跟踪。比较跟踪并报告任何差异或奇怪之处。./executable
在 Hudson 调用中未加载(或尚未加载)。您可能希望set -x
在其他脚本中使用以帮助您,并检查来自目标的引导日志。