systemd

前言

在centos5、centos6中,linux的启动一直采用init进程来进行管理。从centos7开始,放弃了采用init进程,从而使用systemd来代替init进程。
对于init进程来说有两个缺点:

一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

systemd定义

为了解决init的问题,systemd被诞生出来,为系统的启动和管理提供一整套解决方案。systemd在诞生之时也受到了众多人的异议。由于它过于庞大、复杂,导致背离了unix一切从简的原则。但不可否认它的功能强大,使用方便。
systemd是Linux系统的一套基本构建块。它提供了一个系统和服务管理器,它以PID 1的形式运行并启动系统的其余部分。

systemd新特性

1、系统引导时实现服务并行启动

systemd 提供了比 upstart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。一个显而易见的结果就是:更快的启动速度。为了减少系统启动时间,systemd 的目标是:

尽可能启动更少的进程
尽可能将更多进程并行启动

2、按需激活进程

sysvinit系统在初始之前,会将有所有可能启动的后台服务进程全部启动。并且系统在等待这些进程全部运行完之后才会让用户进行登录。这样就导致了时间以及资源的浪费。
systemd则采用按需启动的方式,只有当你真正请求启动某些服务时才会启动。而且服务在运行结束之后,systemd可以关闭它,等下次请求时再次启动

3、系统状态快照

systemd可以临时保存当前所有的单元配置文件,或者从前一个快照中恢复单元配置文件。为了保存当前系统服务状态,systemd可以动态的生成单元文件快照。

4、基础依赖关系定义服务控制逻辑

系统启动过程是由很多的独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个 NFS 文件系统必须依赖网络能够正常工作。Systemd 虽然能够最大限度地并发执行很多有依赖关系的工作,但是类似"挂载 NFS"和"启动网络"这样的工作还是存在天生的先后依赖关系,无法并发执行。对于这些任务,systemd 维护一个"事务一致性"的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况。

unit(单元)

unit配置文件

systemd管理着许多的资源,可以认为每一个资源就是unit(单元)unit由其相关的配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其他与init相关的信息。这些配置文件主要保存在

①/etc/systemd/system  存放系统启动的默认级别及启动的unit的软连接,优先级最高。

②/run/systemd/system,系统执行过程中产生的服务脚本,优先级次之。

③/usr/lib/systemd/system 存放系统上所有的启动文件。优先级最低

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。

unit常见类型

类型解释
service unit文件扩展名为.service ,用于定义系统服务
target unit文件扩展名为.target ,用于模拟实现"运行级别"
device unit文件扩展名为.device ,用于定义内核识别的设备
mount unit文件扩展名为.mount ,定义文件系统挂载点
sokect unit文件扩展名为.socket ,用于标识进程间通信用到的socket文件
snapshot unit文件扩展名为.snapshot ,用于实现管理系统快照
swap unit文件扩展名为.swap ,用于标识swap设备
automount unit文件扩展名为.automount ,文件系统自动挂载点设备
path unit文件扩展名为.path ,用于定义文件系统中的文件和目录

管控unit单元

启动、停止、重启等服务(service类型)

#启动httpd服务
[root@bogon ~]# systemctl start httpd.service

#停止httpd服务
[root@bogon ~]# systemctl stop httpd.service

#重启httpd服务
[root@bogon ~]# systemctl restart httpd.service

#条件式重启httpd服务(只会在服务运行的时候才会重启服务)
[root@bogon ~]# systemctl try-restart httpd.service

#重新加载httpd服务的配置文件
[root@bogon ~]# systemctl reload httpd.service

查看unit的状态

