【发布时间】:2015-05-29 08:16:17
【问题描述】:
我们正在使用自制的构建服务器(基于 Ubuntu 12.04)来构建嵌入式 linux 项目。通过 ssh 登录并执行构建脚本来执行必要的构建内容,我们已经成功地使用该服务器一段时间了。
我们希望使用 jenkins 自动化构建。我们实际上认为这应该很容易,因为 jenkins 作业只需调用构建脚本来完成这项工作。
但是,它会在构建脚本中的某个 while 循环中失败并永远挂起。 while 循环看起来像这样(它用于接受来自 make config 的默认建议)
文件:create.sh
#!/bin/sh
[... other stuff]
echo Configure project sources ...
(while true ; do echo ; done
) | make config_config >> $WORKDIR/project.log 2>&1
echo Debug output to see that this line is reached ...
[... other stuff]
create.sh 是从其他脚本(build.sh)调用的,而该脚本又是从其他脚本(如 simple-build.sh)调用的。这是因为 create.sh 使用了一些由 build.sh 为特定构建环境设置的环境变量,而 simple-build.sh 调用 build.sh 脚本为构建服务器设置环境。因此,构建者可以简单地登录并调用“simple-build.sh”,一切都完成了,无需任何进一步的设置。
如果脚本是从 jenkins 调用的,控制台输出如下:
jenkins 控制台输出
[... other stuff]
Configure project sources ...
然后...它永远挂起并且直到在jenkins中手动中止该过程才完成。如果删除了 while 循环,例如换成一定量的睡眠和回声进入return,就可以了。但是,最好不要更改构建脚本(在脚本中多次使用相同的 while 循环方法..)
知道为什么这个while循环会造成麻烦吗?甚至是while循环还是我们在这里错过了其他东西?
【问题讨论】:
-
它是否适用于
yes ''|? -
是的,
yes有效:D(yes '' | make config_config) >> $WORKDIR/project.log 2>&1确实有效。感谢那。但是,为什么 while 不起作用? -
我不知道,但我猜
while很难被杀死。yes是为此任务编写的,因此它可能只是表现得更好(在其 STDOUT 关闭时退出?)。但如果我是你,我会研究一种没有任何一种的方法,例如为make config_config设置一个变量以非交互方式运行。 -
你正在运行无限的while循环,这真的是你想要的吗?
-
老实说,当我在这段(遗留)代码中偶然发现这个无限循环时,我也想知道它。但是,我认为 while 循环和 yes 都会在它从第二个命令 (make) 接收到“损坏的管道”时立即终止,这将在 make 按预期终止时发生。
标签: linux bash shell ubuntu jenkins