【linux】systemct创建服务

在 Linux 系统中,可以通过 自定义 systemd 服务单元(unit) 来扩展 systemctl 的功能,使其管理自定义脚本、应用程序或后台任务。


1. 创建自定义 systemd 服务文件

systemd 服务文件通常以 .service 为后缀,存放在以下目录:

  • 系统级服务/etc/systemd/system/(推荐,优先级更高)
  • 用户级服务~/.config/systemd/user/(仅对当前用户生效)

示例:创建一个自定义服务

假设你想让 systemctl 管理一个 Python 脚本 /opt/myscript/main.py,步骤如下:

(1) 创建服务文件
bash 复制代码
sudo nano /etc/systemd/system/myscript.service
(2) 编写服务配置
ini 复制代码
[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-failurealwaysno
WantedBy 定义服务所属运行级别(如 multi-user.target

2. 让 systemd 识别并管理服务

(1) 重新加载 systemd 配置
bash 复制代码
sudo systemctl daemon-reload
(2) 启动服务
bash 复制代码
sudo systemctl start myscript
(3) 设置开机自启
bash 复制代码
sudo systemctl enable myscript
(4) 检查状态
bash 复制代码
sudo systemctl status myscript

3. 高级自定义选项

(1) 环境变量

[Service] 部分添加:

ini 复制代码
Environment="VAR1=value1"
EnvironmentFile=/path/to/env-file  # 从文件加载变量

(2) 限制资源

ini 复制代码
[Service]
MemoryLimit=500M   # 内存限制
CPUQuota=50%       # CPU 限制

(3) 定时任务(替代 cron)

使用 systemd.timer 实现定时任务:

  1. 创建服务文件(如 /etc/systemd/system/mytask.service):

    ini 复制代码
    [Unit]
    Description=My Daily Task
    
    [Service]
    Type=oneshot
    ExecStart=/path/to/script.sh
  2. 创建计时器文件(如 /etc/systemd/system/mytask.timer):

    ini 复制代码
    [Unit]
    Description=Run mytask daily
    
    [Timer]
    OnCalendar=daily      # 每天执行
    Persistent=true       # 错过时间后补执行
    
    [Install]
    WantedBy=timers.target
  3. 启用计时器:

    bash 复制代码
    sudo systemctl enable mytask.timer
    sudo systemctl start mytask.timer

4. 调试与日志

(1) 查看服务日志

bash 复制代码
journalctl -u myscript -xe  # 查看详细日志

(2) 测试命令

bash 复制代码
# 手动测试 ExecStart 命令
sudo /usr/bin/python3 /opt/myscript/main.py

# 检查依赖
systemd-analyze verify myscript.service

5. 删除自定义服务

bash 复制代码
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 的服务管理中,实现开机启动、崩溃重启、资源限制等功能。

相关推荐
chlk12317 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑17 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件18 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
BingoGo20 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack20 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端