14.1 守护进程与服务

14.1.1 服务

服务,Service,是一种 进程,它通过进程间通信机制来 响应其它程序的请求,这些请求 通常来自于网络。服务通常是由服务软件提供的。

服务包括守护进程及其他服务。非守护进程的服务通常由 xinetd 控制,xinetd 负责监听请求,必要时会启动相关的服务来处理,请求被处理完成以后,服务会再次被关闭。

【 xinetd 】 extended internet deamon。负责管理基于互联网的活动。相对于较早的 inetd,其安全性更好。xinetd 监听 其管理的所有服务的 端口,当发生连接请求时,xinetd 决定是否允许客户端访问。如果允许,则启动对应的服务。

14.1.2 守护进程

守护进程,Daemon,是一种 服务进程,它们运行于后台,管理系统或为其它进程提供特定的功能。它 不会与用户发生任何交互

早期的守护进程由 SysVinit 部署,而现代的守护进程遵循一个简单而更强大的方案,由 systemd 部署,称之为新型守护进程。

守护进程进程名字均以字母 ‘d’ 结尾,如 syslogd、sshd 等。

典型的守护进程:MySQLApache。典型的非守护进程:rsyncvsftpd

📕 服务的概念大于守护进程。

14.1.3 sysvinit

systemd 之前,一直以来都是 SysVinit 掌管启动进程。当系统使用 SysVint 时,init 是加载内核后,第一个执行的进程。 init 会加载一系列的脚本,这些脚本会启动各种系统服务。

SysVinit 的问题在于它 需要细致的调整必须确保进程的启动顺序正确,以满足进程间的依赖性。

SysVinit 实现的方式是 为服务设定严格的启动顺序,每个服务都被分配了 优先级 数字,然后 init 按照优先级的顺序 依次启动 服务。导致 启动时间较长

要想确保服务的启动顺序正确,必须为服务手工配置优先级,为此需花费很大的精力。

init 的特点

init 的缺点:

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

所有的服务启动脚本都放在 /etc/init.d/

启动命令:/etc/init.d/apache2 startservice apache2 start

停止命令:/etc/init.d/apache2 stopservice apache2 stop

重新启动:/etc/init.d/apache2 restart 或 service apache2 restart

查看状态:/etc/init.d/apache2 status 或 service apache2 status

服务启动模式
  • 独立启动:stand alone,服务独立启动,常驻于内存,反应速度快。

  • 超级守护进程:super daemon,做为总管进程,统一管理所有的守护进程。早期的超级守护进程是 inetd,后来被 xinetd 取代了。

    xinetd 管理多个网络服务。当没有用户请求套接字或端口时,服务不会启动。有用户请求时,xinetd 唤醒对应的服务。请求结束,服务也会停止。

    优点是可以 管理多个网络服务,缺点是 唤醒服务会有一点延迟

  • 服务的依赖关系

    init 需要管理员根据服务之间的依赖关系,手动排序 优先级。相当费精力。

  • 执行等级的分类: init 可以根据使用者自定义的 执行等级 来唤醒不同的服务,以进入不同的 服务环境操作界面

    Linux 提供 7 个执行等级,0 ~ 6, 其中比较重要的是 1,单人维护模式,3,纯文本模式,5,文字加图形界面

    各个执行等级的启动脚本是通过 /etc/rc.d/rc[0-6]/SXXdaemon 链接到 /etc/init.d/daemon

    链接文件名:SXXdaemon。S 表示启动该服务,XX 是优先级。

  • 设置执行等级对应的服务:SXXdaemon 这些链接文件不是手动生成的,而是通过以下命令自动生成的:

    • 开机启动: chkconfig daemon on

    • 开机不启动: chkconfig daemon off

    • 查看是否开机启动: chkconfig --list daemon

  • 执行等级的切换:

    init 5 会从纯命令行(运行等级 3)切换到图形界面(运行等级 5),init 会自动分析 /etc/rc.d/rc[3].d//etc/rc.d/rc[5].d/ 目录中的脚本,然后启动转换执行等级所需的服务。

14.1.4 systemd

systemd 简介

从 CentOS 7 以后,Red Hat 系列发行版放弃沿用多年的 System V 开机启动服务的流程,改用 systemd 这个启动服务管理机制。

在系统启动后,做为第一个运行的进程,systemd 扮演初始化系统的角色,负责启动和维护用户空间的服务。

