在/usr/lib/systemd目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,
服务又分为系统服务(system)和用户服务(user)。
系统服务:开机不登陆就能运行的程序(常用于开机自启)在/usr/lib/systemd/system目录下
用户服务:需要登陆以后才能运行的程序。

查看配置文件

systemctl cat nginx.service

配置文件详解

[Unit]

After

 表示服务需要在***服务之后执行

Before

表示服务需要在***服务之前执行

Wants

弱依赖关系

Requires

强依赖关系  ***服务停止之后本服务也必须停止

                    

 

[Service] 

EnvironmentFile

环境参数

ExecStart

程序进程执行时的命令

ExecReload

重启服务时执行的命令

ExecStop

停止服务时执行的命令

ExecStartPre

启动服务之前执行的命令

ExecStartPost

启动服务之后执行的命令

ExecStopPost

停止服务之后执行的命令

 

 

   所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误

 

Type段

 simple(默认)

  ExecStart字段启动的进程为主进程  

  forking    

  ExecStart以fork()方式进行启动,此时父进程将会推出,子进程将成为主进程 

  oneshot

  类似于simple,但只执行一次,Systemd会等它执行完,才启动其他服务

  dbus

  类似于simple,但会等待D-Bus信号后启动

  notify

  类似于simple,启动结束后会发出通知信号,然后Systemd再启动其他服务

  dle

  类似于simple,但是要等到其他任务都执行完,才会启动该服务。

    

 

KillMode字段

control-group(默认)

当前控制组里面的所有子进程,都会被杀掉

porcess

 只杀主进程

mixed

主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号

none

没有进程会被杀掉,只是执行服务的 stop 命令

 

 

Restart字段

no(默认值)

退出后不会重启

on-success

只有正常退出时(退出状态码为0),才会重启

on-failure

非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启

on-abnormal

只有被信号终止和超时,才会重启

on-abort

只有在收到没有捕捉到的信号终止时,才会重启  

on-watchdog

超时退出才会重启

 

 

[Install]

Install区块,定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy字段:表示该服务所在的 Target。
常用的 Target 有两个:
multi-user.target:表示多用户命令行状态
graphical.target:表示图形用户状态

示例 docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/usr/bin/dockerd-current \
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --init-path=/usr/libexec/docker/docker-init-current \
          --seccomp-profile=/etc/docker/seccomp.json \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY \
      $REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process

[Install]
WantedBy=multi-user.target