【原创】基于微信小程序+AI大模型+uni-app的汽车保养维修预约小程序(设计与实现)
2026/8/27 21:00:06
告别 nohup & screen!不用 Docker 也能实现开机自启、崩溃重启、统一日志
适合人群:Linux 新手、Java 开发、运维初学者、学生党
.service不是脚本!很多新手以为:
“我把
xxx.service写好,然后sh xxx.service就能启动服务”
这是完全错误的!
✅ 正确认知:
.service是一个配置文件,不是可执行脚本sh、bash、./运行它💡 类比:
就像你给物业留了一份《空调维修指南》——
你不是让物业“运行”这份指南,而是说:“以后空调坏了,你就按这个流程修”。.service就是这份指南,systemd就是物业。
| 能力 | nohup / & | Docker | systemctl(本文主角) |
|---|---|---|---|
| 开机自启 | ❌ | ✅(需--restart=always) | ✅(enable即可) |
| 崩溃自动重启 | ❌ | ✅ | ✅ |
| 日志集中查看 | ❌(分散在 nohup.out) | ✅(docker logs) | ✅(journalctl -u) |
| 资源隔离 | ❌ | ✅ | ❌(直接跑主机,更轻量) |
| 学习成本 | 低 | 中 | 极低(只需一个配置文件) |
💡结论:
如果你只是想让一个Java 程序、Elasticsearch、Python 脚本长期稳定运行在服务器上,不需要容器隔离,那么systemctl 比 Docker 更简单、更高效!
.service文件必须放哪里?(关键!)✅唯一正确位置:
/etc/systemd/system/your-service-name.service❌常见错误位置(会导致服务无效!):
/opt/myapp/your-service.service~/your-service.service🔑记住:
所有自定义服务的.service文件,必须放在/etc/systemd/system/目录下!
systemd 只会从这里读取用户自定义服务。
假设你的 Spring Boot 应用:
/opt/java-server/java-server.jarappuser(非 root!)# 查 Java 路径(通常是 /usr/bin/java)whichjava# 确认 JAR 存在ls-l /opt/java-server/java-server.jarsudouseradd-r -s /sbin/nologin appusersudochown-R appuser:appuser /opt/java-server.service文件# 注意:是在 /etc/systemd/system/ 下创建!sudovim/etc/systemd/system/java-server.service填入以下内容(逐行详解):
[Unit] Description=NSD Flow Server (Java Application) After=network.target # 等基础网络就绪 Wants=network-online.target # 等网络完全可用(推荐) [Service] Type=simple # Java/ES/Redis 用 simple User=appuser # 必须是非 root! WorkingDirectory=/opt/java-server # ✅ 正确写法:绝对路径 + 无 & + 无重定向 ExecStart=/usr/bin/java -jar /opt/java-server/java-server.jar # ❌ 错误写法(会导致 systemd 失效): # ExecStart=java -jar app.jar → java 可能找不到 # ExecStart=... & → & 会让进程后台化 # ExecStart=nohup ... & → 完全破坏管理 # ExecStart=... >> log.txt → 重定向导致日志丢失 Restart=on-failure # 仅异常退出时重启 RestartSec=10 # 重启前等待 10 秒(单位:秒) # LimitNOFILE=65536 # - 单位:个(文件描述符数量) # - 作用:允许同时打开 65536 个连接 # - 不加会怎样?高并发时报 "Too many open files" LimitNOFILE=65536 TimeoutStopSec=120 # stop 时最多等 120 秒(单位:秒) StandardOutput=journal # stdout → journal StandardError=journal # stderr → journal SyslogIdentifier=java-server # 日志前缀名 [Install] WantedBy=multi-user.target # 开机启动级别保存退出(:wq)。
# 告诉 systemd:“去 /etc/systemd/system/ 看看,有没有新服务”sudosystemctl daemon-reload⚠️每次修改 .service 文件后,都必须执行这一步!
# 启动服务sudosystemctl start java-server# 停止服务sudosystemctl stop java-server# 查看状态sudosystemctl status java-server# 设置开机自启sudosystemctlenablejava-server# 查看日志(你会看到 Spring Boot 启动日志!)sudojournalctl -u java-server -f✅ 服务名 =
.service文件名去掉.service后缀
/ ├── etc/ │ └── systemd/ │ └── system/ │ └── java-server.service ← ✅ 配置文件(必须在这里!) │ ├── opt/ │ └── java-server/ │ ├── java-server.jar ← 你的程序 │ └── config/ │ └── usr/ └── bin/ └── java ← Java 可执行文件💡
.service和 JAR 可以不在同一个目录!
只要在配置中用绝对路径指明即可。
systemctl status显示 active,但看不到应用日志ExecStart用了>> app.log或&sudojournalctl -u java-server --since"5 minutes ago"java路径错误 → 用which java确认ls -l检查Address already in usesudochown-R appuser:appuser /opt/java-server[Unit] Description=YOUR_APP After=network.target [Service] Type=simple User=your_user WorkingDirectory=/path/to/app ExecStart=/usr/bin/java -jar /path/to/app/your-app.jar Restart=on-failure RestartSec=10 LimitNOFILE=65536 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target.service文件是否放在/etc/systemd/system/?ExecStart是否用绝对路径?是否包含&或>>?systemctl daemon-reload?journalctl -u 服务名 -f查日志?