Systemd 中,所有的服务都是彼此分离的,即使某一个服务的配置文件有问题,也不会影响到其它的服务。

Systemd 不只是一个初始化的系统,它也 是一套库和工具。可以用来 替代多种服务和工具,包括 sysvinit, pm-utils, inetd, acpid, syslog, watchdog, cron, atd 等。

Systemd 可以兼容 init 的启动脚本,因此,init 启动脚本也能够通过 systemd 来管理,但无法使用 systemd 的高级功能。

systemd 独有的功能

  • sysvinit 的执行等级,只有 1, 3, 5 有对应的 target 类型
  • 所有服务都用 systemctl 管理,支持的语法有限制,不可自定义参数
  • 如果没有用 systemctl 启动服务,而是手动启动的,systemd 将无法管理
  • systemd 启动过程中,不接受任何输入,因此自定义的服务不应在启动期间尝试用标准输入与之互动,因为期间标准输入被设置为 /dev/null

14.1.5 systemd 与 sysvinit 的区别

功能 systemd SysVinit
服务 引入 单元(systemd units)的概念,每个服务为一个单元,这些单元由各自的配置文件控制,这些文件包含了服务启动时需要的所有配置信息,包括进程依赖关系的描述。 每个服务对应一个脚本文件
服务启动顺序 并行启动多个服务,提升启动速度。只需设置少量的文件。 依照优先级 逐个启动,需要花费大量精力去手动设置。
服务的管理 按需启动服务,无需另外的服务来管理 按需启动服务,需要超级守护进程来管理
服务依赖 服务依赖关系 自动管理,会自动启动相关的服务,防止长时间超时。 静态管理,需要管理员手动调整各服务启动顺序,需要管理员对各服务关系非常了解
服务监控 持续监控 服务,可以自动重启崩溃的服务 需要常常调整监控服务,服务很容易逃避监控
记录日志 增强了记录日志能力,启动后就可以开始记录 启动后一段时间才开始记录日志
服务环境 按相关性把所有服务 分组(target),通过切换组来切换服务环境 使用 执行等级 来切换不同的服务环境

14.2 systemd 简介

systemd 是 一套软件,它为 Linux 提供基本的构建块。其中最突出的一个软件就是 systemd,是一个 系统管理和服务管理的工具。它是一个 初始化 的系统,负责 自举用户空间,并在 启动后管理系统进程。是 UNIX System V 以及 BSD init 的替代品。

systemd 项目的主要目标之一是,在所有的 Linux 发行版中 统一基本配置和服务行为

2015 年起,大量的发行版开始把 systemd 做为其默认的初始化系统。

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。

事实上,现在还有很多人反对使用 systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反 “keep simple, keep stupid” 的 Unix 哲学。

systemd 的架构

14.2.1 systemd 设计宗旨

systemd 的设计目标是,为系统的启动和管理提供一套完整的解决方案。Systemd 这个名字的含义,就是它要守护整个系统。

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

systemd 的立意:

  • 系统管理及服务管理:通过应用各种配置,来管理系统和服务
  • 软件平台:为其它软件的开发提供服务
  • 应用与内核的粘合剂:提供多种接口,便于程序访问各种内核的功能

systemd 不仅仅是初始化的那个守护进程,它更是代表围绕它的整个的软件包,包括 journald、logind、networkd 等许多其它的底层组件。

做为一个内置的软件包,systemd 代替了 那些由传统初始化守护进程控制的 启动序列、运行级以及各个脚本。同时,它也 整合 了许多 Linux 常见的 其它的服务,如用户登陆、系统控制台、设备热插拔、计划任务、日志、主机名及区域设置。

init 一样,systemd 也是一个守护进程,用来管理其它的守护进程,包括它自己。它是系统启动过程中第一个守护进程,也是系统关闭过程中最后一个终止的守护进程。systemd 是进程树中的根,Unix 系统中的第一个进程(PID 1)往往扮演着特殊的角色,当某个守护进程从其父进程分离出来以后被终止时,systemd 会收到一个 SIGCHLD 信号。因此,第一个进程非常适合用来监控守护进程。传统的管理守护进程的办法是,把守护进程启动之后就不再监控了,而 systemd 尝试在这方面有所改进。

systemd 是以并行的方式执行启动序列的,比传统的方法要快。对于进程间通信,systemd 使 Unix domain socket 和 D-Bus 对运行中的守护进程变的可用。systemd 自身的状态也可以保存于快照中,便于日后查看。

