Linux Systemd:常用用法与自定义服务

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://:8000 应该能看到文件列表。

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/.service
资源限制 MemoryLimit, CPUQuota
定时任务 systemd-timer
通过 Systemd,你可以高效管理系统服务,并轻松自定义后台任务。无论是运行 Web 服务器、数据库,还是定时脚本,Systemd 都能提供强大的管理能力。

发表回复

CAPTCHAis initialing...