概述
- 背景说明:常用的开启自启动除了通过
rc.local
的方式,还可以通过*.service
的方式达到我们想要的效果。 - 问题阐述:如何通过
*.service
的方式达到开机自启的效果?
具体实现
1. .service文件位置
- 系统级服务:
/etc/systemd/system
。 - 软件包自带服务:
/usr/lib/systemd/system
。
2. 基本文件结构
[Unit]
Description=服务描述
After=依赖的其他服务.taget[Service]
Type=服务类型
ExecStart=启动命令
User=运行用户
Restart=重启策略[Install]
WanteBy=目标.target
[Unit]部分 | [Service]部分 | [Install]部分 |
---|---|---|
Description:服务器描述(必填) | Type(必填): 1. simple:默认类型,主进程由systemd启动。 2. foking:后台守护进程(指定 PIDFile= )。3. oneshot:单次执行(如初始化脚本)。 4. ontify:服务就绪后发送通知。 | WantedBy:指定服务所属Target(如multi-user.taget ) |
After:定义启动顺序(如network.target ) | User/Group:运行身份(避免使用root!) | |
Requires:强依赖服务(依赖失败则本服务失败) | ExecStart(必填): 绝对路径启动命令(如 /usr/bin/python3 /app/main.py ) | |
Wants:弱依赖服务(依赖失败不影响本服务) | ExecStop:自定义停止命令 | |
Restart: 1. on-failure:非正常退出时重启。 2. always:总是重启。 3. no:不重启 | ||
RestartSec:重启等待时间(如5S ) | ||
Environment:环境变量(如Environment="PORT=8080" ) | ||
WorkingDirectory:工作目录路径 |
3. 案例
[Unit]
Description=My Python Web App
After=network.target postgresql.service[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
Environment="DB_HOST=localhost"
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog[Install]
WantedBy=multi-user.target
4. 启动服务
# 1. 创建服务文件
sudo nano /etc/systemd/system/myapp.service# 2. 重载systemd配置
sudo systemctl daemon-reload# 3. 启动服务
sudo systemctl start myapp# 4. 设置开机自启
sudo systemctl enable myapp# 5. 检查状态
sudo systemctl status myapp
5. 调试技巧
- 日志查看:
journalctl -u myapp.service -f # 实时日志
- 验证文件语法:
systemd-analyze verify /etc/systemd/system/myapp.service