위에서 언급한 대로 셀러리를 서비스로 실행하려고 합니다.문서에서.
설명서에서는 %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" |instance name|인스턴스화된 유닛의 경우: "@" 문자와 유닛 이름 접미사 사이의 문자열입니다.
- '%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데비안 제시에서.
편집 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
와 의 차이점은 전달된 매개변수의 "이스케이프"라고 이미 언급했습니다 .
다음 질문은 "탈출"이 무엇을 의미하나요?
Escape는 특수 문자를 변경하는 것을 의미합니다. %i
특수 문자를 /
대시 로 바꾸십시오 -
.\x20
경고: 인스턴스 이름에 대시가 포함된 경우 -
변수에서 대시가 대체됩니다 %I
. 이것이 문서에 "Escape is undo"라고 나와 있는 이유입니다.
예
[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