Systemd 是现代 Linux 系统中最主流的初始化系统(init system),负责管理系统的启动、服务和进程。它取代了传统的 SysVinit 和 Upstart,提供了更快的启动速度、更强大的依赖管理以及更灵活的配置方式。
本文将介绍 Systemd 的核心概念、常用命令,并详细讲解 如何自定义一个 Systemd 服务。
1. Systemd 基础概念
1.1 什么是 Systemd?
Systemd 是一个系统和服务管理器,主要功能包括:
并行启动服务(加快系统启动速度)
服务依赖管理
日志管理(通过 journald)
系统状态监控
挂载点管理
定时任务(替代 cron 的 systemd-timer)
1.2 Systemd 的核心组件
组件 作用
systemd
主进程,管理所有服务
systemctl
控制 Systemd 的主要命令
journalctl
查看 Systemd 日志
unit(单元)
服务、挂载点、设备等的配置文件(.service, .socket, .timer 等)
2. Systemd 常用命令
2.1 服务管理
命令 作用
systemctl start <service> 启动服务
systemctl stop <service> 停止服务
systemctl restart <service> 重启服务
systemctl reload <service> 重新加载配置(不重启)
systemctl enable <service> 设置开机自启
systemctl disable <service> 取消开机自启
systemctl status <service> 查看服务状态
systemctl is-active <service> 检查服务是否运行
示例:管理 Nginx 服务
sudo systemctl start nginx # 启动
sudo systemctl enable nginx # 开机自启
sudo systemctl status nginx # 查看状态
2.2 查看日志
Systemd 使用 journald 管理日志,可通过 journalctl 查看:
journalctl -u nginx # 查看 Nginx 日志
journalctl -xe # 查看最近错误日志
journalctl -f # 实时日志(类似 tail -f)
2.3 系统状态管理
命令 作用
systemctl reboot 重启系统
systemctl poweroff 关机
systemctl suspend 挂起(睡眠)
systemctl hibernate 休眠
3. 自定义 Systemd 服务
假设我们要创建一个 Python HTTP 服务,并让它随系统启动。
3.1 编写 Python 示例服务
创建一个简单的 HTTP 服务器:
mkdir -p ~/myapp
cat > ~/myapp/server.py <<EOF
from http.server import SimpleHTTPRequestHandler, HTTPServer
def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"Server running on port {port}...")
httpd.serve_forever()
if __name__ == "__main__":
run()
EOF
测试运行:
python3 ~/myapp/server.py
访问 http://your_ip:8000 测试是否正常。
3.2 创建 Systemd 服务文件
Systemd 服务文件通常位于 /etc/systemd/system/ 或 /usr/lib/systemd/system/。
创建 /etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.service
写入以下内容:
[Unit]
Description=My Python HTTP Server
After=network.target # 确保网络就绪后启动
[Service]
User=root # 运行用户
WorkingDirectory=/home/username/myapp # 工作目录
ExecStart=/usr/bin/python3 /home/username/myapp/server.py # 启动命令
Restart=always # 崩溃后自动重启
RestartSec=5 # 重启间隔(秒)
[Install]
WantedBy=multi-user.target # 多用户模式启动
关键参数说明:
After:定义依赖关系(如 network.target 表示网络就绪后才启动)。
Restart=always:服务崩溃后自动重启。
WantedBy:定义服务在哪个 target 启动(multi-user.target 适用于命令行模式)。
3.3 启动并测试服务
sudo systemctl daemon-reload # 重新加载 Systemd 配置
sudo systemctl start myapp # 启动服务
sudo systemctl enable myapp # 开机自启
sudo systemctl status myapp # 检查状态
如果一切正常,访问 http://
3.4 调试服务
如果服务未运行,查看日志:
journalctl -u myapp -f # 实时日志
journalctl -u myapp -xe # 详细错误日志
4. 高级 Systemd 技巧
4.1 限制资源使用
在 [Service] 部分添加资源限制:
[Service]
...
MemoryLimit=500M # 内存限制
CPUQuota=50% # CPU 限制
4.2 环境变量
在服务文件中定义环境变量:
[Service]
Environment="PORT=8080"
ExecStart=/usr/bin/python3 /home/username/myapp/server.py --port ${PORT}
4.3 定时任务(替代 Cron)
Systemd 提供了 timer 单元,可以替代 cron:
sudo nano /etc/systemd/system/mytimer.timer
写入:
[Unit]
Description=Run my script every hour
[Timer]
OnCalendar=*-*-* *:00:00 # 每小时运行一次
Unit=myscript.service # 关联的服务
[Install]
WantedBy=timers.target
然后创建对应的 myscript.service:
[Unit]
Description=My hourly script
[Service]
ExecStart=/path/to/script.sh
5. 总结
功能 命令/配置
启动/停止服务 systemctl start/stop
开机自启 systemctl enable
查看日志 journalctl -u
自定义服务 /etc/systemd/system/
资源限制 MemoryLimit, CPUQuota
定时任务 systemd-timer
通过 Systemd,你可以高效管理系统服务,并轻松自定义后台任务。无论是运行 Web 服务器、数据库,还是定时脚本,Systemd 都能提供强大的管理能力。