CentOS7使用systemctl添加自定义服务
一、简介
目前我工作中常用的Linux服务器有CentOS6和CentOS7两种,当然更多的是CentOS7。对于CentOS6,我们做一些应用服务时常用的方法是在"/etc/init.d"目录下创建一个软连接的启动服务,然后用service命令来操作启停等;对于CentOS7来说这种方法也兼容适用,但是CentOS7还可以用systemd来管理。systemd是靠管理unit的方式来控制开机服务、开机级别等功能。
在"/usr/lib/systemd/system"目录下包含了各种unit文件,有service后缀的服务unit,也有target的开机级别unit等,这里主要是介绍service后缀的文件。
二、配置文件说明
以nginx的service文件来做参考说明:
1、unit区块
主要是说明启动顺序与依赖关系。
- Description字段:给出当前服务的简单描述。
- Documentation字段:给出文档位置。
- After字段:nginx.service需要在network.target等之后启动
- Before字段:定义nginx.service应该在哪些服务之前启动
[NOTE]
After和Before字段只涉及启动顺序,不涉及依赖关系。设置依赖关系需要使用Wants字段和Requires字段,Wants字段是“弱依赖”关系,即即使所依赖的服务启动失败或者停止运行,也不影响该服务;而Requires字段表示“强依赖”关系,即如果所依赖的服务启动失败或者异常退出,那么该服务也必须退出。这两个字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的,我们平时创建自定义服务时用的也比较少。
2、Service区块
主要是说明启动的行为。
-
启动命令
- ExecStart字段:定义启动进程时执行的命令
- ExecReload字段:重启服务时执行的命令
- ExecStop字段:停止服务时执行的命令
- ExecStartPre字段:启动服务之前执行的命令
- ExecStartPost字段:启动服务之后执行的命令
- ExecStopPost字段:停止服务之后执行的命令
[NOTE]
这些命令全部要求使用绝对路径!
-
启动类型
Type字段定义启动类型,可以设置的值如下,一般常用的是forking类型,即后台运行。- simple(默认值):ExecStart字段启动的进程为主进程
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行)
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
- dbus:类似于simple,但会等待 D-Bus 信号后启动
- notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
- idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
-
重启行为
Service区块中还有一些字段定义了重启的行为- KillMode字段,定义了服务如何停止,默认的是control-group,代表控制组里面的所有子进程都会被杀掉,样例里面的process,代表只杀主进程,还有一些其他的值。
- Restart字段,定义了重启的方式。
- RestartSec字段,定义了重启之前,需要等待的秒数
-
其他字段
还有一些其他的字段设置,例如常用的:- PrivateTmp字段,为True时代表创建私有的内存临时空间。
- User和Group字段,一般启动systemctl服务时都是以root用户启动进程,出于安全等因素考虑,指定一个服务用特定的用户去启动进程,就可以设置这两个字段。
3、Instal区块
这个区块定义了如何安装这个配置文件,即怎样做到开机启动,主要就是WantedBy字段,标识该服务所在的Target。"WantedBy=multi-user.target"是指nginx所在的Target是multi-user.target,在执行 systemctl enable nginx.service
命令时,nginx.service的一个符号链接就会放在"/etc/systemd/system"目录下的"multi-user.target.wants"字目录中。
[NOTE]
systemctl get-default
命令查看默认的启动Target;
systemctl list-dependencies multi-user.target
命令查看multi-user.target中的所包含的服务
三、systemctl常用的操作命令
- 重载系统服务:systemctl daemon-reload
- 设置开机启动:systemctl enable *.service
- 关闭开机启动:systemctl disable *.service
- 启动服务:systemctl start *.service
- 停止服务:systemctl stop *.service
- 重启服务:systemctl reload *.service
- 查看状态:systemctl status *.service
[NOTE]
新建或者修改了service文件之后,都需要重载系统服务,即执行systemctl daemon-reload
;
上述命令中.service后缀可以省略,例如systemctl start nginx.service
等同于systemctl start nginx
。
四、查看systemctl启动服务的日志
使用systemctl status *.service
命令查看服务状态时也会显示部分启动的过程,有些时候如果服务启动失败了,我们就需要查看具体的日志以的到报错信息来解决。
1、journalctl
使用journalctl可以查看使用systemctl启动的service,具体的参数也比较多,这里介绍两种常用的两个:
journalctl -f
,显示所有的systemctl的日志,这些日志是多个服务混合的,一般在刚启动一个服务时进行查看比较方便。journalctl -u 服务名
,显示指定服务名的日志。
2、通过系统日志进行查看
通过cat /var/log/message
查看,不过这里的日志也是多个进程混合的。