我希望有一个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
任何想法如何解决这个问题?
答案 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
答案 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
希望获得帮助。