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

相关推荐
码云数智-大飞26 分钟前
PHP 接口开发规范:统一返回格式、异常处理与参数校验
开发语言·php
骑上单车去旅行38 分钟前
MD5校验对比脚本
linux·服务器·windows
平生幻1 小时前
Linux 常用命令
linux
ShirleyWang0122 小时前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
liuccn2 小时前
Linux 存储系统:LVM 与直接分区
linux·运维
捷配链2 小时前
六层服务器板行业材料与工艺标准化选型指南
服务器·制造·pcb
微学AI4 小时前
内网穿透的应用-把飞牛NAS变成家庭录像中心:EasyNVR部署与远程回放实战
开发语言·php
峥嵘life4 小时前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
weixin_BYSJ19874 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
xexpertS4 小时前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维