CentOS7的服务管理方式

在centos5、centos6中,linux的启动一直采用init进程来进行管理。从centos7开始,放弃了采用init进程,从而使用systemd来代替init进程。

对于init进程来说有两个缺点:

一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。

二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

为了解决init的问题,systemd被诞生出来,为系统的启动和管理提供一整套解决方案。systemd在诞生之时也受到了众多人的异议。

由于它过于庞大、复杂,导致背离了unix一切从简的原则。但不可否认它的功能强大,使用方便。

systemd是Linux系统的一套基本构建块。它提供了一个系统和服务管理器,它以PID 1的形式运行并启动系统的其余部分。

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

systemd 提供了比 upstart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。

一个显而易见的结果就是:更快的启动速度。为了减少系统启动时间,systemd 的目标是:

尽可能启动更少的进程。

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

2. 按需激活进程

sysvinit系统在初始之前,会将有所有可能启动的后台服务进程全部启动。并且系统在等待这些进程全部运行完之后才会让用户进行登录。这样就导致了时间以及资源的浪费。

systemd则采用按需启动的方式,只有当你真正请求启动某些服务时才会启动。而且服务在运行结束之后,systemd可以关闭它,等下次请求时再次启动。

3. 系统状态快照

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

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

系统启动过程是由很多的独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个 NFS 文件系统必须依赖网络能够正常工作。

Systemd 虽然能够最大限度地并发执行很多有依赖关系的工作,但是类似"挂载 NFS"和"启动网络"这样的工作还是存在天生的先后依赖关系,无法并发执行。

对于这些任务,systemd 维护一个"事务一致性"的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况。

1. 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/,真正的配置文件存放在那个目录。

2. unit常见类型

3. 管控unit单元

3.1 启动、停止、重启等服务(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

3.2 查看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行时某服务的运行的状态,由以下几种:

#查看某服务当前激活与否的状态
[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

3.3 查看、设置服务开机状态

#设置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.

4. 管理target unit

target主要用来管理centos7上的运行级别,有许多个target unit来组成。与sysvinit的runlevel功能很相似。runlevel和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

5. 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

常见进程信号:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值