Systemd는 서비스 이름을 동적으로 할당합니다.

Systemd는 서비스 이름을 동적으로 할당합니다.

서비스 파일에서 서비스 이름을 동적으로 설정하는 방법이 있습니까?

서로 다른 입력 매개변수를 사용하여 서비스의 여러 인스턴스를 실행하고 있습니다. 디버깅의 경우 모든 서비스가 동일하게 호출되고 실제로 불만을 제기하는 서비스를 찾는 것이 지루할 수 있으므로 이는 최적이 아닙니다. 그래서 제가 원하는 것은 주어진 입력에 대해 서비스에 고유한 이름을 부여하는 것입니다. Systemds 서비스 파일은 ExecStartarg[0]을 변경하기 위해 접두사 "@"를 설정하여 이 기능을 지원합니다. 여기서 두 번째 인수는 arg[0] 값이 됩니다.

ExecStart명령 에 대한 정보 및@접두사: https://www.freedesktop.org/software/systemd/man/systemd.service.html

이것은 지금까지 내 서비스 파일에 있는 내용입니다.

ExecStart=@/usr/bin/foo foo-%I %I

입력 매개변수는 파일이므로 bar-123.json과 같은 이름이 지정됩니다. 이는 top, ps 또는 우리가 사용하는 QA 도구를 사용할 때 작동하며 서비스 이름은 foo-bar-123.json이 됩니다. 입력 파일은 systemctl dbus api를 사용하여 "foo" 서비스 인스턴스를 시작하는 다른 서비스에 의해 생성됩니다.

하지만 foo-bar-123.json이라는 서비스를 갖는 것이 최선은 아니며 foo-bar라고 부르고 싶습니다.

나는 테스트로 달리기를 시도했습니다.

**ExecStartPre=/bin/sh -c 'export NAME=bar'**
**ExecStart=@/usr/bin/foo foo-${NAME} %I**

하지만 그러면 이름은 "foo-"가 됩니다. 서비스 파일이 쉘 스크립트가 아니기 때문에 이는 예상할 수 있는 일이라고 생각하지만 이것이 제가 생각할 수 있는 유일한 솔루션입니다.

다른 문제에 대한 해결책도 환영합니다. prctl 함수의 PR_SET_NAME이 프로세스 이름도 변경해야 한다는 것을 알고 있지만 그것이 누구와 관련이 있는지는 잘 모르겠습니다. prctl 함수를 사용하고 싶지 않은 이유는 이름의 길이가 널 바이트를 포함하여 16바이트밖에 되지 않기 때문입니다. 이는 제가 갖고 싶지 않은 제한 사항입니다.

답변1

일반적으로 시스템 서비스 단위 인스턴스를 사용하는 방법에는 두 가지가 있습니다. 예를 들어 각 인스턴스에서 /etc/sysconfig재정의되는 파일을 사용하십시오. 기본옵션변수( EnvironmentFile서비스 정의에서 이러한 파일은 로드되고 채워집니다.옵션, 예 참조 systemctl show -p ExecStart sshd) 또는 "드롭인" 디렉토리를 통해 더 많은 단위 정의를 덮어쓰십시오. <service>@instance.service.d.

그런데 인스턴스에는 "@"이 있어야 합니다. 그렇지 않으면 인스턴스가 아닙니다.

getty서비스 단위에서 어떻게 사용되는지 확인하세요 .

$ ls -l /usr/lib/systemd/system/[email protected]
-rw-r--r-- 1 root root 1958 Apr  9 00:22 /usr/lib/systemd/system/[email protected]
$ grep ^ExecStart /usr/lib/systemd/system/[email protected]
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
$ systemctl -t service --state running list-units | grep getty
[email protected]       loaded active running Getty on tty1 

관련 정보