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

相关推荐
Bruce_Liuxiaowei3 分钟前
Netstat高级分析工具:Windows与Linux双系统兼容的精准筛查利器
linux·运维·网络·windows·安全
yt948326 分钟前
C#实现CAN通讯接口
java·linux·前端
linux修理工24 分钟前
n1 armbian 安装桌面环境并启用xrdp远程登录
linux·服务器·数据库
花小璇学linux40 分钟前
imx6ull-裸机学习实验1——汇编LED灯实验
linux·汇编·imx6ull·arm裸机开发
Brookty1 小时前
【操作系统】进程(二)内存管理、通信
java·linux·服务器·网络·学习·java-ee·操作系统
易德研发1 小时前
ubuntu24.04安装NFS网络文件系统/ARM开发板NFS挂载
运维·服务器·网络
开开心心就好2 小时前
高效报价软件,简化商铺定价流程
服务器·数据库·安全·面试·职场和发展·电脑·symfony
sanggou5 小时前
Linux批量执行工具脚本使用指南:一键运行多个release-dev.sh脚本
linux·bash
段帅龙呀7 小时前
Redis构建缓存服务器
服务器·redis·缓存
乌鸦不像写字台8 小时前
【docker部署】在服务器上使用docker
服务器·docker·容器