systemd是现代Linux发行版默认的初始化系统和服务管理器,取代了传统的SysV init和Upstart。掌握systemd服务单元(Unit)配置是Linux系统管理的核心技能。本文从自定义服务单元编写、依赖管理、资源限制、日志收集四个维度,给出可直接使用的配置模板与排障方法。
systemd服务单元文件结构与核心配置项
systemd服务单元文件位于/etc/systemd/system/或/usr/lib/systemd/system/目录,文件扩展名为.service。一个完整的服务单元包含[Unit]、[Service]、[Install]三个主要段:
[Unit]
Description=My Custom Application Service
Documentation=https://example.com/docs
After=network.target postgresql.service
Requires=postgresql.service
Wants=redis.service
[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/main.py
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
TimeoutStopSec=30s
Environment=NODE_ENV=production
Environment=DATABASE_URL=postgresql://localhost/myapp
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Type字段决定服务进程管理方式:
simple:ExecStart启动的进程即为主进程,systemd立即认为服务启动成功forking:服务通过fork创建子进程后退出,systemd跟踪子进程oneshot:执行一次性任务后退出,常用于初始化脚本notify:服务通过sd_notify通知systemd启动完成,适合需要精确控制就绪时机的服务
After与Requires的区别:After控制启动顺序但不强制依赖,Requires强制依赖——被依赖服务未启动时,当前服务不会启动。Wants是弱依赖,被依赖服务失败不影响当前服务。
资源限制与安全加固配置
systemd内置资源控制(cgroups v2),无需额外安装cgroups工具即可限制服务的CPU、内存、IO等资源:
[Service]
# CPU限制:最多使用2个核心
CPUQuota=200%
CPUWeight=1024
# 内存限制:最大2GB
MemoryMax=2G
MemoryHigh=1536M
MemorySwapMax=1G
# IO读写限制
IOReadBandwidthMax=/dev/sda 50M
IOWriteBandwidthMax=/dev/sda 50M
# 进程数限制
TasksMax=512
# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ReadWritePaths=/var/lib/myapp /var/log/myapp
# 网络隔离
IPAddressDeny=any
IPAddressAllow=127.0.0.1 10.0.0.0/8
ProtectSystem=strict使整个文件系统对服务只读,仅ReadWritePaths指定的路径可写。PrivateTmp=true为服务创建独立的/tmp目录。NoNewPrivileges=true禁止服务进程通过setuid提权。这些安全选项在不修改应用代码的前提下,显著缩小服务的攻击面。
systemd定时器替代crontab配置
systemd timer比crontab提供更精细的调度控制,支持依赖关系、条件触发和日志关联。创建一个定时备份任务:
# /etc/systemd/system/backup.service
[Unit]
Description=Database Backup Service
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=postgres
# /etc/systemd/system/backup.timer
[Unit]
Description=Run Database Backup Daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
OnCalendar定义触发时间,Persistent=true使错过的任务在系统启动后补执行,RandomizedDelaySec添加随机延迟避免多个定时任务同时启动造成资源尖峰。
启动定时器:
systemctl daemon-reload
systemctl enable --now backup.timer
systemctl list-timers --all
journalctl日志查询与排障技巧
systemd统一通过journald收集日志,使用journalctl查询:
# 查看指定服务最近100行日志
journalctl -u myapp.service -n 100
# 实时跟踪服务日志
journalctl -u myapp.service -f
# 按时间范围查询
journalctl -u myapp.service --since "2026-08-25 00:00:00" --until "2026-08-25 12:00:00"
# 查看服务启动失败原因
systemctl status myapp.service
journalctl -u myapp.service -p err
# 查看本次启动的所有日志
journalctl -b -u myapp.service
# 导出日志为JSON格式供分析
journalctl -u myapp.service -o json --since today
服务启动失败的常见原因及排查:systemctl status输出中会显示退出码和最近日志行。退出码143(SIGTERM)通常是手动停止或超时终止,退出码137(SIGKILL)可能是OOM Killer杀死了进程,需检查dmesg确认是否触发OOM。
配置日志持久化,避免重启后日志丢失:
# 创建日志持久化目录
mkdir -p /var/log/journal
systemctl restart systemd-journald
systemd服务管理覆盖了进程生命周期、资源隔离、安全加固、定时调度和日志收集,理解并合理配置这些能力,是Linux服务器运维的基础功。在生产环境中,建议将服务单元文件纳入版本管理,配合Ansible等配置管理工具批量部署,避免手动修改造成的配置漂移。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linuxsystemd-fu-wu-guan-li-shi-zhan-zi-ding-yi-fu-wu-dan/