14.2.2 单元

Systemd 可以管理所有 系统资源。不同的资源统称为 Unit(单元)。

单元一共分成 12 种。

  • Service unit:系统服务
  • Target unit:多个单元构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照
  • Socket Unit:进程间通信的套接字
  • Swap Unit:交换文件
  • Timer Unit:定时器

systemd 把 每个守护进程的 初始化指令都保存在一个 配置文件 中,称之为 单元文件(Unit File),使用的是声明语言,传统方法是每个守护进程用一个脚本文件来配置。

systemctl list-units 列出正在运行的单元

systemctl list-units --all 列出所有单元,包括没有找到配置文件的或者启动失败的

systemctl list-units --all --state=inactive 列出所有没有运行的单元

systemctl list-units --failed 列出所有加载失败的单元

systemctl list-units --type=service 列出所有正在运行的、类型为服务的单元

单元的状态

systemctl status

命令用于查看系统状态和单个单元的状态。

systemctl status

显示系统状态

sysystemctl status bluetooth.service

显示单个单元的状态

systemctl -H root@rhel7.example.com status httpd.service

显示远程主机的某个单元的状态

除了status命令,systemctl还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。

systemctl is-active application.service

显示某个单元是否正在运行

systemctl is-failed application.service

显示某个单元是否处于启动失败状态

systemctl is-enabled application.service

显示某个单元服务是否建立了启动链接

单元管理

对于用户来说,最常用的是下面这些命令,用于启动和停止单元(经常用于管理服务)。

sudo systemctl start apache.service

立即 启动 一个服务

sudo systemctl stop apache.service

立即 停止 一个服务

sudo systemctl restart apache.service

重启 一个服务

sudo systemctl kill apache.service

杀死 一个服务的所有子进程

sudo systemctl reload apache.service

重新加载 一个服务的 配置文件

sudo systemctl daemon-reload

重新加载所有修改过的配置文件

systemctl show httpd.service

显示某个单元的 所有底层参数

systemctl show -p CPUShares httpd.service

显示某个单元的指定属性的值

sudo systemctl set-property httpd.service CPUShares=500

设置某个单元的指定属性

依赖关系

单元之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。

systemctl list-dependencies 命令列出一个单元的所有依赖。

systemctl list-dependencies nginx.service

上面命令的输出结果之中,有些依赖是 Target 类型,默认不会展开显示。如果要展开 Target,就需要使用--all参数。

systemctl list-dependencies --all nginx.service

14.2.3 核心组件

随着被整合进 Linux,systemd 也提供了各种守护进程和工具的替代品,可以替代启动脚本、pm-utils、inetd、acpid、syslog、watchdog、cron、atd 等。systemd 的核心组件包括:

  • systemd 是系统管理器及服务管理器
  • systemctl 可用于检查和控制 systemd 的状态
  • systemd-analyze 用于确定系统启动性能统计信息,并从 systemd 中检索其他状态和跟踪信息

systemd 不再使用 PID,而是使用内核的 cgroups 子系统来追踪进程,因此,守护进程是无法逃脱 systemd 的。system 不仅仅是使用 cgroups,它还用 systemd-nspawnmachinectl 这两个工具来 强化 其功能,这两个工具 实现了 Linux 容器的创建和管理。从 205 版本开始,systemd 也提供了 cgroups 接口。

【 cgroups 】Control Groups 的缩写,是 Linux 内核的功能,它会 限制、计算、隔离一组进程的资源使用(CPU,内存,磁盘 I/O,网络等)。

14.2.4 辅助组件

journald

systemd-journald 该守护进程负责把事件保存到日志中,使用只可追加的二进制文件做为日志文件。系统管理员可以选择是使用 systemd-journald 来保存系统事件的日志,还是使用 syslog-ngrsyslog

logind

systemd-logind 守护进程以多种方式 管理用户登陆和座位(seats),它是一个集成的登陆管理器,增强了多座位(Multi-Seat)的支持,替代了 ConsoleKit(已不再维护)。

【 Multi-Seat 】一个座位,seat,由分配给特定工作空间的所有硬件设备组成,通常至少要包括键盘、鼠标,也可包含摄像头、声卡等。多座位,Multi-Seat,多座系统允许多个独立的座位,这些座位都能独立地、同时被不同的用户使用。

networkd

