编写 Systemctl 自启动服务
介绍
Centos7 以上使用Systemd进行系统初始化,Systemd是Linux系统中最新的初始化工具,它可以有效的提高系统的启动速度。
Systemd 默认从目录/etc/systemd/system/读取配置文件。然而,里面存放的大部分文件都是符号链接,它们指向目录/usr/lib/systemd/system/,真正的配置文件(以 .service 结尾的文件)存放在那个目录。
我们可以将自定义程序注册为systemd service进程管理交给系统管理,可以方便启动停止,也可以实现服务异常退出重启,开机自启动,减少自定义程序服务管理的时间消耗。
配置与命令
service文件主要包含三个部分,分别是:[Unit]、[Service]、[Install]
Unit
- Description: 一段描述这个
Unit 文件的文字,通常只是简短的一句话。
- Documentation: 指定服务的文档,可以是一个或多个文档的URL路径。
- Requires: 依赖的其他
Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止
- After: 与
Requires 相似,但会在后面列出的所有模块全部启动完成以后,才会启动当前的服务。
- Before: 与
After 相反,在启动指定的任一个模块之前,都会首先确保当前服务已经运行。
- Wants: 与
Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。
- Conflicts: 与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然。
- OnFailure: 当这个模块启动失败时,就自动启动列出的每个模块。
Service
- Type: 服务的类型,常用的有
simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。
- Environment: 为服务添加环境变量
- EnvironmentFile: 指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义。
- ExecStart: 这个参数是几乎每个
.service 文件都会有的,指定服务启动的主要命令,在每个配置文件中只能使用一次。(需要使用绝对路径)
- ExecStartPre: 指定在启动执行
ExecStart 的命令前的准备工作,可以有多个,所有命令会按照文件中书写的顺序依次被执行。
- ExecStartPost: 指定在启动执行
ExecStart 的命令后的收尾工作,也可以有多个。
- ExecStop: 停止服务所需要执行的主要命令。(需要使用绝对路径)
- ExecStopPost: 指定在 ExecStop 命令执行后的收尾工作,也可以有多个。
- ExecReload: 重新加载服务所需执行的主要命令。(需要使用绝对路径)
- Restart: 这个值用于指定在什么情况下需要重启服务进程。常用的值有 no,on-success,on-failure,on-abnormal,on-abort 和 always。默认值为 no,即不会自动重启服务。这些不同的值分别表示了在哪些情况下,服务会被重新启动
- RestartSec: 如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。
- Nice: 服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。
- WorkingDirectory: 指定服务的工作目录。
- RootDirectory: 指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。
- User: 指定运行服务的用户,会影响服务对本地文件系统的访问权限。
- Group: 指定运行服务的用户组,会影响服务对本地文件系统的访问权限。
- PrivateTmp: 是否给服务分配独立的临时空间(
true/false)
Install
- WantedBy: 和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。
WantedBy=multi-user.target 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效。
- RequiredBy: 和前面的
Requires 作用相似,同样后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。
- Also: 当这个服务被
enable/disable 时,将自动 enable/disable 后面列出的每个模块。
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
想了解更详细的参数说明可以在systemd.service 中文手册中查看
常用命令
以nginx.service为例
1# 启动nginx服务
2systemctl start nginx.service
3# 停止nginx服务
4systemctl stop nginx.service
5# 重启nginx服务
6systemctl restart nginx.service
7# 查看nginx服务状态
8systemctl status nginx.service
9# 在开机时启用一个服务
10systemctl enable nginx.service
11# 在开机时禁用一个服务
12systemctl disable nginx.service
13# 查看服务是否开机启动
14systemctl is-enabled nginx.service
15# 重新读取nginx配置(不用停止nginx服务就能使修改的配置生效)
16systemctl reload nginx.service
17# 重新加载systemd(一般修改完配置文件执行该命令使配置生效)
18systemctl daemon-reload
19# 查看已启动的服务列表
20systemctl list-unit-files | grep enabled
21# 查看启动失败的服务列表
22systemctl --failed
其中,systemctl enable命令用于/etc/systemd/system/和/usr/lib/systemd/system/两个目录之间,建立符号链接关系。
1systemctl enable nginx.service
等同于
1ln -s '/usr/lib/systemd/system/nginx.service' '/etc/systemd/system/multi-user.target.wants/nginx.service'
systemd 默认从目录/etc/systemd/system/读取配置文件,所以systemctl enable命令相当于激活开机启动。
同理,systemctl disable用于撤销两个目录之间的符号链接关系,也就撤销了开机启动。