【linux】systemct创建服务
在 Linux 系统中,可以通过 自定义 systemd 服务单元(unit) 来扩展 systemctl
的功能,使其管理自定义脚本、应用程序或后台任务。
1. 创建自定义 systemd 服务文件
systemd 服务文件通常以 .service
为后缀,存放在以下目录:
- 系统级服务:
/etc/systemd/system/
(推荐,优先级更高) - 用户级服务:
~/.config/systemd/user/
(仅对当前用户生效)
示例:创建一个自定义服务
假设你想让 systemctl
管理一个 Python 脚本 /opt/myscript/main.py
,步骤如下:
(1) 创建服务文件
sudo nano /etc/systemd/system/myscript.service
(2) 编写服务配置
[Unit]
Description=My Custom Python Script
After=network.target # 确保网络就绪后启动[Service]
Type=simple
User=root # 运行用户(建议用非 root 用户,如 `www-data`)
WorkingDirectory=/opt/myscript/
ExecStart=/usr/bin/python3 /opt/myscript/main.py
Restart=on-failure # 失败时自动重启
RestartSec=5s # 重启间隔[Install]
WantedBy=multi-user.target # 系统多用户模式时启用
(3) 关键参数说明
参数 | 作用 |
---|---|
Description | 服务描述 |
After | 定义依赖(如 network.target 表示网络就绪后启动) |
Type | simple (默认)、forking (后台进程)、oneshot (单次任务) |
User | 运行身份(建议非 root) |
ExecStart | 启动命令(必须用绝对路径!) |
Restart | 自动重启策略(on-failure 、always 、no ) |
WantedBy | 定义服务所属运行级别(如 multi-user.target ) |
2. 让 systemd 识别并管理服务
(1) 重新加载 systemd 配置
sudo systemctl daemon-reload
(2) 启动服务
sudo systemctl start myscript
(3) 设置开机自启
sudo systemctl enable myscript
(4) 检查状态
sudo systemctl status myscript
3. 高级自定义选项
(1) 环境变量
在 [Service]
部分添加:
Environment="VAR1=value1"
EnvironmentFile=/path/to/env-file # 从文件加载变量
(2) 限制资源
[Service]
MemoryLimit=500M # 内存限制
CPUQuota=50% # CPU 限制
(3) 定时任务(替代 cron)
使用 systemd.timer
实现定时任务:
- 创建服务文件(如
/etc/systemd/system/mytask.service
):[Unit] Description=My Daily Task[Service] Type=oneshot ExecStart=/path/to/script.sh
- 创建计时器文件(如
/etc/systemd/system/mytask.timer
):[Unit] Description=Run mytask daily[Timer] OnCalendar=daily # 每天执行 Persistent=true # 错过时间后补执行[Install] WantedBy=timers.target
- 启用计时器:
sudo systemctl enable mytask.timer sudo systemctl start mytask.timer
4. 调试与日志
(1) 查看服务日志
journalctl -u myscript -xe # 查看详细日志
(2) 测试命令
# 手动测试 ExecStart 命令
sudo /usr/bin/python3 /opt/myscript/main.py# 检查依赖
systemd-analyze verify myscript.service
5. 删除自定义服务
sudo systemctl stop myscript
sudo systemctl disable myscript
sudo rm /etc/systemd/system/myscript.service
sudo systemctl daemon-reload
总结
操作 | 命令 |
---|---|
创建服务文件 | sudo nano /etc/systemd/system/<服务名>.service |
重载配置 | sudo systemctl daemon-reload |
启动服务 | sudo systemctl start <服务名> |
开机自启 | sudo systemctl enable <服务名> |
查看日志 | journalctl -u <服务名> |
通过自定义 systemd
服务,你可以将任何脚本、程序或任务集成到 Linux 的服务管理中,实现开机启动、崩溃重启、资源限制等功能。