通过Jenkins

时间:2017-06-21 13:53:21

标签: bash shell jenkins kill fuser

我希望有一个Jenkins工作,可以杀死端口5000(bash)上的所有进程。 简单的解决方案

fuser -k 5000/tcp

在终端中执行此命令时工作正常,但在Jenkins("执行shell")上标记为失败。

我也试过

kill $(lsof -i -t:5000)

但是,再次,因为它适用于常规终端,在Jenkins上我得到了

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Build step 'Execute shell' marked build as failure

任何想法如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

尝试使用路径

放置命令
/usr/bin/kill $(/usr/sbin/lsof -i -t:5000)

如果运行jenkins服务的用户与端口5000上具有进程的用户不同,则您无法终止该进程。也许你需要用sudo运行它。

试试这个

su -s jenkins #Or the user who run jenkins
/usr/bin/kill $(/usr/sbin/lsof -i -t:5000)

答案 1 :(得分:1)

我遇到了同样的问题。当进程未运行时,它不起作用。 bash刚刚做到了,但詹金斯失败了。

如果bash命令失败,您可以向jenkins作业添加|| true以指示jenkins继续执行作业。

所以它:

fuser -k 5000/tcp || true

另见don't fail jenkins build if execute shell fails

答案 2 :(得分:0)

也许jenkins用户因为权限而无法查看进程,因此$(lsof ..)的扩展为空。

错误输出可能不完整,因为如果lsof调用失败,stderr上会出现一条消息。

答案 3 :(得分:0)

问题是$是jenkins命令中的特殊字符。这意味着你指的是ENV VAR。

您应该尝试编写包含单引号的命令。

答案 4 :(得分:0)

我遇到了同样的问题,并且在许多情况下,标准输入/输出被禁用(特别是当您对目标计算机使用SSH时)。您可以做的是在目标服务器中创建一个可执行的Shell文件并执行该文件。

因此,该步骤如下所示:

步骤1。 ->创建外壳文件

 cat > kill_process.sh << EOF
 target_port_num=\`lsof -i:\${1} -t\`;
 echo "Kill process at port is :: \${target_port_num}"
 kill -9 \${target_port_num}
 EOF

步骤2。 ->使其可执行 chmod + x process_killer.sh

步骤3。 ->执行shell并传递端口号 ./process_killer.sh 3005

希望获得帮助。