지정자 해결: %i와 %I의 차이점은 무엇입니까?

지정자 해결: %i와 %I의 차이점은 무엇입니까?

위에서 언급한 대로 셀러리를 서비스로 실행하려고 합니다.문서에서.

설명서에서는 %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그것을 사용할 때 우리가 보는 것은 %ICelery에만 해당됩니다. (바라보다셀러리 문서). 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와 의 차이점은 전달된 매개변수의 "이스케이프"라고 이미 언급했습니다 .

다음 질문은 "탈출"이 무엇을 의미하나요?

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

관련 정보