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

相关推荐
一叶知秋yyds1 天前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
专吃海绵宝宝菠萝屋的派大星1 天前
使用Dify对接自己开发的mcp
java·服务器·前端
大数据新鸟1 天前
操作系统之虚拟内存
java·服务器·网络
楠奕1 天前
CentOS7安装GoldenDB单机搭建及常见报错解决方案
linux·运维·服务器
GCTTTTTT1 天前
远程服务器走本地代理
运维·服务器
剑锋所指,所向披靡!1 天前
Linux常用指令(2)
linux·运维·服务器
做咩啊~1 天前
6.增加一个flat网段
服务器·openstack
不愿透露姓名的大鹏1 天前
Oracle归档日志爆满急救指南
linux·数据库·oracle·dba
W.W.H.1 天前
嵌入式常见的面试题1
linux·网络·经验分享·网络协议·tcp/ip