systemctl list-units 类型的目标行为不符合预期

systemctl list-units 类型的目标行为不符合预期

摘要:“systemctl list-units --type=target --all”并不总是列出我添加的目标

细节:

我有一个由多个相关守护进程组成的项目;我们把这个项目称为“Foo”。守护进程由 systemd 服务单元管理,服务被分组在一起,以便在目标中更轻松地管理。我有 Foo 项目的“生产”和“测试”部署。因此,我在 /etc/systemd/system 下创建了 foo_testing.target 和 foo_production.target。事实上,我在各种物理主机和虚拟机上都有这种安排——有些既有生产又有测试,有些只有其中一种。因此,我需要能够询问给定主机安装了什么以及正在运行什么。

在查看了 systemd 和 systemctl 的文档后,我发现

systemctl list-units --type=target --all

这对于正在运行的目标来说非常有效。如果生产和/或测试正在运行,它将可靠地显示在 list-units 的输出中。

问题在于停止的目标。如果我“systemctl stop foo_testing.target”并立即请求单元列表,那么 foo_testing.target 将在列表中(标记为非活动状态)。但是,如果我让测试部署停止一两天,然后回来执行“systemctl list-units --type=target --all”,那么 foo_testing惯于在名单上根本

那么,如果我的目标有一段时间没有活动了,为什么 systemd 会“忘记”它们呢?

以下是问题最严重的主机的系统信息:

$ lsb_release -a
Distributor ID: Ubuntu
Description:    Ubuntu 21.04
Release:    21.04
Codename:   hirsute
$ uname -a
Linux <redacted> 5.11.0-49-generic #55-Ubuntu SMP Wed Jan 12 17:36:34 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
$systemctl --version
systemd 247 (247.3-3ubuntu3.7)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +ZSTD +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid

[编辑] 根据要求,以下是“systemctl cat”的输出

$ systemctl cat "foo*.target"
# /etc/systemd/system/foo_testing.target
[Unit]
Description=Foo Testing Environment
AllowIsolate=no
Wants=serv1_testing.service serv2_testing.service serv3_testing.service

# /etc/systemd/system/foo_production.target
[Unit]
Description=Foo Production Environment
AllowIsolate=no
Wants=serv1_prod.service serv2_prod.service serv3_prod.service

但请注意,此输出不会改变。改变的是“systemctl list-units”的行为。

[编辑 2] 问:系统上安装了任何具有匹配基本名称的非目标 systemd 单元吗?

答:这样的单位确实存在——这要归功于我的命名方案。这可能是部分解释吗?

答案1

list-units不能期望持续报告非活跃单位的情况:

列表单位 [模式…]

列出 systemd 的单元目前已在记忆中。这包括直接引用或通过依赖项引用的单元、由应用程序以编程方式固定的单元,或过去处于活动状态但已发生故障的单元。

来自man systemctl,重点是我的。

该命令似乎更适合让人看到单位状态一览,并且必须忘记不再需要的单元,例如在某个未指定的时间之后,或者在守护进程重新加载或重新执行时。

如果在脚本中需要运行地位 一个单元,使用systemctl is-active(对于状态is-enabled,对于文件存在:list-unit-files,..)无论内存状态如何,都会产生一致的结果。

相关内容