Linux下自动部署Jar触发systemd服务start-limit-hit错误求助
问题解决方案
1. 修正目标服务的启动限制配置
报错是demo.service触发了启动次数限制,但你把StartLimit相关配置放在了监控重启服务里,这完全不对。把这两个参数移到demo.service的[Service]段:
[Unit] Description=DEMOOOOOO Spring Boot application service After=network.target [Service] #User=ubuntu Type=simple ExecStart=java -jar /root/artifacts2/demo-0.0.1-SNAPSHOT.jar TimeoutStopSec=10 Restart=on-failure RestartSec=5 # 取消启动次数限制,适配频繁重启场景 StartLimitIntervalSec=0 StartLimitBurst=0 [Install] WantedBy=multi-user.target
2. 减少Path监控的触发频率
你当前监控整个目录,部署Jar时的临时文件写入、Jar替换的中间步骤会多次触发PathModified,导致服务反复启停。改成监控具体Jar文件,并使用PathChanged(仅当文件被替换、inode变化时触发,而非内容写入过程):
[Path] Unit=demo-watcher.service # 只监控目标Jar文件,且仅在文件被替换时触发 PathChanged=/root/artifacts2/demo-0.0.1-SNAPSHOT.jar [Install] WantedBy=multi-user.target
3. 优化重启服务的执行逻辑
当前先stop再start的方式可能出现时序问题,直接用systemctl restart更稳妥,它会自动等待停止完成后再启动:
[Unit] Description=demo restarter After=network.target [Service] Type=oneshot # 用restart替代分开的stop+start,避免时序冲突 ExecStart=systemctl restart demo.service StartLimitIntervalSec=0 StartLimitBurst=0 [Install] WantedBy=multi-user.target
4. 部署脚本的原子化优化
如果Bitbucket部署是先上传临时文件再替换Jar,改成原子替换操作,减少文件变更事件:
# 示例部署脚本 # 先上传到临时目录 scp ./demo-0.0.1-SNAPSHOT.jar root@your-droplet:/tmp/ # 一次性替换目标Jar,仅触发一次监控事件 ssh root@your-droplet "mv /tmp/demo-0.0.1-SNAPSHOT.jar /root/artifacts2/"
内容的提问来源于stack exchange,提问作者abidinberkay
相关产品推荐
相关产品推荐