[root@bogon ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 四 2019-04-18 22:09:06 CST; 1min 30s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 8147 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 8136 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─8136 /usr/sbin/httpd -DFOREGROUND
           ├─8149 /usr/sbin/httpd -DFOREGROUND
           ├─8150 /usr/sbin/httpd -DFOREGROUND
           ├─8151 /usr/sbin/httpd -DFOREGROUND
           ├─8152 /usr/sbin/httpd -DFOREGROUND
           └─8153 /usr/sbin/httpd -DFOREGROUND

4月 18 22:09:06 bogon systemd[1]: Starting The Apache HTTP Server...
4月 18 22:09:06 bogon systemd[1]: Started The Apache HTTP Server.
4月 18 22:09:22 bogon systemd[1]: Reloading The Apache HTTP Server.
4月 18 22:09:22 bogon systemd[1]: Reloaded The Apache HTTP Server.

上边active行时某服务的运行的状态,由以下几种:

状态解释
active(running)正在运行
active(exited)服务执行一次退出,不在执行其它程序
active(waitting)等待运行的服务,在其它程序执行结束后可以运行
active(dead)未启动状态
#查看某服务当前激活与否的状态
[root@bogon ~]# systemctl is-active httpd.service
active

#查看所有已激活服务的状态
[root@bogon ~]# systemctl list-units --type service

#查看所有服务的状态
[root@bogon ~]# systemctl list-units --type service -all

#查看服务的依赖关系
[root@bogon ~]# systemctl list-dependencies httpd.service

查看、设置服务开机状态

#设置httpd服务开机启动
[root@bogon ~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

#禁止httpd服务开机启动
[root@bogon ~]# systemctl disable httpd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

#查看httpd服务能否开机启动
[root@bogon ~]# systemctl is-enabled httpd.service
disabled

#禁止httpd服务设定为开机启动
[root@bogon ~]# systemctl mask httpd.service
Created symlink from /etc/systemd/system/httpd.service to /dev/null.

#取消禁止httpd服务开机启动
[root@bogon ~]# systemctl unmask httpd.service
Removed symlink /etc/systemd/system/httpd.service.

管理target unit

target主要用来管理centos7上的运行级别,有许多个target unit来组成。与sysvinit的runlevel功能很相似。runlevel和target的对应关系如下:

SysVRunleveltaget解释
0RunLevel0.tagert , poweroff.target关机
1RunLevel1.tagert , rescue.target单用户模式
2RunLevel2.tagert ,multi-user.target用户定义/特定于站点的运行级别。默认情况下,与3相同。
3RunLevel3.tagert ,multi-user.target多用户模式,文本模式
5RunLevel5.tagert ,graphical.target多用户模式,图形模式
6RunLevel6.tagert ,reboot.target重启

它与init进程的主要差别如下。

(1)默认的 RunLevel(在/etc/inittab文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。

(2)启动脚本的位置,以前是/etc/init.d目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d、/etc/rc5.d等),现在则存放在/lib/systemd/system和/etc/systemd/system目录。

(3)配置文件的位置,以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。

管理运行级别命令


#级别间切换
[root@bogon ~]# systemctl isolate runlevel3.target

#查看级别
[root@bogon ~]# systemctl list-units --type target

#查看当前运行level
[root@bogon ~]# who -r
         运行级别 3 2019-04-19 10:39

#查看所有运行级别
[root@bogon ~]# systemctl list-units --type target -all

#获取默认运行级别
[root@bogon ~]# systemctl get-default
multi-user.target

#设定默认运行级别
[root@bogon ~]# systemctl set-default graphical.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.

#切换至紧急救援模式
[root@bogon ~]# systemctl rescue

#切换至emergency模式
[root@bogon ~]# systemctl emergency

unit文件配置信息(service类型)

使用vim打开查看/usr/lib/systemd/system/httpd.service的信息。

[root@bogon ~]# vim /usr/lib/systemd/system/httpd.service 
  1 [Unit]
  2 Description=The Apache HTTP Server
  3 After=network.target remote-fs.target nss-lookup.target
  4 Documentation=man:httpd(8)
  5 Documentation=man:apachectl(8)
  6 
  7 [Service]
  8 Type=notify
  9 EnvironmentFile=/etc/sysconfig/httpd
 10 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
 11 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
 12 ExecStop=/bin/kill -WINCH ${MAINPID}
 13 # We want systemd to give httpd some time to finish gracefully, but still want
 14 # it to kill httpd after TimeoutStopSec if something went wrong during the
 15 # graceful stop. Normally, Systemd sends SIGTERM signal right after the
 16 # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
 17 # httpd time to finish.
 18 KillSignal=SIGCONT
 19 PrivateTmp=true
 20 
 21 [Install]
 22 WantedBy=multi-user.target

service unit信息组成

service类型的unit通常由以下三个字段组成:
[unit]:定义与unit类型无关的通用选项;用于提供unit类型的描述信息、unit行为以及依赖关系。

unit常用选项:
Description:描述信息,意义性描述

After:定义unit的启动顺序。表示当前unit应该晚于哪些unit启动;其功能与before相反

Requies:依赖到的其它的unit,强依赖,如果被依赖的unit无法启动时,那么该unit无法激活

Wants:依赖到的其它的unit,弱依赖,如果被依赖的unit无法启动时,那么该unit也会正常激活

Conflicts:定义units间的冲突关系

[service]:定义与特定类型相关的专用选项,只有service类型的unit才有这个字段

service字段的常用选项:
Type:用于定义影响ExecStart及相关参数的额功能的unit进程启动类型;具有以下几个值:

Type=simple:默认值,执行Execstart指定的命令,	启动主进程。

Type=forking:以fork方式从父进程创建子进程,父进程在创建后立即退出

Type=oneshot:一次性进程,systemd会等当前服务退出后,在进行往下执行

Type=dbus:当前服务通过d-bus启动

Type=notify:当前服务启动完毕,会告知systemd,继续往下执行

Type=idle:若有其它服务执行完毕,当前服务才会执行

ExecStart:启动当前服务的命令

ExecStartPre:启动当前服务之前执行的命令

ExecStartPost:启动当前服务之后执行的命令

ExecReload:重启当前服务时执行的命令

ExecStop:停止当前服务时执行的命令

ExecStopPost:停止当前服务之后执行的命令

RestartSec:自定义当前服务重启间隔的秒数

Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

TimeoutSec:定义systemd停止当前服务等待的秒数

Environment:指定环境变量

[Install]:通常是配置文件里的最后一个,主要用来定义如何启动以及是否开机自动启动,如下:

WantedBy:它的值是一个或多个Target,当前unit激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中

RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中

Alias:当前 Unit 可用于启动的别名

Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

注意:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件

  # systemctl daemon-reload  

日志管理

systemd管理一切日志,用journalctl命令可以查看所有日志。日志的配置文件在/etc/journalctl.conf中

#查看所有日志(默认情况只保留本次启动的日志)
[root@bogon ~]# journalctl

#查看内核日志(不包含应用日志)
[root@bogon ~]# journalctl -k

# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1

# 查看指定时间的日志
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

# 显示尾部的最新10行日志
$ sudo journalctl -n

# 显示尾部指定行数的日志
$ sudo journalctl -n 20

# 实时滚动显示最新日志
$ sudo journalctl -f

# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

# 查看指定进程的日志
$ sudo journalctl _PID=1

# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b

# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager

# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json

# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

信号

当我们去重启、停止一个进程时,并不是真正的对进程进行处理。而是要对进程发出一个信号,来告知进程我们需要对其进行什么样的处理。
查看信号的命令:

[root@bogon ~]# trap -l 

[root@bogon ~]# kill -l

[root@bogon ~]# man 7 signal

常见进程信号:

进程信号信号名称解释
1SIGHUP该信号让进程立即关闭.然后重新读取配置文件之后重启
2SIGINT程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键
3SIGQUIT与SIGINT类似,但由QUIT字符(通常是Ctrl+\)来控制。进程因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号
8SIGFPE在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误
9SIGKILL用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程
14SIGALRM时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号
15SIGTERM正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9
18SIGCONT该信号可以让暂停的进程恢复执行。本信号不能被阻断
19SIGSTOP该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值