systemd:“Unit”部分中的未知键名称“ConditionEnvironment”

systemd:“Unit”部分中的未知键名称“ConditionEnvironment”

我使用的是 systemd 版本 246:

$ systemctl --version                           
systemd 246 (246.2-1-arch)
+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

其文档ConditionEnvironment位于其 systemd.unit 联机帮助页中。但是,如果我在单元文件中使用它,~/.config/systemd/user/i3-session-pre.target如下所示:

[Unit]
Description=i3 session
Documentation=man:systemd.special(7)
BindsTo=graphical-session-pre.target
ConditionEnvironment=XDG_SESSION_DESKTOP=i3

我在我的用户日志中看到以下条目:

systemd[599]: /home/****/.config/systemd/user/i3-session-pre.target:5: Unknown key name 'ConditionEnvironment' in section 'Unit', ignoring.

systemd-analyze condition无法处理这种情况:

$ systemd-analyze condition ConditionEnvironment=XDG_SESSION_DESKTOP=i3
Cannot parse "ConditionEnvironment=XDG_SESSION_DESKTOP=i3".

我究竟做错了什么?

答案1

我不认为你做错了什么。我认为 systemd 中有一个错误。

在 Debian 测试(systemd 246,以及升级后的 246.1)上,我观察到以下情况:

ConditionEnvironment=仅仅是随版本 246 一起发布2020 年 7 月 30 日(撰写本文前 2.5 周)并且拉取请求于 5 月 15 日合并。因此,有理由假设它尚未成熟。

这是一个让我认为这是一个错误的测试:

$ systemd-analyze condition \
    'ConditionKernelVersion='  \
    'ConditionKernelVersion='  \
    'ConditionACPower=' \
    'ConditionArchitecture=' \
    'AssertPathExists=' \
    'ConditionEnvironment='
Cannot parse "ConditionEnvironment=".

如果我一一运行每个条件,它们都会解析除 之外的空表达式ConditionEnvironment=

我逐字尝试了你的目标(也是在 i3 环境中),我发现这对ConditionEnvironment=我能否达到目标没有影响。我尝试了正确和错误的值。因此这个问题并不特定于systemd-analyze.

我确实发现超级有趣的一件事是评论xdg-autostart-generator/xdg-autostart-condition.c:

 * This binary is intended to be run as an ExecCondition= in units generated
 * by the xdg-autostart-generator. It does the appropriate checks against
 * XDG_CURRENT_DESKTOP that are too advanced for simple ConditionEnvironment=
 * matches.

我认为这个错误是有效的,但我发现有趣的是,制作了一个生成器(并部署为/lib/systemd/systemd-xdg-autostart-condition)来克服您正在研究的确切环境中遇到的问题。

我提交了一份错误报告与 Debian 一起。我希望 debian 开发人员会查看并向上游转发给 systemd 开发人员。

相关内容