networkd 守护进程用于控制网络接口的配置。

tmpfiles

systemd-tmpfiles 工具用于临时文件和临时目录的创建和清理,这些临时文件和临时目录经常只在启动时运行一次,之后便是以一定的时间间隔来运行了。

timedated

systemd-timedated 守护进程用于控制与时间相关的设置,如系统时间、系统时区,或在 UTC 与本地时间系统时钟之间做出选择。可以通过 D-Bus 来访问该守护进程。

udevd

udev 是内核的设备管理器,用于控制 /dev 目录,以及在添加删除设备时用户空间的所有行为,包括固件的加载。

libudev

这是使用 udev 的标准库,允许第三方程序查询 udev 的资源。

systemd-boot

systemd-boot 是启动管理器。

14.3 单元的配置文件

14.3.1 概述

每一个单元都有一个配置文件,告诉 Systemd 怎么启动这个单元。配置文件有时也称为 单元文件

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

systemctl enable 命令用于在上面两个目录之间,建立符号链接 关系。

$ sudo systemctl enable clamd@scan.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'

如果配置文件里面设置了开机启动,systemctl enable 命令相当于 激活开机启动

与之对应的,systemctl disable 命令用于在两个目录之间,撤销符号链接关系,相当于 撤销开机启动

$ sudo systemctl disable clamd@scan.service

配置文件的 后缀名,就是该 单元的种类,比如 sshd.socket如果省略,Systemd 默认后缀名为 .service,所以 sshd 会被理解成 sshd.service

支持 Systemd 的程序在安装的时候,会自动在 /usr/lib/systemd/system 目录添加一个配置文件。

14.3.2 配置文件的状态

列出所有配置文件:

systemctl list-unit-files

列出指定类型的配置文件:

systemctl list-unit-files --type=service

$ systemctl list-unit-files

UNIT FILE              STATE
chronyd.service        enabled
clamd@.service         static
clamd@scan.service     disabled

enabled

启用,已建立启动链接,开机自动启动

disabled

禁用,没建立启动链接,开机不会自动启动,但可由其他服务激活,也可以手动运行。

static

静态,其配置文件没有 install 部分,所以无法被启用。但可以被其他单元激活,通常作为其它单元的依赖。

masked

屏蔽,该配置文件被禁止建立启动链接。彻底禁用,任何情况都无法运行。

注意,从配置文件的状态无法看出,该单元是否正在运行。必须用 systemctl status bluetooth.service 命令查看。一旦 修改 了配置文件,就要让 SystemD 重新加载 配置文件,然后 重新启动单元,否则修改不会生效。

$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

14.3.3 配置文件的格式

配置文件就是普通的文本文件,可以用文本编辑器打开。

systemctl cat 命令可以查看配置文件的内容。

$ systemctl cat atd.service
>
[Unit]
Description=ATD daemon
>
[Service]
Type=forking
ExecStart=/usr/bin/atd
>
[Install]
WantedBy=multi-user.target

单元文件的内部结构是由多个区块组成的,每个区块的第一行,是用 方括号表示的区块名,如 [Unit]

14.3.4 配置文件的区块

为表达方便,下文中用 “我” 来代表当前单元。

修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。

sudo systemctl daemon-reload 重新加载配置文件

sudo systemctl restart foobar 重启相关服务

通用区块

区块的名称 是系统预定义的,区分大小写。如果需要增加非标准的区块用于自定义功能,可以在区块名称前加 X- 前缀。

每个区块内部是一些 等号连接的键值对。而且键值对的 等号两侧不能有空格

在发生文件覆盖时,通过给指令分配空值,可以重置该变量。如 Requires=

systemd 允许在配置文件中使用比较灵活宽松的配置。如对于布尔值,可以用 1yesontrue 等代表真。

[Unit] 区块

通常是配置文件的 第一个区块,用来定义 单元的元数据,以及配置 与其他单元的关系。它的主要字段如下。

  • Description:简短描述
  • Documentation:文档地址
  • Requires:我 必须要 这些单元,它们不运行,我会启动失败
  • Wants:我 想要 这些单元,没有就算了,我不会启动失败
  • BindsTo:我和它 绑定,它退出,我就停止运行
  • Before:我必须在这些单元 之前启动
  • After:我必须在这些单元 之后启动
  • Conflicts:我和它们冲突,不能同时运行
  • Condition...:这些条件必须满足,否则我 优雅地忽略
  • Assert...:这些条件必须满足,否则会 报错
