原创

通过Jenkins自动编译发布到其他主机启动Tomcat失败的问题解决

问题

在A主机通过jenkins编译程序为War包,再通过ssh插件连接到B主机,执行停止tomcat,备份war包,更新war包操作之后,在启动tomcat,发现虽然jenkins日志上显示tomcat启动成功,但是查看B主机进程列表发现tomcat没启动成功。

解决方案

解决这个问题需要分为两个情况,第一个情况是jenkins自己在退出B主机时,由于已经结束了自己的执行脚本进程,也会杀掉该进程所衍生的其他进程,导致jenkins任务一退出,tomcat的进程也会被杀掉,此种情况解决方案比较多:

  1. 在jenkins的任务的构建参数列表增加一个string patameter,命名为BUILD_ID,值为DontKillMe即可;
  2. 在jenkins的ssh插件执行命令的输入框中增加export BUILD_ID=DontKillMe;
  3. 在jenins的node配置界面,点击自身节点,配置一个BUILD_ID环境变量就行了;

其他还有很多方法,自行百度即可。

另外一个问题就是服务器自身问题导致,此问题通过上面的方法完全不管用,通过在其他服务器上测试,同样的jar包,同样的流程,同样的部署脚本,同样的启动停止脚本,其他服务器正常。
后经过运维人员提醒,发现:

新版的sshd服务,配置文件中,退出ssh后,默认配置会杀死当前控制组里面的所有子进程,修改策略即可,退出ssh的杀死程序(KillMode)
有如下策略:
1、control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
2、process:只杀主进程
3、mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
4、none:没有进程会被杀掉,只是执行服务的 stop 命令。

按照以下操作步骤操作:

  1. 查看/lib/systemd/system/sshd@.service文件,保证内容与下面的一致,尤其是KillMode=process,如果没有这一行,请自行追加
[Unit]
Description=OpenSSH per-connection server daemon
Documentation=man:sshd(8) man:sshd_config(5)
Wants=sshd-keygen.service
After=sshd-keygen.service

[Service]
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=-/usr/sbin/sshd -i $OPTIONS
KillMode=process #追加这个配置
StandardInput=socket
  1. 重新加载配置并重启sshd服务
systemctl daemon-reload
service sshd restart

如果不生效,就重新连接下ssh客户端

正文到此结束