一、简介

目前我工作中常用的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文件来做参考说明:

centos服务器如何全局修改_重启

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查看,不过这里的日志也是多个进程混合的。