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

GitHub Actions执行nohup java -jar失败,如何成功运行Jar包?

问题分析与解决方案

核心原因

GitHub Actions自托管(self-hosted)Runner在任务执行完毕后,会回收其创建的所有子进程。你用nohup java -jar back.jar &启动的进程属于Runner的子进程,任务结束后会被强制终止,因此看不到运行记录。此外,原kill命令在无匹配进程时会报错,可能中断后续步骤;且未处理nohup输出,无法排查启动失败的具体原因。

具体修复步骤

1. 修复kill命令的容错性

原kill命令在没有匹配到进程时,xargs会执行kill -9导致报错,修改为带-r参数(无参数时不执行kill):

ps -ef | grep back.jar | grep -v grep | awk '{print $2}' | xargs -r kill -9

2. 让Jar进程脱离Runner会话(临时方案)

改进nohup命令,添加输出重定向并使用disown让进程脱离当前会话,避免被Runner回收:

nohup java -jar back.jar > nohup.out 2>&1 & disown

或者使用setsid创建独立会话:

setsid java -jar back.jar > nohup.out 2>&1 &

3. 用systemd管理服务(推荐稳定方案)

通过systemd托管Jar进程,不仅能避免Runner回收,还能实现自动重启、日志管理等功能:

  • 创建systemd服务文件:在服务器上创建/etc/systemd/system/back.service,内容如下:
[Unit]
Description=Backend Jar Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/www/pet
ExecStart=/usr/bin/java -jar back.jar
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
  • 修改Actions中的运行步骤:替换原kill和run jar步骤为:
systemctl daemon-reload
systemctl stop back.service
systemctl start back.service

4. 验证与排查

  • 在启动Jar前添加验证步骤,确认文件存在:
ls -l /www/pet/back.jar
  • 查看nohup日志排查启动错误:
cat /www/pet/nohup.out

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:09:23