正如系统管理员所知,现代计算机上发生了很多事情。应用程序在后台运行,自动化事件等待在特定时间被触发,日志文件被写入,状态报告被传递。传统上,这些不同的进程一直使用一系列 Unix 工具进行管理和监控,效果显著且效率很高。然而,现代计算机是多样化的,本地服务与容器化应用程序并行运行,可以轻松访问云及其运行的集群、实时进程,以及比以往更多的数据需要处理。
拥有统一的管理方法是用户所期望的,也是繁忙的系统管理员所需要的便利。对于这项重要的任务,系统守护进程,或 systemd,被开发出来,并迅速被所有主要的 Linux 发行版所采用。
当然,systemd 并不是管理 Linux 系统的唯一方法。有许多替代的 init 系统,包括 sysvinit、OpenRC、runit、s6,甚至 BusyBox,但 systemd 将 Linux 视为一个统一的数据集,旨在通过强大的工具进行一致地操作和查询。对于繁忙的系统管理员和许多用户来说,systemd 的速度和易用性是一个重要的特性。以下是五个原因。
启动管理
如果您愿意,启动 Linux 计算机可能是一件非常罕见的事情。当然,在服务器领域,正常运行时间通常以年而不是月或周来计算。笔记本电脑和台式机往往会被频繁地关闭和启动,尽管即使是这些电脑也更可能被挂起或休眠,而不是被关闭。无论哪种方式,自上次启动事件以来的时间都可以作为计算机健康检查的一种会话管理器。这是一种有用的方法,可以限制在监控系统或诊断问题时查看的数据。
如果您不记得上次启动计算机的时间,您可以使用 systemd 的日志记录工具 journalctl
列出启动会话
$ journalctl --list-boots
-42 7fe7c3... Fri 2020-12-04 05:13:59 - Wed 2020-12-16 16:01:23
-41 332e99... Wed 2020-12-16 20:07:39 - Fri 2020-12-18 22:08:13
[...]
-1 e0fe5f... Mon 2021-03-29 20:47:46 - Mon 2021-03-29 21:59:29
0 37fbe4... Tue 2021-03-30 04:46:13 - Tue 2021-03-30 10:42:08
最新的启动会话出现在列表的底部,因此您可以将输出通过管道传递给 tail
,仅查看最新的启动。
左侧的数字(本例中为 42、41、1 和 0)是每个启动会话的索引号。换句话说,要仅查看特定启动会话的日志,您可以使用其索引号作为参考。
日志查看
查看日志是推断有关系统信息的重要方法。日志提供了计算机在没有您直接监督的情况下进行的大部分活动的历史记录。您可以看到服务何时启动、定时作业何时运行、哪些服务在后台运行、哪些活动失败等等。最常见的初始故障排除步骤之一是查看日志,使用 journalctl
可以轻松完成
$ journalctl --pager-end
--pager-end
选项(或简写 -e
)从 journalctl
输出的末尾开始查看日志,因此您必须向上滚动才能查看较早发生的事件。
Systemd 维护着一个“目录”,其中包含错误和消息,其中充满了错误记录、可能的解决方案、指向支持论坛的指针和开发者文档。这可以为日志事件提供重要的上下文,否则日志事件可能只是消息海洋中令人困惑的闪烁,或者更糟糕的是,可能完全被忽视。要将错误消息与解释性文本集成,您可以使用 --catalog
选项(或简写 -x
)
$ journalctl --pager-end --catalog
为了进一步限制您需要筛选的日志输出,您可以指定要查看哪个启动会话的日志。由于每个启动会话都有索引,因此您可以使用 --boot
选项指定某些会话,并仅查看适用于该会话的日志
$ journalctl --pager-end --catalog --boot 42
您还可以查看特定 systemd 单元的日志。例如,要排除安全外壳 (SSH) 服务的问题,您可以指定 --unit sshd
以仅查看适用于 sshd
守护进程的日志
$ journalctl --pager-end \
--catalog --boot 42 \
--unit sshd
服务管理
systemd 的首要任务是启动您的计算机,它通常能及时、高效且有效地完成这项任务。但永无止境的任务是服务管理。按照设计,systemd 确保您想要运行的服务确实在会话期间启动并继续运行。这非常可靠,因为理论上即使崩溃的服务也可以在无需您干预的情况下重新启动。
您帮助 systemd 管理服务的界面是 systemctl
命令。使用它,您可以查看定义服务的单元文件
$ systemctl cat sshd
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
大多数单元文件都位于 /usr/lib/systemd/system/
中,但与许多重要配置一样,我们鼓励您使用本地更改来修改它们。也有一个用于此目的的界面
$ systemctl edit sshd
您可以查看服务当前是否处于活动状态
$ systemctl is-active sshd
active
$ systemctl is-active foo
inactive
同样,您可以使用 is-failed
查看服务是否失败。
启动和停止服务非常直观
$ systemctl stop sshd
$ systemctl start sshd
启用服务在启动时启动也很简单
$ systemctl enable sshd
添加 --now
选项以启用服务在启动时启动或在当前会话中启动。
定时器
很久以前,当您想在 Linux 上自动化任务时,规范的工具是 cron
。cron 命令仍然有其用武之地,但也出现了一些引人注目的替代方案。例如,anacron
命令是一个通用的、类似 cron 的系统,能够运行在停机期间可能会错过的任务。
计划事件只不过是在特定时间激活的服务,因此 systemd 管理着一个类似 cron 的功能,称为 定时器。您可以列出活动的定时器
$ systemctl list-timers
NEXT LEFT
Tue 2021-03-30 12:37:54 NZDT 16min left [...]
Wed 2021-03-31 00:00:00 NZDT 11h left [...]
Wed 2021-03-31 06:42:02 NZDT 18h left [...]
3 timers listed.
Pass --all to see loaded but inactive timers, too.
您可以像启用服务一样启用定时器
$ systemctl enable myMonitor.timer
目标
目标是 systemd 矩阵的最后一个主要组件。目标由单元文件定义,与服务和定时器相同。目标也可以以相同的方式启动和启用。目标的独特之处在于它们以任意重要的方式将其他单元文件分组在一起。例如,您可能希望启动到文本控制台而不是图形桌面,因此存在 multi-user
目标。但是,multi-user
目标只是没有桌面单元文件作为依赖项的 graphical
目标。
简而言之,目标是一种简单的方式,让您可以将服务、定时器甚至其他目标收集在一起,以表示计算机的预期状态。
实际上,在 systemd 中,重启、关机或关闭操作只是另一个目标。
您可以使用 list-unit-files
选项列出所有可用的目标,并使用设置为 target
的 --type
选项对其进行约束
$ systemctl list-unit-files --type target
使用 systemd 掌控一切
现代 Linux 使用 systemd 进行服务管理和日志内省。它为从个人 Linux 系统到企业服务器的所有系统提供了一个现代化的机制,用于监控和轻松维护。您使用得越多,systemd 就变得越容易预测和直观,并且您越能发现系统的不同部分是如何相互关联的。
为了更好地了解 systemd,您必须使用它。为了更好地熟练使用它,下载我们的速查表 并经常参考它。
27 条评论