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
相关产品推荐
相关产品推荐

