service服务模板

Systemd Service 服务文件通用模板

以下是一个功能齐全、注释完善的 systemd 服务文件模板,适用于运行任何类型的脚本(Shell/Python/二进制文件):

[Unit]
# 服务描述
Description=My Custom Service (运行脚本服务)

# 在哪些服务之后启动(常用依赖:网络、数据库等)
After=network.target syslog.target
#After=mysql.service postgresql.service redis.service

# 明确需要的依赖(如果依赖未就绪,服务不会启动)
Requires=network.target
#Requires=mysql.service

# 冲突的服务(如果有不兼容的服务)
#Conflicts=another.service

# 服务启动条件(可选)
#ConditionPathExists=/path/to/required/file
#ConditionDirectoryNotEmpty=/path/to/required/folder

[Service]
# 服务类型
Type=simple                  # 大多数脚本适用(服务启动时直接运行ExecStart)
#Type=forking                # 后台服务适用(如daemon启动后fork自身)
#Type=oneshot                # 只运行一次的服务
#Type=notify                 # 服务准备好后会发送通知

# 运行身份(安全建议:使用非root用户)
User=root                    # 推荐:创建专用用户,如User=myappuser
Group=root                   # 用户所属组
#DynamicUser=yes             # 自动创建临时系统用户(更安全)
#WorkingDirectory=/app/path  # 设置工作目录(重要!)

# 核心命令
ExecStart=/usr/bin/bash /path/to/your_script.sh   # 主启动命令
#ExecStartPre=/bin/sleep 10   # 启动前等待(例如等待网络就绪)
#ExecStartPre=/path/to/pre-script.sh
#ExecStop=/path/to/cleanup-script.sh    # 停止服务时执行的命令
#ExecReload=/path/to/reload-script.sh   # 服务重载命令(reload指令)

# 环境变量设置
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="APP_ENV=production"
#EnvironmentFile=/etc/sysconfig/myapp   # 从文件加载环境变量

# 重启策略
Restart=on-failure          # 仅在非正常退出时重启
#Restart=always             # 总是重启(适合关键服务)
#Restart=on-abnormal        # 异常退出时重启
RestartSec=30s              # 重启间隔(避免频繁重启)

# 资源限制(防止资源耗尽)
MemoryLimit=512M            # 内存限制
#CPUQuota=80%               # CPU使用率限制
#LimitNOFILE=65535          # 最大打开文件数
#LimitNPROC=500             # 最大进程数

# 标准输出/错误处理
StandardOutput=syslog       # 输出到系统日志(默认)
StandardError=syslog        # 错误信息到系统日志
#SyslogIdentifier=myservice # 自定义日志标识(默认为服务名)
#StandardOutput=file:/var/log/myapp.log
#StandardError=file:/var/log/myapp-error.log

# 安全加固
PrivateTmp=yes              # 使用私有/tmp目录
NoNewPrivileges=yes         # 禁止进程获取新权限
#ProtectSystem=strict       # 保护系统目录(推荐)
#ProtectHome=read-only      # 保护用户目录
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE  # 仅允许绑定端口的能力

[Install]
# 安装到哪个系统目标
WantedBy=multi-user.target  # 多用户模式(常规)
#WantedBy=graphical.target  # 图形界面模式

使用指南(分步说明)

1. 创建服务文件

sudo nano /etc/systemd/system/my-custom-service.service

粘贴上述模板,根据需求修改关键部分(路径、用户、资源限制等)

2. 设置脚本权限

sudo chmod +x /path/to/your_script.sh  # 确保可执行
# 推荐:创建专用用户
sudo adduser --system --no-create-home myappuser
sudo chown myappuser:myappuser /path/to/your_script.sh

3. 重载systemd配置

sudo systemctl daemon-reload

4. 启用开机启动

sudo systemctl enable my-custom-service

5. 启动服务

sudo systemctl start my-custom-service

6. 验证服务状态

sudo systemctl status my-custom-service

7. 查看服务日志

journalctl -u my-custom-service -f  # 实时跟踪日志
journalctl -u my-custom-service -b  # 本次启动日志

关键配置解析

​配置项​​常用值​​说明​
​Type​ simple/forking 脚本类型:简单命令(simple)或后台服务(forking)
​User/Group​ myappuser/myappgroup 安全最佳实践:使用专用系统用户运行服务
​Restart​ on-failure/always 失败时重启(默认)/总是重启(关键服务)
​MemoryLimit​ 512M/1G 内存限制(防止内存泄漏导致系统崩溃)
​PrivateTmp​ yes 创建私有/tmp目录(安全隔离)
​WorkingDirectory​ /app/path ​重要​​:设置工作目录(相对路径依赖此项)
​Environment​ VAR=value 设置环境变量(如PATH/PYTHONPATH等)
​ExecStartPre​ /path/script 启动前执行(如等待网络或依赖服务就绪)

调试技巧

  1. ​手动测试命令​​:

    sudo -u myappuser /usr/bin/bash /path/to/your_script.sh
  2. ​检查环境变量​​:

    # 在ExecStart中添加
    /usr/bin/env > /tmp/service-env.log
  3. ​增加调试输出​​:

    # 在脚本顶部添加
    set -x
  4. ​测试重启策略​​:

    # 模拟失败退出
    sudo kill -9 $(pgrep -f "my_script.sh")
  5. ​查看完整日志​​:

    journalctl -u my-custom-service -o cat  # 原始输出(无格式化)

服务管理命令速查

​命令​​功能​
sudo systemctl start my-service 启动服务
sudo systemctl stop my-service 停止服务
sudo systemctl restart my-service 重启服务
sudo systemctl reload my-service 重载配置(需支持reload)
sudo systemctl enable my-service 启用开机启动
sudo systemctl disable my-service 禁用开机启动
sudo systemctl status my-service 查看服务状态
sudo journalctl -u my-service -f 实时跟踪日志
sudo systemctl daemon-reload 修改服务文件后必须执行

此模板覆盖了生产环境中90%的服务场景,遵循最小特权原则和安全最佳实践,可直接应用于实际项目。

posted @ 2025-07-23 14:04  mofy  阅读(42)  评论(0)    收藏  举报