文章目录

Linux 服务:systemd 服务管理

发布于 2026-04-13 17:24:36 · 浏览 18 次 · 评论 0 条

Linux 服务:systemd 服务管理

什么是systemd

systemd是现代Linux发行版中广泛使用的初始化系统和系统管理器,负责启动系统服务、管理系统资源、监控系统状态等。它替代了传统的System V init系统,提供了更高效的服务管理机制。

创建systemd服务文件

  1. 创建一个新的服务文件,例如myapp.service,并放置在/etc/systemd/system/目录中:
[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
User=myuser
Group=myuser
ExecStart=/usr/bin/myapp
ExecStop=/usr/bin/myapp --stop
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
  1. 保存文件后,重新加载systemd以识别新服务:
sudo systemctl daemon-reload

启动、停止和重启服务

  1. 启动服务:
sudo systemctl start myapp.service
  1. 停止服务:
sudo systemctl stop myapp.service
  1. 重启服务:
sudo systemctl restart myapp.service
  1. 启用服务(开机自动启动):
sudo systemctl enable myapp.service
  1. 禁用服务(开机不自启):
sudo systemctl disable myapp.service

检查服务状态

  1. 查看服务状态:
systemctl status myapp.service
  1. 查看所有服务的状态:
systemctl list-units --type=service
  1. 查看失败的服务:
systemctl --failed

管理服务依赖关系

systemd可以根据服务之间的依赖关系自动管理服务的启动顺序:

  1. 使用AfterBefore指令定义服务依赖关系
  2. 使用RequiresWants指令定义强依赖和弱依赖关系
  3. 使用PartOf指令确保相关服务一起启动和停止

例如,在服务文件中:

[Unit]
Description=My Application Service
After=network.target mysql.service
Requires=mysql.service

使用systemd定时器和定时任务

systemd不仅可以管理服务,还可以使用定时器来执行定时任务:

  1. 创建一个定时器文件(例如myapp.timer):
[Unit]
Description=Run myapp every hour

[Timer]
OnUnitActiveSec=1h
OnBootSec=10min

[Install]
WantedBy=timers.target
  1. 启用并启动定时器:
sudo systemctl enable myapp.timer
sudo systemctl start myapp.timer
  1. 列出所有活动定时器:
systemctl list-timers

监控和管理服务日志

systemd集成了日志功能,称为journald:

  1. 查看特定服务的日志:
journalctl -u myapp.service
  1. 查看实时日志流:
journalctl -u myapp.service -f
  1. 查看特定时间范围内的日志:
journalctl --since "2023-01-01" --until "2023-01-02"

服务自动重启配置

systemd可以配置在服务失败时自动重启:

  1. 使用Restart指令配置重启策略:
[Service]
Restart=on-failure
RestartSec=5s
StartLimitInterval=1min
StartLimitBurst=3
  1. 配置重启行为:
    • Restart=no - 不自动重启(默认)
    • Restart=on-success - 仅在退出状态为0时重启
    • Restart=on-failure - 仅在非正常退出时重启
    • Restart=on-abnormal - 在异常终止时重启
    • Restart=on-watchdog - 在监视超时时重启
    • Restart=on-abort - 在终止时重启
    • Restart=always - 总是重启

使用systemd进行资源管理

systemd可以限制服务的资源使用:

  1. 配置内存限制:
[Service]
MemoryMax=500M
MemoryHigh=400M
MemorySwapMax=1G
  1. 配置CPU限制:
[Service]
CPUQuota=50%
CPUSchedulingPolicy=idle
CPUSchedulingPriority=10
  1. 配置文件描述符限制:
[Service]
LimitNOFILE=65536

使用systemd进行远程管理

systemd支持通过D-Bus进行远程管理:

  1. 安装必要的工具:
sudo apt install systemd-python  # 对于Debian/Ubuntu
# 或
sudo yum install python-systemd  # 对于RHEL/CentOS
  1. 使用Python脚本控制远程服务:
import systemd.daemon
import systemd.journal

# 通知systemd服务已准备好
systemd.daemon.notify('READY=1')

# 记录日志到journal
systemd.journal.write("Service started successfully")

最佳实践

  1. 保持服务文件简洁明了,只包含必要的配置
  2. 使用描述性的名称和服务描述
  3. 避免在服务文件中硬编码路径,使用环境变量或配置文件
  4. 考虑使用专用的用户和运行服务,而不是root用户
  5. 记录适当的日志,便于故障排除
  6. 使用Type=forking当服务需要分叉进程时
  7. 设置合理的服务限制,避免资源滥用

实际应用示例

创建一个简单的Web服务器服务

  1. 安装Nginx(如果尚未安装):
sudo apt install nginx  # 对于Debian/Ubuntu
# 或
sudo yum install nginx  # 对于RHEL/CentOS
  1. 创建自定义Nginx服务文件:
[Unit]
Description=Custom Nginx Service
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
  1. 保存文件并重新加载systemd:
sudo systemctl daemon-reload
sudo systemctl start custom-nginx
sudo systemctl enable custom-nginx

创建一个定时数据备份服务

  1. 创建备份脚本/usr/local/bin/backup.sh
#!/bin/bash
# 创建备份目录
mkdir -p /var/backups/myapp

# 备份应用数据
tar -czf /var/backups/myapp/app_backup_$(date +%Y%m%d_%H%M%S).tar.gz /path/to/app/data

# 保留最近7天的备份
find /var/backups/myapp -name "app_backup_*.tar.gz" -mtime +7 -delete
  1. 赋予脚本执行权限:
sudo chmod +x /usr/local/bin/backup.sh
  1. 创建systemd服务文件:
[Unit]
Description=My Application Backup Service
After=network.target

[Service]
Type=oneshot
User=myuser
Group=myuser
ExecStart=/usr/local/bin/backup.sh

[Install]
WantedBy=multi-user.target
  1. 创建定时器文件:
[Unit]
Description=Run backup daily at 2am

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
  1. 启用并启动定时器:
sudo systemctl enable backup.timer
sudo systemctl start backup.timer

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文