[Install] 区块

通常是配置文件的 最后一个区块,用来 定义如何启动,以及 是否开机启动。它的主要字段如下。下文中的 “我” 指当前单元。

  • WantedBy:这些目标有我更好,没我也行。

    它的值是一个或多个 目标(target),当前单元激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 目标名.wants 后缀命名的子目录中。

  • RequiredBy:这些目标有我才能运行

    它的值是一个或多个 目标,当前单元激活时符号链接会放入 /etc/systemd/system 目录下面以 目标名.required 后缀命名的子目录中。

  • Alias:我的 别名,可用于诸多 systemctl 命令中
  • Also:当前单元激活(enable)时,会被同时激活的其他 Unit

特定单元的区块

夹在 [Unit] 和 [Install] 中间的区块,每种单元有着不同的内容,这些区块大多用于设定其特定种类的参数。

其中,devicetargetsnapshotscope 这些区块不属于特定种类。

[Service] 区块

用于进行 服务 的配置,只有 Service 类型的单元才有这个区块。它的主要字段如下。

  • Type:定义 启动时的进程行为。它有以下几种值。
    • 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 会自动重启我,可用值为 alwayson-successon-failureon-abnormalon-aborton-watchdog
  • TimeoutSec:定义 Systemd 停止我之前等待的秒数
  • Environment:指定环境变量

另外,对于某些特殊的服务类型,还有一些附加的指令:

  • RemainAfterExit= 通常用于 oneshot 类型的服务,即使进程退出了也应该视该服务为激活。
  • PIDFile= 服务类别为 forking 时,被监视的主要子进程 PID 会保存在一个文件中,该命令用于设置该文件的路径。
  • BusName= 当使用 dbus 服务类型时,该参数用于设置 bus name。
  • NotifyAccess= 当服务类型为 notify 时,该参数用于指定该服务使用哪个套接字来监听通知消息,可选值为 nonemainall。默认为 none,即忽略所有状态消息。main 表示监听主进程发出的消息,all 表示使用该服务 cgroup 中的所有成员来监听。

【 更多区块介绍 】

14.4 Target

启动计算机的时候,需要启动大量的单元。如果每一次启动,都要一一写明本次启动需要哪些单元,显然非常不方便。Systemd 的解决方案就是 Target。

简单说,Target 就是一个单元组,包含许多相关的单元 。启动某个 Target 的时候,Systemd 就会启动里面所有的单元。

从这个意义上说,Target 这个概念类似于 “状态点”,启动某个 Target 就好比启动到某种状态

传统的 init 启动模式里面,有运行级的概念,跟 Target 的作用很类似。不同的是,运行级是互斥的,不可能多个运行级同时启动,但是 多个 Target 可以同时启动

14.4.1 常用命令

systemctl list-unit-files --type=target

查看当前系统的所有 Target

systemctl list-dependencies multi-user.target

查看一个 Target 包含的所有单元

systemctl get-default

查看启动时的默认 Target

sudo systemctl set-default multi-user.target

设置启动时的默认 Target

sudo systemctl isolate multi-user.target

关闭前一个 Target 里面所有不属于后一个 Target 的进程。切换 Target 时,默认不关闭前一个 Target 启动的进程,systemctl isolate 命令会改变这种行为,

14.4.2 Target 与 传统运行级的对应关系

runlevel target 符号链接指向
Runlevel 0 runlevel0.target poweroff.target
Runlevel 1 runlevel1.target rescue.target
Runlevel 2 runlevel2.target multi-user.target
Runlevel 3 runlevel3.target multi-user.target
Runlevel 4 runlevel4.target multi-user.target
Runlevel 5 runlevel5.target graphical.target
Runlevel 6 runlevel6.target reboot.target

14.4.3 Target 与 init 进程的主要差别

  • 默认的运行级(在 /etc/inittab 文件设置)被默认的 Target 取代,位置是 /etc/systemd/system/default.target,通常软链接到 graphical.targetmulti-user.target
  • 启动脚本的位置,以前是 /etc/init.d 目录,软链接到不同的运行级目录 (如 /etc/rc3.d/etc/rc5.d 等),现在则存放在 /lib/systemd/system/etc/systemd/system 目录。
  • 配置文件的位置,以前 init 进程的配置文件是 /etc/inittab,各种服务的配置文件存放在 /etc/sysconfig 目录。现在的配置文件主要存放在 /lib/systemd 目录,在 /etc/systemd 目录里面的修改可以覆盖原始设置。

