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 | 启动前执行(如等待网络或依赖服务就绪) |
调试技巧
-
手动测试命令:
sudo -u myappuser /usr/bin/bash /path/to/your_script.sh
-
检查环境变量:
# 在ExecStart中添加 /usr/bin/env > /tmp/service-env.log
-
增加调试输出:
# 在脚本顶部添加 set -x
-
测试重启策略:
# 模拟失败退出 sudo kill -9 $(pgrep -f "my_script.sh")
-
查看完整日志:
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%的服务场景,遵循最小特权原则和安全最佳实践,可直接应用于实际项目。