说明符分辨率:%i 和 %I 区别?

说明符分辨率:%i 和 %I 区别?

我正在尝试将 celery 作为服务运行,如上所述在文档中

该文档%n%I对日志文件使用说明符:

芹菜.服务:

ExecStart= [...] --logfile=${CELERYD_LOG_FILE}

celery.service.d/celery.conf

Environment="CELERYD_LOG_FILE=/var/log/celery/%n%I.log"

%n执行此操作时,我可以在启动时解决的服务状态中看到%I 仍处于此阶段:

systemctl status celery.service
[...]
    --logfile=/var/log/celery/worker%I.log

我得到这些日志文件:

/var/log/celery/worker.log
/var/log/celery/worker-1.log
/var/log/celery/worker-2.log

但是,如果我使用%i,整个事情就会在开始时解决

celery.service.d/celery.conf

Environment="CELERYD_LOG_FILE=/var/log/celery/%n%i.log"

产生这个:

systemctl status celery.service
[...]
    --logfile=/var/log/celery/celery.service.log

我只得到一个日志文件:

/var/log/celery/celery.service.log

这很令人不安。

系统文档,唯一的区别应该是转义:

  • “%i” |实例名称 |对于实例化单元:这是“@”字符和单元名称后缀之间的字符串。
  • “%我” |未转义的实例名称 |与“%i”相同,但转义已撤消

我在这里缺少什么吗?

另外,我注意到,如果我直接在文件中设置日志路径.service,则仅%n%i接受表单。

ExecStart= [...] --logfile=/var/log/celery/%n%i.log

会做,并导致

/var/log/celery/celery.service.log

尽管

ExecStart= [...] --logfile=/var/log/celery/%n%I.log

触发错误:

celery.service failed to run 'start' task: Operation not supported
Failed to start Celery worker.

怎么会?

我在用着系统215-17在 Debian Jessie 上。

编辑1:

看来根本就%I没有被理解。systemd我们在使用时看到的内容%I是 Celery 特有的。 (看芹菜文档)。 so由while%i管理,被忽略并由 透明传递,然后由 Celery 管理。systemd%Isystemd

这解释了很多,但留下了一些问题:

  • 这里怎么不systemd明白%I
  • 相反,如果我想传递 Celery a 该怎么办%i
  • 为什么我直接在.service文件中传递选项而不是在.conf文件中传递选项会有所不同?

我浏览了systemd变更日志,没有发现任何%I比我正在使用的版本更新的内容。

编辑2:

我在运行时看到此错误消息systemctl status celery.service

[/etc/systemd/system/celery.service.d/celery.conf:18] Failed to resolve specifiers, ignoring: "CELERYD_LOG_FILE=/var/log/celery/%n%I.log"

但我无法重现它。我不知道为什么它只发生一次而不是每次都发生。

答案1

来自文档%i您已经引用过,和之间的区别%I是传递参数的“转义”。

下一个问题是:“逃避”是什么意思?

转义意味着改变特殊字符。%i将特殊字符替换为/破折号-和。\x20

警告:如果实例名称包含破折号-,则该破折号将在变量中被替换%I。这就是为什么文档说“转义已撤消”。

例子

让我们考虑[email protected]包含以下几行:

[Service]
Environment="OPTIONS=%I %i"
ExecStart=/usr/bin/bash -c "echo $OPTIONS >> /tmp/test-specifier"

然后让我们启动服务:systemctl start some-service@/etc/path/to/some-conf 输出/tmp/test-specifier将是:

/etc/path/to/some/conf -etc-path-to-some-conf

请注意,变量 中some-conf已变为。some/conf%I

结论

因此,实例名称的行为/etc/path/to/some-conf是:

  • %i带转义的说明符:-etc-path-to-some-conf
  • %I不转义的说明符:/etc/path/to/some/conf

测试设置

CentOS 7 带有systemd-219-67

systemd-escape可以从命令行尝试使用 systemd 的字符串转义。

参考

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers http://0pointer.de/blog/projects/instances.html https://www.freedesktop.org/software/systemd/man/systemd-escape.html

相关内容