14.4.4 Target 的配置文件

注意,Target 配置文件里面 没有启动命令

14.5 日志管理

Systemd 统一管理所有单元的启动日志。带来的好处就是,可以只用 journalctl 一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是 /etc/systemd/journald.conf

journalctl 功能强大,用法非常多。

常用命令

查看所有日志(默认情况下 ,只保存本次启动的日志):

sudo journalctl

查看内核日志(不显示应用日志):

sudo 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

查看某个单元 的日志:

sudo journalctl -u nginx.service

sudo journalctl -u nginx.service --since today

实时滚动显示某个单元的最新日志:

sudo journalctl -u nginx.service -f

合并显示多个单元的日志:

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

14.5 CentOS 7.x 默认启动的服务简易说明

CentOS 7 默认启动的服务

服务名称 可关闭 服务类别 功能简介
abrtd 保留 系统 用于监控应用程序的崩溃。当崩溃发生时,它会收集错误信息,然后根据应用程序的类型及配置文件的参数采取对应的措施。通过插件可以把错误信息通过邮件、FTP 等发给管理员
accounts-daemon 关闭 系统 是 AccountsService 的一部分,允许程序获取并修改用户帐户信息。有潜在安全风险
alsa-X 关闭 系统 与音效有关
atd 保留 系统 一次性计划任务
auditd 保留 系统 SELinux 依靠它监控授权验证情况,日志为 /var/log/audit/audit.log
avahi-daemon 关闭 系统 通过部署苹果公司的 Zeroconf 架构,自动的分析与管理网络。常用于移动设备
brandbot rhel-* 保留 系统 开机环境检测,网络启动关闭
chronyd ntpd ntpdate 保留 系统 通过网络校正时间
cpupower 保留 系统 一组为辅助 CPU 调频而设计的用户空间工具
crond 保留 系统 计划任务
cups 关闭 管理打印机,包括网络打印  
dbus 保留 系统 提供简便进程间通信的消息总线系统。包含一个能以全系统或者针对一个用户会话运行的守护进程,和一系列提供与 D-Bus 通信的库
dm-event multipathd 保留 系统 用于监控设备映射
dmraid-activation mdmonitor 保留 系统 用来启动软 RAID
dracut-shutdown 保留 系统 与开机过程有关
ebtables 保留 系统/网络 防火墙,如果启用了 firewalld,可以关闭
emergency rescue 保留 系统 进入紧急模式或者是救援模式的服务
firewalld 保留 系统/网络 新的防火墙服务
gdm 保留 系统 GNOME显示环境的管理器
getty@ 保留 系统 命令行服务
hyper_ksm_libvirt* vmtoolsd 保留 系统 虚拟机相关的一系列服务,不用虚拟机可以关闭
irqbalance 保留 系统 适用于多核心的硬件,用于自动分配系统中断
iscsi* 保留 系统 挂载网络磁盘
kdump 可关闭 系统 记录 Linux 核心的出错信息
lvm2-* 保留 系统 LVM 相关的多个服务
microcode 保留 系统 Intel 的 CPU 提供的微指令集,如果没有下载 Intel 的指令集文件,可以关闭
ModemManager network NetworkManager* 保留 系统/网络 Modem、网络设置等服务
quotaon 保留 系统 Quota 服务
rc-local 保留 系统 兼容于 /etc/rc.d/rc.local 的调用方式
rsyslog 保留 系统 记录系统产生的各项信息, 包括 /var/log/messages 等日志
smartd 保留 系统 自动监测硬盘状态,发生问题自动的反馈信息
sysstat 保留 系统 一体化的 Linux 系统性能和使用活动监控工具
systemd-* 保留 系统 系统运行过程所需要的服务
plymount* upower 保留 系统 图形界面有关的一些服务

CentOS 7 默认不会启动的服务

所有服务均为网络服务:

服务名称 功能
dovecot 提供 POP3/IMAP 邮件服务
httpd www server
named DNS Server
nfs nfs-server Network Filesystem Server
smb nmb 模拟 Windows 网络邻居
vsftpd FTP Server
sshd SSH Server
rpcbind 实现 RPC 协议的重要服务
postfix 邮件服务器,系统产生的邮件也是通过它发送