贡献者: addis
/etc/systemd/system/名字.service
:
[Unit]
Description=服务的描述(允许空格)
[Service]
ExecStart=/路径/命令 参数1 参数2
# 等 15 秒再运行以上命令,防止系统没有加载完成(如网络设置等)
ExecStartPre=/bin/sleep 15
[Install]
WantedBy=multi-user.target
ExecStart
不支持 >
和 |
等
sudo systemctl daemon-reload
使 service 文件生效
sudo systemctl enable 名字.service
就可以设置开机自启服务(通过创建一个 symlink)。.service
可以省略
systemctl disable
不开机自启
systemctl status
查看状态和日志的最新几行(-n 50
可以指定显示多少行,-l
可以显示完整的行而不是截断)
systemctl start
启动
systemctl stop
停止
systemctl restart
重启
ps aux | grep 名字
查看是否在运行
[Unit]
Description=服务的描述(允许空格)
Documentation=文档的url
After=在哪些服务运行后运行(如果它们没运行也没关系)
Before=在哪些服务之前运行(如果它们没运行也没关系)
Wants=在运行之前试图运行的另一个服务(如果失败也没关系)
Requires=在运行之前试图运行的另一个服务(如果失败就不运行)
[Service]
ExecStart=/路径/启动命令 参数1 参数2
ExecStop=/路径/停止命令 参数1 参数2
WorkingDirectory=/当前路径/
ExecStartPre=/路径/命令 参数1 参数2
Restart=always, on-failure, on-abnormal, on-watchdog, on-abort, no.
Type=simple(默认)|forking|oneshot|dbus, notify and idle.
User=运行服务的用户(默认 root)
Group=运行服务的组(默认 root)
Environment=环境变量
EnvironmentFile=环境变量文件
[Install]
WantedBy=在这个 target 启动该 service,失败也没关系
RequiredBy=失败有关系
hello.sh
,内容是 while true; do echo hello; sleep 3; done
。那么应该设置 ExecStop=/bin/kill $MAINPID
,其中 MAINPID
是 systemd 的一个变量,即当前服务进程的 PID。
Type=simple
意思是 ExecStart
命令的进程就是服务进程。该命令一旦运行就算是服务正在运行。
Restart=always
意思是只要服务进程终止了(无论什么原因),就立刻重新开始运行。
Restart=on-failure
意思是只有 exit code 不为 0 或者被 signal 终止才 restart。正常执行完毕(exit code 0)不重启。
WantedBy=multi-user.target
意思是启动后到了 multi-user.target
阶段才开始运行。后者大概就是支持多用户登陆,但在 GUI 出现之前,经常使用。
stdout
和 stderr
,那么可以用 systemctl status 服务
查看最后的一点 log,如果要看更多就用 sudo journalctl -u 服务.service [-n 50]
后面的 -n
可以指定看最后多少行。