Skip to content
Linux 基础与服务器治理 · 第 4 篇 / 共 7 篇
领域运维与部署
专题Linux 与服务器治理专题
当前序列Linux 基础与服务器治理
阅读位置第 4 篇 / 共 7 篇当前专题第 1 个序列 / 共 4 个序列

Linux 开机自启动怎么做:systemd service 文件的最小实用写法

如果你现在还在把服务启动脚本塞进 rc.local,很多时候不是完全不能用,而是已经不够现代也不够可控了。

对现在主流 Linux 发行版来说,真正应该优先掌握的是 systemd

先说结论

部署长期运行服务时,优先用 systemd 管理,而不是:

  • 手工 nohup
  • 开机脚本里随便追加命令
  • 靠终端会话维持进程

因为 systemd 至少能帮你解决:

  • 开机自启动
  • 统一启停
  • 失败重启
  • 日志查看

一、为什么更推荐 systemd

systemd 的好处不只是“能自启动”,而是服务生命周期更可控。

你可以明确声明:

  • 启动命令是什么
  • 运行用户是谁
  • 工作目录在哪
  • 失败后要不要重启
  • 服务依赖网络还是其他组件

这比随手起一个后台进程靠谱得多。

对个人站点来说,它不一定只用来托管 Java 服务,也很适合管理:

  • Node 构建服务
  • 自定义脚本
  • 定时同步任务
  • docker compose 启动项

二、一个最小可用的 service 文件

假设你的 Java 服务放在 /opt/app/demo.jar,可以创建:

/etc/systemd/system/demo.service

ini
[Unit]
Description=demo service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar /opt/app/demo.jar
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

这已经足够覆盖大多数单体服务场景。

三、部署后常用的几条命令

重新加载配置

bash
systemctl daemon-reload

启动服务

bash
systemctl start demo

设置开机自启动

bash
systemctl enable demo

查看状态

bash
systemctl status demo

停止服务

bash
systemctl stop demo

重启服务

bash
systemctl restart demo

四、如果当前服务是 Docker Compose,要不要也交给 systemd

很多人会纠结:

  • 已经用了 Docker,是不是就完全不需要 systemd 了

不一定。

如果你希望机器重启后自动把整组容器按固定方式拉起来,比较常见的做法就是:

  • Compose 管容器编排
  • systemd 管 Compose 这条启动命令

也就是说,两者不是替代关系,而是可以配合。

例如:

ini
[Unit]
Description=nginx compose stack
After=docker.service network.target
Requires=docker.service

[Service]
Type=oneshot
WorkingDirectory=/mydata/nginx
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

这种方式特别适合你现在这种“Docker Nginx + 宿主机挂载目录”的场景。

五、日志怎么看

如果服务起不来,第一反应不要只盯着业务日志,也要直接看 journalctl

bash
journalctl -u demo -n 100

实时跟日志:

bash
journalctl -u demo -f

这通常能很快看出:

  • 路径写错
  • 权限不足
  • Java 不在预期位置
  • 环境变量没生效

六、几个高频配置项

User

指定运行用户。

生产环境里,通常不建议所有服务都用 root 跑。

WorkingDirectory

指定工作目录。

很多相对路径依赖都跟它有关。

Restart

常见可选值:

  • no
  • on-failure
  • always

对大多数后端服务,on-failurealways 都比较常见。

Environment

如果服务依赖环境变量,可以直接在 service 文件中写:

ini
Environment=SPRING_PROFILES_ACTIVE=prod

七、rc.local 还能不能用

能用,但不建议把它当主方案。

它的问题主要在于:

  • 粒度粗
  • 缺少统一状态管理
  • 不方便做标准化运维

对于真正长期运行的服务,systemd 会明显更稳。

八、常见排查点

如果服务没有按预期启动,优先看这些:

  • ExecStart 路径是否正确
  • 运行用户是否有访问目录的权限
  • JDK 路径是否存在
  • 配置文件、日志目录是否可读写
  • 服务是不是改了文件但没执行 daemon-reload

如果管理的是 Compose 服务,再多看两项:

  • docker 服务是不是已经先启动
  • WorkingDirectory 是不是指到了正确的 compose 文件目录

九、什么时候不一定要用 systemd

如果当前服务本身已经完全交给:

  • Kubernetes
  • 云厂商托管平台
  • 专门的进程管理器

那就不一定要再自己写 systemd。

但只要你现在主要还是在一台 Linux 服务器上长期跑服务,它依然是很值得掌握的基础能力。

一句话总结

systemd 不只是“开机自启动工具”,而是 Linux 服务管理的标准入口。

只要你的服务打算长期跑在服务器上,就值得把 service 文件写规范,这会让后续部署、重启和排障都省很多事。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读Linux 日志切割怎么做更稳适合把磁盘、权限、链接、systemd、日志和服务器初始化这些基础能力集中起来看。Linux 与服务器治理专题 · Linux 基础与服务器治理同一序列 · 顺着当前主线继续读服务器初始化清单适合把磁盘、权限、链接、systemd、日志和服务器初始化这些基础能力集中起来看。Linux 与服务器治理专题 · Linux 基础与服务器治理同专题其他序列 · 共享标签:Linux、部署交付tcpdump 抓包时最常见的误区有哪些适合把 CPU、IO、网络连接、抓包和 cgroup 限制放在同一条 Linux 排查主线上看。Linux 与服务器治理专题 · Linux 系统资源与网络排查同专题其他序列 · 共享标签:Linux、部署交付cron 和 systemd timer 怎么选适合把进程、负载、I/O 和定时任务放在一起看。Linux 与服务器治理专题 · Linux 性能分析与系统时钟跨专题关联 · 共享标签:Linux、部署交付GitLab CI/CD 实战:Docker 构建镜像并通过 SSH 部署到服务器适合沿着流水线设计、自动部署、发布策略、数据库变更和多环境治理这条线往下读。CI/CD 与发布治理专题 · CI/CD 与发布治理跨专题关联 · 同场景:部署交付标签基数为什么会拖垮 Prometheus适合把 Prometheus、Grafana、标签治理和告警分级放在一起看。可观测性专题 · 指标与告警体系设计
继续阅读Linux 基础与服务器治理当前序列第 4 篇 / 共 7 篇当前专题第 1 个序列 / 共 4 个序列
往前看
上一篇ln 怎么用:软链接和硬链接到底有什么区别回到当前序列上一章上一序列AI 协作流程与治理从第 1 篇开始:把 AI 接进开发流程
往后看
下一篇Linux 日志切割怎么做更稳继续当前序列下一章下一序列Linux 性能分析与系统时钟从第 1 篇开始:进程、线程和 load average 怎么一起理解

把零散经验整理成可查、可复用、可持续更新的企业级知识门户