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

相关推荐
weixin_442643427 小时前
IP Guard vs Ping32:2025 年企业防泄密系统深度横评
服务器·网络·安全·数据安全
CZIDC7 小时前
关闭不必要的系统服务-服务器更流畅、更安全
服务器·git·安全
宿辞1928 小时前
LINUX中MYSQL的使用
android·linux·mysql
没有口袋啦9 小时前
《k8s 部署》常见报错类型1
linux·容器·kubernetes
爱上妖精的尾巴9 小时前
3-19 WPS JS宏调用工作表函数(JS 宏与工作表函数双剑合壁)学习笔记
服务器·前端·javascript·wps·js宏·jsa
CLOUD ACE9 小时前
谷歌云代理 | 金融合规上云:谷歌云PCI DSS认证环境搭建指南
服务器·网络·金融
巨龙之路9 小时前
什么是Ubuntu的Multipass
linux·运维·ubuntu
t198751289 小时前
使用zip命令在Ubuntu 20.04上进行文件夹压缩
linux·数据库·ubuntu
PleaseBrave9 小时前
记录:安装VMware、Ubuntu、ROS2
linux·ubuntu·vmware·ros2
等风来不如迎风去9 小时前
【ubuntu24.04】在 Ubuntu 上安装 `.deb` 包、软件
linux·运维·ubuntu