为了方便维护和管理,我们有时候需要自定义 linux 的 systemd 服务,并设置为开机自启动,本文档介绍如何自定义和配置 systemd 服务
我们在 /etc/systemd/system/下定义.service 文件即可
参数说明
[Unit] 区块参数
| 参数名 | 示例值 | 含义说明 |
|---|---|---|
| Description | Description=Odoo ERP | 简要描述服务内容。 |
| Documentation | Documentation=https://www.odoo.com/documentation | 提供相关文档链接。 |
| After | After=network.target | 当前服务需在指定服务启动后再启动。 |
| Requires | Requires=network.service | 硬性依赖,若指定服务失败,本服务也会失败。 |
| Wants | Wants=mysql.service | 弱依赖,指定服务失败不会影响本服务启动。 |
| Before | Before=nginx.service | 当前服务应在某服务之前启动。 |
[Service] 区块参数
| 参数名 | 示例值 | 含义说明 |
|---|---|---|
| Type | Type=simple | 启动类型,simple 表示直接启动,不等待通知。 |
| User | User=odoo | 指定以哪个用户身份运行服务。 |
| Group | Group=odoo | 指定以哪个用户组身份运行服务。 |
| ExecStart | ExecStart=/opt/odoo/python_env/... | 启动服务时执行的命令。 |
| ExecStop | ExecStop=/bin/kill $MAINPID | 停止服务时执行的命令。 |
| Restart | Restart=always | 异常退出后自动重启服务。 |
| RestartSec | RestartSec=5 | 设置重启前的延迟秒数。 |
| WorkingDirectory | WorkingDirectory=/opt/odoo/odoo17/ | 指定服务运行时的工作目录。 |
| Environment | Environment="ENV=production" | 添加环境变量。多个变量可写多行。 |
| StandardOutput | StandardOutput=journal | 指定标准输出位置。 |
| StandardError | StandardError=journal | 指定标准错误输出位置。 |
[Install] 区块参数
| 参数名 | 示例值 | 含义说明 |
|---|---|---|
| WantedBy | WantedBy=multi-user.target | 设置服务在哪个目标级别下启用,开机自启需此项。 |
| Alias | Alias=odoo.service | 设置服务的别名。 |
| Also | Also=nginx.service | 启用/禁用时一并处理的服务名。 |
示例
在/etc/systemd/system/ 目录下创建一个 odoo17 服务文件
sudo vi /etc/systemd/system/odoo17.service
内容如下
[Unit]
Description=Odoo ERP
Documentation=https://www.odoo.com/documentation
After=network.target
[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/opt/odoo/python_env/odoo17_env/bin/python3 /opt/odoo/odoo17_xm/odoo17/odoo-bin -c /etc/odoo/odoo17.conf
Restart=always
[Install]
WantedBy=multi-user.target
重新加载 systemd 配置
sudo systemctl daemon-reload
设置开机自启动
sudo systemctl enable odoo17
启动服务
sudo systemctl start odoo17
查看服务状态
sudo systemctl status odoo17
常用指令汇总
操作 | 指令 |
|---|---|
| 启动服务 | sudo systemctl start odoo17 |
| 停止服务 | sudo systemctl stop odoo17 |
| 重启服务 | sudo systemctl restart odoo17 |
| 查看服务状态 | sudo systemctl status odoo17 |
| 设置开机自启动 | sudo systemctl enable odoo17 |
| 取消开机自启动 | sudo systemctl disable odoo17 |
| 查看是否自启动 | sudo systemctl is-enabled odoo17 |
| 重新加载配置 | sudo systemctl daemon-reload |
注意事项
- ExecStart 要使用 Python 虚拟环境中的解释器路径,确保依赖加载正确;
- 日志可以通过 journalctl -u odoo17 -f 实时查看;
- 服务名必须以 .service 结尾且位于 /etc/systemd/system/ 才能被系统识别;
- Restart=always 表示服务异常退出时自动重启;
- 如果修改了 .service 文件,务必执行一次 daemon-reload。