Linux 服务管理 service systemd systemctl
- 1 介绍
- 1.1 概述
- 1.2 发展历程
- 1.3 特点
- 1.4 linux 服务管理 发展历程
- Ubuntu 14.04及更早版本:使用upstart作为默认的init系统
- 旧版本
- 新版本
- Ubuntu 15.04到16.04版本:默认使用systemd作为init系统,但仍然兼容upstart
- Ubuntu 16.10及更高版本:默认使用systemd作为init系统
- 2 整体设计
- 核心组件和库
- 3 Systemd 的 Unit
- 3.1 Systemd 支持 12 种 Unit 文件类型
- 3.2 Systemd 目录
- 3.3 Unit 文件结构
- Unit 段
- Install 段
- Service 段
- 服务生命周期控制相关
- 服务上下文配置相关
- Unit 文件占位符
- 通过 systemctl list-units --type=target 命令可以获取当前正在使用的运行目标
- 3.4 Unit 管理
- 查看当前系统的所有 Unit
- 查看 Unit 的依赖关系
- 3.5 服务的生命周期
- 服务的激活
- 服务的启动和停止
- 服务的开机启动和取消
- 服务的修改和移除
- 4 命令使用
- 4.1 使用 service 命令管理服务
- 启动服务
- 停止服务
- 重启服务
- 查看服务状态
- 4.2 使用 systemctl 命令管理服务
- 启动服务
- 停止服务
- 重启服务
- 查看服务状态
- 杀死一个服务的所有子进程
- 重新加载一个服务的配置文件
- 重载所有修改过的配置文件
- 显示某个 Unit 的所有底层参数
- 显示某个 Unit 的指定属性的值
- 设置某个 Unit 的指定属性
- 设置服务开机自启
- 禁用服务开机自启
- 5 日志管理
- 6 Systemd 工具集
- systemctl
- systemd-analyze
- hostnamectl
- timedatectl
- loginctl
- systemd-run
- 参考
1 介绍
1.1 概述
systemd 是一个软件套件,为 Linux 操作系统提供一系列系统组件。其主要目的是统一 Linux 发行版之间的服务配置和行为。它的主要组件是“系统和服务管理器”——一个用于引导用户空间和管理用户进程的init系统。它还提供各种守护进程和实用程序的替代品,包括设备管理、登录管理、网络连接管理和事件日志记录。systemd 这个名字遵循了 Unix 命名守护进程的约定,通过在后面附加字母 d 来命名。它还利用了 “System D” 这个术语,指的是一个人快速适应和随机应变解决问题的能力。
Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责,并支持通过特定事件(如插入特定 USB 设备)和特定端口数据触发的 On-demand(按需)任务。
自 2015 年以来,大多数 Linux 发行版都采用了 systemd,取代了 SysV init 等其他 init 系统。采用 systemd 的发行版的开发人员和用户对它赞不绝口,因为它为 Linux 领域多年来存在的问题提供了稳定、快速的开箱即用解决方案。在大多数 Linux 发行版采用 systemd 时,它是唯一一款在启动过程中提供可靠并行性以及对进程、守护进程、服务和挂载点进行集中管理的软件套件。
systemd 的批评者认为它存在任务蔓延和臃肿的问题,后者影响到其他软件(比如GNOME桌面),增加了对 systemd 的依赖,降低了它与其他类 Unix 操作系统的兼容性,并且使系统管理员难以集成替代解决方案。 此外,他们认为 systemd 的复杂性导致了更大的攻击面,降低了平台的整体安全性。人们还担心 Red Hat 及其母公司 IBM 控制着 Linux 上的 init 系统领域。从那时起,已经创建了许多新的分叉 Linux 发行版,它们使用替代的 init 系统,如 SysV 或 OpenRC。Systemd 还没有被 Linux 领域之外的类 Unix 系统采用,如FreeBSD、OpenBSD和Solaris。
1.2 发展历程
- 2010年,Lennart Poettering 和 Kay Sievers 在Red Hat工作时开发了systemd,旨在取代Linux的System V init系统。他们的目标是提高系统启动效率,改进进程依赖关系管理,并减少shell计算开销。
- 2011年5月,Fedora Linux 成为首个默认启用systemd的主流发行版,取代了Upstart。
- 2012年10月,随后Arch Linux在2012年10月也将其设为默认,取代了SysVinit。
- 2013-2014年,Debian 在经过激烈辩论后,于2014年2月决定采用systemd,Ubuntu也随后跟进。
- 2014年11月,由于systemd集成争议,Debian的几位开发者辞职。
- 2015年8月,systemd增加了登录shell功能。
- 2016年9月,systemd被曝存在安全漏洞。
- 2017年,又发现另一个安全问题,导致Lennart Poettering获得了“最差劲的供应商响应”奖。
1.3 特点
-
PID 值为 1
Systemd 的后台服务有一个特殊的身份——它是系统中 PID 值为 1 的进程。 -
更少的进程
Systemd 提供了 服务按需启动 的能力,使得特定的服务只有在真定被请求时才启动。 -
允许更多的进程并行启动
在 SysV-init 时代,将每个服务项目编号依次执行启动脚本。Ubuntu 的 Upstart 解决了没有直接依赖的启动之间的并行启动。而 Systemd 通过 Socket 缓存、DBus 缓存和建立临时挂载点等方法进一步解决了启动进程之间的依赖,做到了所有系统服务并发启动。对于用户自定义的服务,Systemd 允许配置其启动依赖项目,从而确保服务按必要的顺序运行。 -
使用 CGroup 跟踪和管理进程的生命周期
在 Systemd 之间的主流应用管理服务都是使用 进程树 来跟踪应用的继承关系的,而进程的父子关系很容易通过 两次 fork 的方法脱离。
而 Systemd 则提供通过 CGroup 跟踪进程关系,引补了这个缺漏。通过 CGroup 不仅能够实现服务之间访问隔离,限制特定应用程序对系统资源的访问配额,还能更精确地管理服务的生命周期。 -
统一管理服务日志
Systemd 是一系列工具的集合, 包括了一个专用的系统日志管理服务:Journald。这个服务的设计初衷是克服现有 Syslog 服务的日志内容易伪造和日志格式不统一等缺点,Journald 用 二进制格式 保存所有的日志信息,因而日志内容很难被手工伪造。Journald 还提供了一个 journalctl 命令来查看日志信息,这样就使得不同服务输出的日志具有相同的排版格式, 便于数据的二次处理。
1.4 linux 服务管理 发展历程
Ubuntu 14.04及更早版本:使用upstart作为默认的init系统
可以创建一个.conf文件来配置开机自启服务,然后将它放在/etc/init/目录下。
/etc/rc.local
旧版本
rc.local是一种在Ubuntu中配置开机自启服务的方式,它属于早期版本的init系统。具体来说,rc.local是在Ubuntu 14.04及更早版本中使用的方式,使用的是upstart作为默认的init系统。
rc.local是一个脚本文件,位于/etc/rc.local。你可以在该文件中添加要在系统启动时执行的命令或脚本。这些命令或脚本将在系统启动时自动执行。
以下是使用rc.local配置开机自启服务的步骤:
1 打开rc.local文件:
sudo nano /etc/rc.local
2 在文件中添加你要执行的命令或脚本。例如,如果要启动一个名为my_service的服务,可以添加以下内容:
/path/to/your/service
3 保存并关闭文件。
4 确保rc.local文件具有可执行权限:
sudo chmod +x /etc/rc.local
5 重启系统,服务将在系统启动时自动执行。
注意:rc.local方式在较新的Ubuntu版本中已经不再推荐使用,因为它是基于旧的upstart系统。对于使用systemd作为init系统的较新版本的Ubuntu,建议使用systemd的方式来配置开机自启服务。
新版本
在一些较新的Ubuntu版本中,如Ubuntu 16.04及更高版本,rc.local文件默认是被禁用的,因为这些版本使用systemd作为默认的init系统。systemd不会自动执行rc.local文件中的内容。
为了在这些版本中使用rc.local文件,可以通过配置rc-local.service来实现。rc-local.service是一个systemd服务单元,用于在系统启动时执行rc.local文件中的内容。
以下是配置rc-local.service的步骤:
1 创建rc-local.service文件:
sudo nano /etc/systemd/system/rc-local.service
2 在文件中添加以下内容:
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
ExecStart=/etc/rc.local start
Type=forking
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
3 创建rc.local文件
sudo nano /etc/rc.local
4 在rc.local文件中添加要执行的命令或脚本。
5 保存并关闭文件。
6 设置rc.local文件的权限:
sudo chmod +x /etc/rc.local
7 启用rc-local.service:
sudo systemctl enable rc-local.service
8 启动rc-local.service:
sudo systemctl start rc-local.service
对于较新的Ubuntu版本,使用rc.local和rc-local.service的方式可能不是最佳实践。推荐使用systemd的方式来配置开机自启服务,以便与当前的init系统保持一致。
Ubuntu 15.04到16.04版本:默认使用systemd作为init系统,但仍然兼容upstart
可以使用upstart的方式来配置开机自启服务,或者使用systemd的方式。
Ubuntu 16.10及更高版本:默认使用systemd作为init系统
可以使用systemd的方式来配置开机自启服务。
2 整体设计
核心组件和库
systemd 还提供了各种守护进程和实用程序的替代品,包括 启动 shell 脚本、pm-utils、inetd、acpid、syslog、watchdog、cron和atd。systemd的核心组件包括:
- systemd 是 Linux 操作系统的系统和服务管理器。
- systemctl 是一个用于检查和控制 systemd 系统和服务管理器状态的命令。不要与sysctl混淆。
- systemd-analyze 可用于确定系统启动性能统计数据并从系统和服务管理器检索其他状态和跟踪信息。
systemd使用 Linux 内核的cgroups子系统来跟踪进程,而不是使用进程标识符(PID)。
3 Systemd 的 Unit
Systemd 可以管理所有系统资源,不同的资源统称为 Unit(单位)。
在 Systemd 的生态圈中,Unit 文件统一了过去各种不同系统资源配置格式,例如服务的启/停、定时任务、设备自动挂载、网络配置、虚拟内存配置等。而 Systemd 通过不同的文件后缀来区分这些配置文件。
3.1 Systemd 支持 12 种 Unit 文件类型
- .automount:用于控制自动挂载文件系统,相当于 SysV-init 的 autofs 服务
- .device:对于 /dev 目录下的设备,主要用于定义设备之间的依赖关系
- .mount:定义系统结构层次中的一个挂载点,可以替代过去的 /etc/fstab 配置文件
- .path:用于监控指定目录或文件的变化,并触发其它 Unit 运行
- .scope:这种 Unit 文件不是用户创建的,而是 Systemd 运行时产生的,描述一些系统服务的分组信息
- .service:封装守护进程的启动、停止、重启和重载操作,是最常见的一种 Unit 文件
- .slice:用于表示一个 CGroup 的树,通常用户不会自己创建这样的 Unit 文件
- .snapshot:用于表示一个由 systemctl snapshot 命令创建的 Systemd Units 运行状态快照
- .socket:监控来自于系统或网络的数据消息,用于实现基于数据自动触发服务启动
- .swap:定义一个用户做虚拟内存的交换分区
- .target:用于对 Unit 文件进行逻辑分组,引导其它 Unit 的执行。它替代了 SysV-init 运行级别的作用,并提供更灵活的基于特定设备事件的启动方式
- .timer:用于配置在特定时间触发的任务,替代了 Crontab 的功能
3.2 Systemd 目录
Unit 文件按照 Systemd 约定,应该被放置指定的三个系统目录之一中。这三个目录是有优先级的,如下所示,越靠上的优先级越高。因此,在三个目录中有同名文件的时候,只有优先级最高的目录里的那个文件会被使用。
- /etc/systemd/system:系统或用户自定义的配置文件
- /run/systemd/system:软件运行时生成的配置文件
- /usr/lib/systemd/system:系统或第三方软件安装时添加的配置文件。
1)ubuntu 16:被移到了 /lib/systemd/system
2)ubuntu 20中,目录/lib/systemd/system 和 /usr/lib/systemd/system 同时存在,这俩其实指向的是同一目录
Systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在那个目录。
3.3 Unit 文件结构
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/ sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop="/usr/bin/docker stop busybox1"
ExecStopPost="/usr/bin/docker rm busybox1"
[Install]
WantedBy=multi-user.target
- Unit 和 Install 段:所有 Unit 文件通用,用于配置服务(或其它系统资源)的描述、依赖和随系统启动的方式
- Service 段:服务(Service)类型的 Unit 文件(后缀为 .service)特有的,用于定义服务的具体管理和操作方法
Unit 段
- Description:描述这个 Unit 文件的信息
- Documentation:指定服务的文档,可以是一个或多个文档的 URL 路径
- Requires:依赖的其它 Unit 列表,列在其中的 Unit 模板会在这个服务启动时的同时被启动。并且,如果其中任意一个服务启动失败,这个服务也会被终止
- Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
- After:与 Requires 相似,但是在后面列出的所有模块全部启动完成以后,才会启动当前的服务
- Before:与 After 相反,在启动指定的任务一个模块之间,都会首先确证当前服务已经运行
- Binds To:与 Requires 相似,失败时失败,成功时成功,但是在这些模板中有任意一个出现意外结束或重启时,这个服务也会跟着终止或重启
- Part Of:一个 Bind To 作用的子集,仅在列出的任务模块失败或重启时,终止或重启当前服务,而不会随列出模板的启动而启动
- OnFailure:当这个模板启动失败时,就会自动启动列出的每个模块
- Conflicts:与这个模块有冲突的模块,如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然
Install 段
这部分配置的目标模块通常是特定运行目标的 .target 文件,用来使得服务在系统启动时自动运行。这个区段可以包含三种启动约束:
- WantedBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .wants 后缀构成的子目录中,如 “/etc/systemd/system/multi-user.target.wants/“
- RequiredBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .required 后缀构成的子目录中
- Also:当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit
- Alias:当前 Unit 可用于启动的别名
Service 段
用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段分为服务生命周期和服务上下文配置两个方面。
服务生命周期控制相关
-
Type:定义启动时的进程行为,它有以下几种值:
-
- Type=simple:默认值,执行ExecStart指定的命令,启动主进程
-
- Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
-
- Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
-
- Type=dbus:当前服务通过D-Bus启动
-
- Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
-
- Type=idle:若有其他任务执行完毕,当前服务才会运行
-
RemainAfterExit:值为 true 或 false(默认)。当配置为 true 时,Systemd 只会负责启动服务进程,之后即便服务进程退出了,Systemd 也仍然会认为这个服务还在运行中。这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出,然后等待消息按需启动的特殊类型服务使用的。
-
ExecStart:启动当前服务的命令
-
ExecStartPre:启动当前服务之前执行的命令
-
ExecStartPos:启动当前服务之后执行的命令
-
ExecReload:重启当前服务时执行的命令
-
ExecStop:停止当前服务时执行的命令
-
ExecStopPost:停止当其服务之后执行的命令
-
RestartSec:自动重启当前服务间隔的秒数
-
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括 always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
-
TimeoutStartSec:启动服务时等待的秒数,这一配置对于使用 Docker 容器而言显得尤为重要,因其第一次运行时可能需要下载镜像,严重延时会容易被 Systemd 误判为启动失败杀死。通常,对于这种服务,将此值指定为 0,从而关闭超时检测
-
TimeoutStopSec:停止服务时的等待秒数,如果超过这个时间仍然没有停止,Systemd 会使用 SIGKILL 信号强行杀死服务的进程
服务上下文配置相关
- Environment:为服务指定环境变量
- EnvironmentFile:指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义
- Nice:服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级
- WorkingDirectory:指定服务的工作目录
- RootDirectory:指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件
- User:指定运行服务的用户
- Group:指定运行服务的用户组
- MountFlags:服务的 Mount Namespace 配置,会影响进程上下文中挂载点的信息,即服务是否会继承主机上已有挂载点,以及如果服务运行执行了挂载或卸载设备的操作,是否会真实地在主机上产生效果。可选值为 shared、slaved 或 private
-
- shared:服务与主机共用一个 Mount Namespace,继承主机挂载点,且服务挂载或卸载设备会真实地反映到主机上
-
- slave:服务使用独立的 Mount Namespace,它会继承主机挂载点,但服务对挂载点的操作只有在自己的 Namespace 内生效,不会反映到主机上
-
- private:服务使用独立的 Mount Namespace,它在启动时没有任何任何挂载点,服务对挂载点的操作也不会反映到主机上
- LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等:限制特定服务的系统资源量,例如 CPU、程序堆栈、文件句柄数量、子进程数量等
注意:如果在 ExecStart、ExecStop 等属性中使用了 Linux 命令,则必须要写出完整的绝对路径。对于 ExecStartPre 和 ExecStartPost 辅助命令,若前面有个 “-” 符号,表示忽略这些命令的出错。因为有些 “辅助” 命令本来就不一定成功,比如尝试清空一个文件,但文件可能不存在。
Unit 文件占位符
在 Unit 文件中,有时会需要使用到一些与运行环境有关的信息,例如节点 ID、运行服务的用户等。这些信息可以使用占位符来表示,然后在实际运行被动态地替换实际的值。
- %n:完整的 Unit 文件名字,包括 .service 后缀名
- %p:Unit 模板文件名中 @ 符号之前的部分,不包括 @ 符号
- %i:Unit 模板文件名中 @ 符号之后的部分,不包括 @ 符号和 .service 后缀名
- %t:存放系统运行文件的目录,通常是 “run”
- %u:运行服务的用户,如果 Unit 文件中没有指定,则默认为 root
- %U:运行服务的用户 ID
- %h:运行服务的用户 Home 目录,即 %{HOME} 环境变量的值
- %s:运行服务的用户默认 Shell 类型,即 %{SHELL} 环境变量的值
- %m:实际运行节点的 Machine ID,对于运行位置每个的服务比较有用
- %b:Boot ID,这是一个随机数,每个节点各不相同,并且每次节点重启时都会改变
- %H:实际运行节点的主机名
- %v:内核版本,即 “uname -r” 命令输出的内容
- %%:在 Unit 模板文件中表示一个普通的百分号
通过 systemctl list-units --type=target 命令可以获取当前正在使用的运行目标
u20@u20:~$ systemctl list-units --type=target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
cryptsetup.target loaded active active Local Encrypted Volumes
getty-pre.target loaded active active Login Prompts (Pre)
getty.target loaded active active Login Prompts
graphical.target loaded active active Graphical Interface
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network.target loaded active active Network
nss-lookup.target loaded active active Host and Network Name Lookups
nss-user-lookup.target loaded active active User and Group Name Lookups
paths.target loaded active active Paths
remote-fs.target loaded active active Remote File Systems
slices.target loaded active active Slices
3.4 Unit 管理
查看当前系统的所有 Unit
# 列出正在运行的 Unit
$ systemctl list-units
# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all
# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive
# 列出所有加载失败的 Unit
$ systemctl list-units --failed
# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service
# 查看 Unit 配置文件的内容
$ systemctl cat docker.service
查看 Unit 的依赖关系
# 列出一个 Unit 的所有依赖,默认不会列出 target 类型
$ systemctl list-dependencies nginx.service
# 列出一个 Unit 的所有依赖,包括 target 类型
$ systemctl list-dependencies --all nginx.service
3.5 服务的生命周期
当一个新的 Unit 文件被放入 /etc/systemd/system/ 或 /usr/lib/systemd/system/ 目录中时,它是不会被自识识别的。
服务的激活
- systemctl enable:在 /etc/systemd/system/ 建立服务的符号链接,指向 /usr/lib/systemd/system/ 中
- systemctl start:依次启动定义在 Unit 文件中的 ExecStartPre、ExecStart 和 ExecStartPost 命令
服务的启动和停止
- systemctl start:依次启动定义在 Unit 文件中的 ExecStartPre、ExecStart 和 ExecStartPost 命令
- systemctl stop:依次停止定义在 Unit 文件中的 ExecStopPre、ExecStop 和 ExecStopPost 命令
- systemctl restart:重启服务
- systemctl kill:立即杀死服务
服务的开机启动和取消
- systemctl enable:除了激活服务以外,也可以置服务为开机启动
- systemctl disable:取消服务的开机启动
服务的修改和移除
- systemctl daemon-reload:Systemd 会将 Unit 文件的内容写到缓存中,因此当 Unit 文件被更新时,需要告诉 Systemd 重新读取所有的 Unit 文件
- systemctl reset-failed:移除标记为丢失的 Unit 文件。在删除 Unit 文件后,由于缓存的关系,即使通过 daemon-reload 更新了缓存,在 list-units 中依然会显示标记为 not-found 的 Unit。
4 命令使用
4.1 使用 service 命令管理服务
启动服务
sudo service service_name start
停止服务
sudo service service_name stop
重启服务
sudo service service_name restart
查看服务状态
sudo service service_name status
4.2 使用 systemctl 命令管理服务
systemctl是基于Systemd的服务管理工具,提供了更强大的功能和更细粒度的控制。
启动服务
sudo systemctl start service_name
停止服务
sudo systemctl stop service_name
重启服务
sudo systemctl restart service_name
查看服务状态
- enabled:已建立启动链接
- disabled:没建立启动链接
- static:该配置文件没有 [Install] 部分(无法执行),只能作为其他配置文件的依赖
- masked:该配置文件被禁止建立启动链接
sudo systemctl status service_name
# 显示系统状态
$ systemctl status
# 显示单个 Unit 的状态
$ systemctl status bluetooth.service
# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel7.example.com status httpd.service
杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
重载所有修改过的配置文件
$ sudo systemctl daemon-reload
显示某个 Unit 的所有底层参数
$ systemctl show httpd.service
显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
设置服务开机自启
sudo systemctl enable service_name
禁用服务开机自启
sudo systemctl disable service_name
5 日志管理
Systemd 通过其标准日志服务 Journald 提供的配套程序 journalctl 将其管理的所有后台进程打印到 std:out(即控制台)的输出重定向到了日志文件。
Systemd 的日志文件是二进制格式的,必须使用 Journald 提供的 journalctl 来查看,默认不带任何参数时会输出系统和所有后台进程的混合日志。
默认日志最大限制为所在文件系统容量的 10%,可以修改 /etc/systemd/journald.conf 中的 SystemMaxUse 来指定该最大限制。
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl
# 查看内核日志(不显示应用日志):--dmesg 或 -k
$ sudo journalctl -k
# 查看系统本次启动的日志(其中包括了内核日志和各类系统服务的控制台输出):--system 或 -b
$ sudo journalctl -b
$ sudo journalctl -b -0
# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1
# 查看指定服务的日志:--unit 或 -u
$ sudo journalctl -u docker.servcie
# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd
# 实时滚动显示最新日志
$ sudo journalctl -f
# 查看指定时间的日志
$ 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 行日志:--lines 或 -n
$ sudo journalctl -n
# 显示尾部指定行数的日志
$ sudo journalctl -n 20
# 将最新的日志显示在前面
$ sudo journalctl -r -u docker.service
# 改变输出的格式:--output 或 -o
$ sudo journalctl -r -u docker.service -o json-pretty
# 查看指定进程的日志
$ 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
6 Systemd 工具集
- systemctl:用于检查和控制各种系统服务和资源的状态
- bootctl:用于查看和管理系统启动分区
- hostnamectl:用于查看和修改系统的主机名和主机信息
- journalctl:用于查看系统日志和各类应用服务日志
- localectl:用于查看和管理系统的地区信息
- loginctl:用于管理系统已登录用户和 Session 的信息
- machinectl:用于操作 Systemd 容器
- timedatectl:用于查看和管理系统的时间和时区信息
- systemd-analyze 显示此次系统启动时运行每个服务所消耗的时间,可以用于分析系统启动过程中的性能瓶颈
- systemd-ask-password:辅助性工具,用星号屏蔽用户的任意输入,然后返回实际输入的内容
- systemd-cat:用于将其他命令的输出重定向到系统日志
- systemd-cgls:递归地显示指定 CGroup 的继承链
- systemd-cgtop:显示系统当前最耗资源的 CGroup 单元
- systemd-escape:辅助性工具,用于去除指定字符串中不能作为 Unit 文件名的字符
- systemd-hwdb:Systemd 的内部工具,用于更新硬件数据库
- systemd-delta:对比当前系统配置与默认系统配置的差异
- systemd-detect-virt:显示主机的虚拟化类型
- systemd-inhibit:用于强制延迟或禁止系统的关闭、睡眠和待机事件
- systemd-machine-id-setup:Systemd 的内部工具,用于给 Systemd 容器生成 ID
- systemd-notify:Systemd 的内部工具,用于通知服务的状态变化
- systemd-nspawn:用于创建 Systemd 容器
- systemd-path:Systemd 的内部工具,用于显示系统上下文中的各种路径配置
- systemd-run:用于将任意指定的命令包装成一个临时的后台服务运行
- systemd-stdio- bridge:Systemd 的内部 工具,用于将程序的标准输入输出重定向到系统总线
- systemd-tmpfiles:Systemd 的内部工具,用于创建和管理临时文件目录
- systemd-tty-ask-password-agent:用于响应后台服务进程发出的输入密码请求
systemctl
# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# CPU停止工作
$ sudo systemctl halt
# 暂停系统
$ sudo systemctl suspend
# 让系统进入冬眠状态
$ sudo systemctl hibernate
# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
systemd-analyze
# 查看启动耗时
$ systemd-analyze
# 查看每个服务的启动耗时
$ systemd-analyze blame
# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain
# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
hostnamectl
# 显示当前主机的信息
$ hostnamectl
# 设置主机名。
$ sudo hostnamectl set-hostname rhel7
timedatectl
# 查看当前时区设置
$ timedatectl
# 显示所有可用的时区
$ timedatectl list-timezones
# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
# 列出当前 session
$ loginctl list-sessions
# 列出当前登录用户
$ loginctl list-users
# 列出显示指定用户的信息
$ loginctl show-user ruanyf
systemd-run
systemd-run 可以将一个指定的操作变成后台运行的服务。它的效果似乎与直接在命令后加上表示后台运行的 & 符号很相似。然而,它让命令成为服务还意味着,它的生命周期将由 Systemd 控制。具体来说,包括以下好处:
- 服务的生命击期由 Systemd 接管,不会随着启动它的控制台关闭而结束
- 可以通过 systemctl 工具管理服务的状态
- 可以通过 journalctl 工具查看和管理服务的日志信息
- 可以通过 Systemd 提供的方法限制服务的 CPU、内存、磁盘 IO 等系统资源的使用情况。
参考
1、wiki–systemd
2、官网–systemd
3、Linux服务管理(详解)!
4、linux–systemd、systemctl
5、Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart(systemd教程)
6、可能是史上最全面易懂的 Systemd 服务管理教程!( 强烈建议收藏 )
7、Ubuntu系统如何启动、停止或重启服务。
8、ubuntu系统服务配置详解