通过Jenkins sshPublisher执行脚本无法杀死进程的问题求助
解决Jenkins sshPublisher执行脚本无法杀死进程的问题
我帮你捋一捋这个问题,结合你给出的Jenkins配置和部署脚本,大概率是权限问题或者脚本语法错误导致的,咱们一步步来解决:
首先修正脚本里的明显错误
你的deploy.sh里有两处语法问题,直接导致进程ID无法正确获取或脚本执行异常:
awk {'print $9}'里的单引号配对错误,应该是awk '{print $9}'- 脚本末尾多了一个多余的
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命令:
- 在VM2上登录,运行
sudo visudo(不要直接编辑/etc/sudoers,避免语法错误导致sudo失效) - 在文件末尾添加一行(把
jenkins_ssh_user替换成实际的SSH用户名):
jenkins_ssh_user ALL=(ALL) NOPASSWD: /bin/netstat, /bin/kill
- 保存退出(按
Ctrl+O,回车确认,再Ctrl+X退出)
额外优化Jenkins配置
- 把
verbose: false改成verbose: true,这样可以在Jenkins日志里看到SSH执行的详细输出,方便后续排查问题 - 确保
execCommand使用脚本的绝对路径,比如如果deploy.sh在/data目录,就改成execCommand: '/data/deploy.sh',避免路径找不到的问题
验证方法
修改完之后重新运行Jenkins部署任务,查看日志:
- 如果看到“已杀死进程 XXXX”的输出,说明操作成功
- 如果还是有问题,看verbose日志里的错误信息,比如是不是netstat路径不对,可以改成绝对路径
/usr/bin/sudo /bin/netstat
内容的提问来源于stack exchange,提问作者P Rajesh
相关产品推荐
相关产品推荐

