我使用的是 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 开发人员。