You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Jenkins sshPublisher执行脚本无法杀死进程的问题求助

解决Jenkins sshPublisher执行脚本无法杀死进程的问题

我帮你捋一捋这个问题,结合你给出的Jenkins配置和部署脚本,大概率是权限问题或者脚本语法错误导致的,咱们一步步来解决:

首先修正脚本里的明显错误

你的deploy.sh里有两处语法问题,直接导致进程ID无法正确获取或脚本执行异常:

  1. awk {'print $9}'里的单引号配对错误,应该是awk '{print $9}'
  2. 脚本末尾多了一个多余的fi

另外,咱们得给kill命令加上sudo(如果目标进程是root用户运行的,普通用户没权限杀死),同时增加空值判断,避免没有进程时kill -9报错。修正后的脚本如下:

#!/bin/bash
# 获取占用9030端口的进程ID
processId=$(sudo netstat -plten | grep 9030 | awk '{print $9}' | awk -F '/' '{print $1}')
echo "检测到的进程ID: $processId"

# 仅当进程ID不为空时执行杀死操作
if [ ! -z "$processId" ]; then
    sudo kill -9 $processId
    echo "已杀死进程 $processId"
    sleep 5
else
    echo "9030端口没有运行的进程"
fi

echo '启动FDP应用'
nohup java -jar /data/fdp-0.0.1-SNAPSHOT.war &> /data/logs/FDPBizApp.log &
exit 0

核心问题:Jenkins的SSH会话没有免密sudo权限

手动登录VM时你可以输入sudo密码,但Jenkins的SSH连接是非交互式的,无法输入密码,所以sudo netstat或sudo kill会悄悄失败,导致进程杀不掉。

解决方法是给Jenkins连接VM2所用的SSH用户配置免密码执行指定sudo命令:

  1. 在VM2上登录,运行sudo visudo(不要直接编辑/etc/sudoers,避免语法错误导致sudo失效)
  2. 在文件末尾添加一行(把jenkins_ssh_user替换成实际的SSH用户名):
jenkins_ssh_user ALL=(ALL) NOPASSWD: /bin/netstat, /bin/kill
  1. 保存退出(按Ctrl+O,回车确认,再Ctrl+X退出)

额外优化Jenkins配置

  1. 把verbose: false改成verbose: true,这样可以在Jenkins日志里看到SSH执行的详细输出,方便后续排查问题
  2. 确保execCommand使用脚本的绝对路径,比如如果deploy.sh在/data目录,就改成execCommand: '/data/deploy.sh',避免路径找不到的问题

验证方法

修改完之后重新运行Jenkins部署任务,查看日志:

  • 如果看到“已杀死进程 XXXX”的输出,说明操作成功
  • 如果还是有问题,看verbose日志里的错误信息,比如是不是netstat路径不对,可以改成绝对路径/usr/bin/sudo /bin/netstat

内容的提问来源于stack exchange,提问作者P Rajesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:11