Linux 服务:systemd 服务管理
什么是systemd
systemd是现代Linux发行版中广泛使用的初始化系统和系统管理器,负责启动系统服务、管理系统资源、监控系统状态等。它替代了传统的System V init系统,提供了更高效的服务管理机制。
创建systemd服务文件
- 创建一个新的服务文件,例如
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
- 保存文件后,重新加载systemd以识别新服务:
sudo systemctl daemon-reload
启动、停止和重启服务
- 启动服务:
sudo systemctl start myapp.service
- 停止服务:
sudo systemctl stop myapp.service
- 重启服务:
sudo systemctl restart myapp.service
- 启用服务(开机自动启动):
sudo systemctl enable myapp.service
- 禁用服务(开机不自启):
sudo systemctl disable myapp.service
检查服务状态
- 查看服务状态:
systemctl status myapp.service
- 查看所有服务的状态:
systemctl list-units --type=service
- 查看失败的服务:
systemctl --failed
管理服务依赖关系
systemd可以根据服务之间的依赖关系自动管理服务的启动顺序:
- 使用
After和Before指令定义服务依赖关系 - 使用
Requires和Wants指令定义强依赖和弱依赖关系 - 使用
PartOf指令确保相关服务一起启动和停止
例如,在服务文件中:
[Unit]
Description=My Application Service
After=network.target mysql.service
Requires=mysql.service
使用systemd定时器和定时任务
systemd不仅可以管理服务,还可以使用定时器来执行定时任务:
- 创建一个定时器文件(例如
myapp.timer):
[Unit]
Description=Run myapp every hour
[Timer]
OnUnitActiveSec=1h
OnBootSec=10min
[Install]
WantedBy=timers.target
- 启用并启动定时器:
sudo systemctl enable myapp.timer
sudo systemctl start myapp.timer
- 列出所有活动定时器:
systemctl list-timers
监控和管理服务日志
systemd集成了日志功能,称为journald:
- 查看特定服务的日志:
journalctl -u myapp.service
- 查看实时日志流:
journalctl -u myapp.service -f
- 查看特定时间范围内的日志:
journalctl --since "2023-01-01" --until "2023-01-02"
服务自动重启配置
systemd可以配置在服务失败时自动重启:
- 使用
Restart指令配置重启策略:
[Service]
Restart=on-failure
RestartSec=5s
StartLimitInterval=1min
StartLimitBurst=3
- 配置重启行为:
Restart=no- 不自动重启(默认)Restart=on-success- 仅在退出状态为0时重启Restart=on-failure- 仅在非正常退出时重启Restart=on-abnormal- 在异常终止时重启Restart=on-watchdog- 在监视超时时重启Restart=on-abort- 在终止时重启Restart=always- 总是重启
使用systemd进行资源管理
systemd可以限制服务的资源使用:
- 配置内存限制:
[Service]
MemoryMax=500M
MemoryHigh=400M
MemorySwapMax=1G
- 配置CPU限制:
[Service]
CPUQuota=50%
CPUSchedulingPolicy=idle
CPUSchedulingPriority=10
- 配置文件描述符限制:
[Service]
LimitNOFILE=65536
使用systemd进行远程管理
systemd支持通过D-Bus进行远程管理:
- 安装必要的工具:
sudo apt install systemd-python # 对于Debian/Ubuntu
# 或
sudo yum install python-systemd # 对于RHEL/CentOS
- 使用Python脚本控制远程服务:
import systemd.daemon
import systemd.journal
# 通知systemd服务已准备好
systemd.daemon.notify('READY=1')
# 记录日志到journal
systemd.journal.write("Service started successfully")
最佳实践
- 保持服务文件简洁明了,只包含必要的配置
- 使用描述性的名称和服务描述
- 避免在服务文件中硬编码路径,使用环境变量或配置文件
- 考虑使用专用的用户和运行服务,而不是root用户
- 记录适当的日志,便于故障排除
- 使用
Type=forking当服务需要分叉进程时 - 设置合理的服务限制,避免资源滥用
实际应用示例
创建一个简单的Web服务器服务
- 安装Nginx(如果尚未安装):
sudo apt install nginx # 对于Debian/Ubuntu
# 或
sudo yum install nginx # 对于RHEL/CentOS
- 创建自定义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
- 保存文件并重新加载systemd:
sudo systemctl daemon-reload
sudo systemctl start custom-nginx
sudo systemctl enable custom-nginx
创建一个定时数据备份服务
- 创建备份脚本
/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
- 赋予脚本执行权限:
sudo chmod +x /usr/local/bin/backup.sh
- 创建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
- 创建定时器文件:
[Unit]
Description=Run backup daily at 2am
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
- 启用并启动定时器:
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
暂无评论,快来抢沙发吧!