1. .service 文件
主要分为三个部分
[Unit]服务的元信息(描述、依赖关系等)。[Service]服务的运行参数与生命周期[Install]服务的安装目标(说人话:在什么情况下启动,命令行 or GUI)
1.1. 案例
[Unit]
Description=frp auto start
After=network.target
[Service]
Type=simple
#User=cococat # 对于系统级服务,谨慎指定 User !
WorkingDirectory=/home/cococat/Software/frp_0.51.2_linux_amd64
ExecStart=/home/cococat/Software/frp_0.51.2_linux_amd64/frpc -c ./frpc.ini
Restart=always
RestartSec=5
# StandardOutput=append:/home/cococat/Software/frp_1.51.2_linux_amd64/nohup.out
# StandardError=append:/home/cococat/Software/frp_1.51.2_linux_amd64/nohup.out
[Install]
WantedBy=multi-user.target
1.1.1. Unit 常用配置项
Description:略After: 编排服务的启动顺序。例如:network.target: 系统网络服务启动完成后,再启动本服务postgresql.service:pg 服务启动完成
1.1.2. Service 常用配置项
Type: 服务类型,例如:simple: 适用于保持前台运行的进程,最常用one-shot: 适用于执行一次后退出,例如脚本
User: 指定运行服务的用户WorkingDirectory: 进程的运行目录EnvironmentFile: 加载外部环境变量ExecStart: 服务进程的绝对路径 和运行参数Restart: 服务的重启策略,例如:no: 不重启always: 任何情况下退出都重启on-failure: 仅在非正常退出(如错误码、信号终止)时重启
RestartSec: 重启前等待时间,避免频繁重启
1.1.3. Install 常用配置项
WantedBy: 服务在什么情况下启动,例如:multi-user.target: 多用户命令行模式(无 GUI)graphical.target:GUI 模式
1.2. 坑
ExecStart中的可执行文件必须是绝对路径。即使通过WorkingDirectory指定了运行目录,也不可以是./xx、xx等。而其他运行的参数是可以的用./的。- 如果是一个系统级的 service,即放在
/etc/systemd/system下的服务,请谨慎指定User,如果不是必须要以用户运行的进程,最好都别制定。如果你发现你的服务无任何输出的闪退,把 User 去掉,可能就好了 - 不可以在
ExecStart中使用>将 stdout 输出重定向到文件中。如果要这么做,请使用StandardOutput或者StandardError。 >ExecStart的参数会被直接解析为命令和参数,不会经过 Shell 解释。重定向符号(如>、>>、|)会被视为普通字符,导致命令执行失败。
2. 位置
| 目录 | 作用域 | 权限 | 适用场景 | 管理命令 |
|---|---|---|---|---|
/etc/systemd/system |
系统级(全局) | 通常以 root 运行 |
系统关键服务(如 Web 服务器、数据库) | sudo systemctl ... |
/etc/systemd/user |
用户级(会话) | 以当前用户权限运行 | 用户专属服务(如开发工具、个人脚本) | systemctl --user ... |
一般来说,开机自启的命令都放在 /etc/systemd/system 。
3. 命令
# 验证 service 语法
sudo systemd-analyze verify /etc/systemd/system/my_service.service
sudo systemctl daemon-reload
sudo systemctl enable my_service
sudo systemctl start my_service
