繁体   English   中英

Jenkins运行的Shell脚本创建了非终止过程

[英]Shell script run by Jenkins creates non-terminating process

我正在尝试使用Jenkins创建一个特殊的git存储库。 我创建了一个仅执行shell脚本的自由风格项目。 当我在没有詹金斯的情况下手动执行此脚本时,它就可以正常工作。 但是,它与詹金斯的行为大相径庭。

# this will remove all subtrees
git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then rm -rf {}; fi'

rm -rf .git

如果这部分是由詹金斯执行的,则在控制台输出中,我会看到这种错误:

rm: cannot remove '.git/objects/pack/pack-022eb85d38a41e66ad3f43a5f28809a5a3ee4a0f.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-05630eb059838f149ad30483bd48d37f9a629c70.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-26f510b5a2d15ba9372cf0a89628d743811e3bb2.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-33d276d82226c201eedd419e5fd24b6b906d4c03.pack': Device or resource busy

我这样修改了脚本的这一部分:

while true
do
    if rm -rf .git ; then
        break
    else
        continue
    fi
done

但这无济于事。 在任务管理器中,我看到一个git进程并没有终止。 我通过大量的谷歌搜索联想了所说的脚本,但我不太了解发生了什么。

Jenkins在IIS之后的Windows Server 2012上运行; Shell脚本由git随Windows一起提供的bash执行。

1 /确保您的路径正确,并且在jenkins作业启动过程中没有出现引号/双引号转义。

2 /您的命令行有点方便,无法正确,安全地进行评估。 将您的命令放在常规脚本中,以#!/bin/bash开头,而不是通过命令行。

xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then rm -rf {}; fi'

成为

xargs -I {} /path/myscript.sh {}

#!/bin/bash

rev-parse="$(git rev-parse --show-toplevel)"
wait

if [ -d ${rev-parse}/${1} ] ; then 
   rm -rf ${1}
fi

请注意,您的脚本确实是不安全的,因为您对rm -rf一个参数进行了评估,甚至在…之前都不对其进行评估!

3 /您可以在gitrm之间添加一个wait ,以等待git进程结束

4 /将您的git命令记录到日志文件中,并带有重定向>> /tmp/git-jenkins-log

5 /将所有这些命令放在脚本中(请参阅#2)

以下是在rm -rf失败的情况下的无限循环

while true
do
    if rm -rf .git ; then
        break
    else
        continue
    fi
done

实际上,可以在forwhile循环中使用continue获取下一个条目,但是在此while循环中,它将永远运行相同的rm命令。

好吧,另外,我能够通过从其他用户运行脚本来解决问题。 在Windows上,默认情况下,Jenkins从用户SYSTEM执行所有作业。 我不知道为什么它会影响脚本的行为,但是可以通过专门创建的用户帐户使用psexec运行它。

万一有兴趣的话,我可以这样做:

psexec -accepteula -h -user Jenkins -p _password_ "full/path/to/bash.exe" full/path/to/script.sh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM