文章目录
- 引言
- 一、为什么 `start.sh + nohup &` 在 systemd 下是错的
- systemd 对 `ExecStart` 的核心假设
- 你这个脚本发生了什么
- 后果清单
- 二、正确写法:`Type=simple` + 直接 exec
- ✅ 方案 A(最推荐):`Type=simple`,`ExecStart` 直接跑 java
- 为什么这样是对的
- ✅ 方案 B:保留 `start.sh`,但**不用 nohup &**,用 `exec`
- ✅ 方案 C:`Type=forking`(不推荐,但如果你坚持用 `&`)
- 三、错误例子: `nohup` 脚本逐行点评
- 问题汇总
- 四、针对 RK3588 的推荐 JVM 参数
- 五、日志处理(别再 `/dev/null`)
- 方案 1:journald(推荐,零配置)
- 方案 2:文件 + logrotate
- 方案 3:Spring Boot logback 自己写文件
- 六、最终推荐方案总结
- 七、修正后的 `start.sh`
引言
在 systemd 下使用 start.sh + nohup & 会导致 Java 进程脱离管控,引发服务状态异常、无法重启、日志丢失、资源失控等问题。正确做法是采用 Type=simple 直接运行 Java,或通过 exec 替换脚本进程,确保 systemd 精确控制主进程。针对 RK3588 设备,应合理分配内存(建议 512M~1G),禁用无效参数(如 ZGC 下的新生代设置),并启用日志输出与堆转储,保障服务稳定可靠。
一、为什么start.sh + nohup &在 systemd 下是错的
systemd 对ExecStart的核心假设
systemd 认为
ExecStart启动的进程就是服务主进程(PID 1 of the cgroup)。
它靠这个 PID 来判断:服务是否活着、该不该重启、stop 时杀谁。
你这个脚本发生了什么
#!/bin/shnohup