Linux使用systemd管理服务的操作指南

 更新时间:2026年08月12日 08:34:50   作者:张老师技术栈  
还在用SysVinit,现代Linux都用systemd管理服务了,这篇手把手教你编写Unit文件部署Java项目,配置开机自启、看懂服务日志,还有Restart策略对比和定时任务替代crontab的实用技巧,看完再也不怕服务挂了不知道,需要的朋友可以参考下

现代 Linux 都用 systemd 管理服务,替代了老的 SysVinit。部署 Java/Python 项目、写开机自启、看服务日志,全都要用 systemd。这篇从 Unit 文件写到实战部署。

一、什么是 systemd

systemd = 系统和服务管理器

老方式 service(SysVinit):
  开机顺序执行脚本,无依赖关系,启动慢
  /etc/init.d/xxx 脚本启动

新方式 systemd:
  并行启动、按依赖排序、统一管理
  /usr/lib/systemd/system/ 存 Unit 文件
  用 systemctl 命令操作
# systemctl 常用命令
systemctl start nginx          # 启动
systemctl stop nginx           # 停止
systemctl restart nginx        # 重启
systemctl status nginx         # 查看状态
systemctl enable nginx         # 开机自启
systemctl disable nginx        # 取消自启
systemctl is-active nginx      # 是否运行中

二、编写 Unit 文件

以部署一个 Java 项目为例,创建 /etc/systemd/system/myapp.service

[Unit]
Description=My Java Application       # 描述
After=network.target mysql.service    # 依赖:这些服务先启动
Wants=mysql.service                   # 软依赖,失败不阻塞
[Service]
Type=simple                            # 简单类型,主进程前台运行
User=appuser                          # 以哪个用户运行(安全)
WorkingDirectory=/opt/myapp           # 工作目录
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar myapp.jar   # 启动命令
ExecStop=/bin/kill -s TERM $MAINPID   # 停止命令
Restart=on-failure                    # 失败自动重启
RestartSec=5                          # 重启等待5秒
Environment="JAVA_HOME=/usr/local/jdk" # 环境变量
StandardOutput=append:/var/log/myapp.log   # 日志输出
StandardError=append:/var/log/myapp-error.log
[Install]
WantedBy=multi-user.target            # 开机自启挂载点

Restart 策略对比:

策略行为
no不自动重启(默认)
on-failure非正常退出才重启(推荐生产)
always任何退出都重启
on-abnormal信号/超时/看门狗等异常才重启

三、生效与开机自启

# 写完后必须重载配置
systemctl daemon-reload

# 启动并设置开机自启
systemctl start myapp
systemctl enable myapp

# 查看状态(会显示是否开机自启 enabled)
systemctl status myapp

部署 Java 项目的完整流程:

# 1. 创建应用目录并上传 jar
mkdir -p /opt/myapp
scp myapp.jar root@服务器:/opt/myapp/

# 2. 创建非root运行用户(安全)
useradd -r appuser

# 3. 写 Unit 文件(内容见上)
vi /etc/systemd/system/myapp.service

# 4. 重载并启动
systemctl daemon-reload
systemctl enable --now myapp

# 5. 验证
systemctl status myapp
tail -f /var/log/myapp.log

四、日志查看 journalctl

journalctl -u myapp                # 查看服务全部日志
journalctl -u myapp -f             # 实时跟踪
journalctl -u myapp --since "1 hour ago"   # 最近1小时
journalctl -u myapp -n 100         # 最近100行
journalctl -u myapp -p err         # 只看错误级别

常见报错排查:

启动失败三步排查:
1. systemctl status myapp      → 看错误提示
2. journalctl -u myapp -p err  → 看详细错误日志
3. 检查文件权限 / 端口占用 / 环境变量

端口被占用:
  ss -tlnp | grep 8080
  kill -9 <pid>   # 或改配置文件端口

五、定时任务 systemd timer

systemd 也能做定时任务(替代 crontab):

# /etc/systemd/system/backup.service
[Service]
ExecStart=/opt/scripts/backup.sh
# /etc/systemd/system/backup.timer
[Timer]
OnCalendar=*-*-* 02:30:00    # 每天凌晨2点半
Persistent=true              # 错过时间下次开机补执行
[Install]
WantedBy=timers.target
systemctl enable --now backup.timer
systemctl list-timers   # 查看所有定时任务

总结

systemd 三个要点:

1. Unit 文件三部分:
   [Unit] 描述依赖 / [Service] 启动参数 / [Install] 自启挂载

2. 每次改 Unit 文件都要 systemctl daemon-reload

3. 日志排查用 journalctl -u 服务名

生产部署推荐配置:
  Type=simple + Restart=on-failure + RestartSec=5
  + 非root用户 + 日志落盘到文件

配合 systemctl status + journalctl,再也不用担心"服务挂了不知道"。

到此这篇关于Linux使用systemd管理服务的操作指南的文章就介绍到这了,更多相关Linux systemd管理服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论