我正在尝试将 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
%I
systemd
这解释了很多,但留下了一些问题:
- 这里怎么不
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