Systemd配置介绍

docker 配置

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

unit分类:

unit的定义文件可以根据其后缀名称识别其定义的类型,可以使用systemctl -t help 查看。

.servicre定义了系统服务的启动
.target  定义了系统启动的级别标签,systemd 没有运行级别的概念,创建标签只是为了兼容老版本。
.socket 定义了进程通信用到的套接字,套接字与进程是分离的
.device 定义了系统启动时内核识别的文件,systemd提供了设备的管理功能,/dev 下的设备由/etc/udev/下的配置文件与.device共同定制
.mount 定义了系统的文件系统的挂载点
.snapshop 系统快照
.swap 用于标识swap设备
.automount 文件系统的自动挂载点
.path用于定义文件系统中的一个文件或目录使用。常用于文件系统发生变化时,延迟激活服务。

配置介绍

Unit 描述信息

启动顺序与依赖关系

Description:    #当前服务的简单描述
Documentation:  #给出文档位置
Before:         #在指定的程序之前启动
After:          #在指定的程序之后启动
Wants:          #表示本程序与指定的程序之间存在”弱依赖”关系,即如果指定程序启动失败或停止运行,不影响本程序继续执行
Requires:       #表示”强依赖”关系,即如果指定服务启动失败或异常退出,那么本服务也必须退出。
BindsTo: 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
Condition...:当前 Unit 运行必须满足的条件,否则不会运行
Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
AllowIsolate:允许使用systemctl isolate命令切换到multi-user.target。

注意,After和Before字段只涉及启动顺序,不涉及依赖关系。
注意,Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。

Service 启动信息

启动行为
Service区块定义如何启动当前服务
只有 Service 类型的 Unit 才有这个区块,定义如何启动当前服务

Environment:指定当前服务的环境变量
EnvironmentFile:指定当前服务的环境参数文件,该文件的key=value键值对,可以用$key的形式,在当前配置文件中获取所有的启动设置都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd,表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。

Type=  #启动类型。
    1. simple:默认值,执行ExecStart指定的命令,启动主进程
    2. forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出,子进程将成为主进程
    3. oneshot:一次性进程,类似于simple,但只执行一次,Systemd 会等当前服务退出,再继续往下执行
    4. dbus:当前服务通过D-Bus启动,类似于simple,但会等待 D-Bus 信号后启动
    5. notify:当前服务启动完毕,会发出通知信号通知Systemd,然后 Systemd 再继续启动其他服务
    6. idle:类似于simple,但是要等到其他任务都执行完毕,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
    
ExecStart=  #定义启动进程时执行的命令。后面跟程序的绝对路径,如果有启动参数,后面加上,如果程序没有参数不需要添加ExecStop这条语句
ExecStartPre= #启动服务之前执行的命令
ExecStartPost= #启动服务之后执行的命令
ExecStopPost= #停止服务之后执行的命令
ExecStop=    #后面跟程序的绝对路径,如果有停止参数,后面加上
ExecStopPost:停止当其服务之后执行的命令
ExecReload:重启当前服务时执行的命令
RemainAfterExit=yes     #通知systemctl结束
User:指定开机自动运行该程序的用户名
Group:指定开机自动运行该程序的用户组
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
Restart= 
    #always:不管是什么退出原因,总是重启
    #no(默认值):退出后不会重启
    #on-success:只有正常退出时(退出状态码为0),才会重启
    #on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
    #on-abnormal:只有被信号终止和超时,才会重启
    #on-abort:只有在收到没有捕捉到的信号终止时,才会重启
    #on-watchdog:超时退出,才会重启
    #对于守护进程,推荐设为on-failure。
    #对于那些允许发生错误退出的服务,可以设为on-abnormal。
PIDFile:指定开机自动运行该程序的pid文件(一般在程序配置文件中配置该项)
RestartSec=  #表示 Systemd 重启服务之前,需要等待的秒数。
RemainAfterExit:值为yes或no,表示进程退出以后,服务仍然保持执行。这样的话,一旦使 
    用systemctl stop命令停止服务,ExecStop指定的命令就会执行
KillMode=    
    #定义 Systemd 如何停止 sshd 服务。
    #control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
    #process:只杀主进程
    #mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
    #none:没有进程会被杀掉,只是执行服务的 stop 命令。

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

install 安装信息

定义如何安装这个配置文件,即怎样做到开机启动。

WantedBy: 表示该服务所在的 Target。 WantedBy=multi-user.target(单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。)
    1. Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。
    2. 这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
    3. Systemd 有默认的启动 Target。 systemctl get-default
    4. 一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。
RequiredBy: 它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名
Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

重新加载配置文件

$ sudo systemctl daemon-reload

重启相关服务

$ sudo systemctl restart foobar

开机启动

$ sudo systemctl enable nginx
上面的命令相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system里面的httpd.service文件。
这是因为开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。

systemctl enable httpd.service命令等同于 ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'。与之对应的,撤销开机启动命令systemctl disable命令实际上就是在两个目录之间撤销符号链接关系。

列出所有配置文件

systemctl list-unit-files

列出指定类型的配置文件

systemctl list-unit-files --type=service
命令会输出一个列表,显示每个配置文件的启动链接状态,一共有四种。

enabled:已建立启动链接
disabled:没建立启动链接
static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
masked:该配置文件被禁止建立启动链接

查看一下该服务的状态

$ sudo systemctl status httpd

httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since 金 2014-12-05 12:18:22 JST; 7min ago
 Main PID: 4349 (httpd)
   Status: "Total requests: 1; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─4349 /usr/sbin/httpd -DFOREGROUND
           ├─4350 /usr/sbin/httpd -DFOREGROUND
           ├─4351 /usr/sbin/httpd -DFOREGROUND
           ├─4352 /usr/sbin/httpd -DFOREGROUND
           ├─4353 /usr/sbin/httpd -DFOREGROUND
           └─4354 /usr/sbin/httpd -DFOREGROUND

12月 05 12:18:22 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
12月 05 12:18:22 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
12月 05 12:22:40 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
1. Loaded行:配置文件的位置,是否设为开机启动
2. Active行:表示正在运行
3. Main PID行:主进程ID
4. Status行:由应用本身(这里是 httpd )提供的软件当前状态
5. CGroup块:应用的所有子进程
6. 日志块:应用的日志

查看 multi-user.target 包含的所有服务

$ systemctl list-dependencies multi-user.target

切换到另一个 target,shutdown.target 就是关机状态

$ sudo systemctl isolate shutdown.target

启动服务

$ sudo systemctl start nginx.service

查看日志

$ sudo journalctl -f -u nginx.service
— Logs begin at 四 2015-06-25 17:32:20 CST. —
6月 25 10:28:24 Leco.lan systemd[1]: Starting nginx – high performance web server…
6月 25 10:28:24 Leco.lan nginx[7976]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
6月 25 10:28:24 Leco.lan nginx[7976]: nginx: configuration file /etc/nginx/nginx.conf test is successful
6月 25 10:28:24 Leco.lan systemd[1]: Started nginx – high performance web server.

重启

$ sudo systemctl restart nginx.service

重载

$ sudo systemctl reload nginx.service

停止

$ sudo systemctl stop nginx.service

杀进程

sudo systemctl kill nginx.service

查看配置文件

$ systemctl cat nginx.service

posted @ 2020-07-24 14:50  白云辉  阅读(959)  评论(0)    收藏  举报