한 사람은 할 수 없습니다.

한 사람은 할 수 없습니다.

확인할 수 있는 문서화된 방법이 있나요?서비스 자체로 실행되는 프로그램의 코드에서systemd, (대화형 로그인 세션, cron 등이 아닌)에 의해 시작되었습니까?

.service현재 해결 방법은 unit()에서 환경 변수를 정의하고 Environment=...해당 변수가 내 코드에 있는지 확인하는 것입니다. 그러나 직접적으로 사용할 수 있는 것이 있을 수 있습니다.

답변1

한 사람은 할 수 없습니다.

서비스를 호출하는 프로세스(해당 매개변수, 환경, 이를 포함하는 제어 그룹, 리소스 제한, 열린 파일 설명자)에 systemd가 제공하는 모든 기능은 다른 서비스 관리자가 수행할 수 있습니다. 또한 어떤 서비스 관리자가 서비스를 관리하는지 식별하기 위한 공유 규칙이 없습니다. 일반 환경 변수도 없고 다른 플래그도 없습니다.

잘못된 메커니즘

상위 프로세스의 실행 파일 이름을 확인하는 것을 고려할 수도 있습니다. 이건 불가능하니까https://unix.stackexchange.com/a/196252/5132. 상위 프로세스의 실행 가능 프로그램 이미지(시스템 전체 서비스에 사용됨)의 이름은 /sbin/initDebian Linux 운영 체제에 있을 것입니다. 왜냐하면 Debian의 관례는 이것이 실제 프로세스 1 프로그램 이미지 파일에 대한 대체 스타일 심볼릭 링크이고 프로그램이 initramfs에서 /init이름만 알면 됩니다.

내가 방금 쓴 내용에 관계없이 통제 그룹은 시스템화된 태그라고 생각할 수도 있습니다. 그렇지 않습니다. 다음은 service-managernosh 도구 세트와 완전히 다른 서비스 관리자가 관리하는 서비스 프로세스의 제어 그룹 트리입니다 .

%systemd-cgls /system.slice/service-manager.service/[이메일 보호됨]
제어 그룹/system.slice/service-manager.service/[이메일 보호됨]:
└─[이메일 보호됨]
  └─1433tinydns
%

프로그램 tinydns은 에서 제어 그룹을 찾았 /proc/self/cgroup으므로 systemd가 제어 그룹을 설정한다고 가정할 이유가 없습니다. 실제로 유틸리티에 의해 설정됩니다 move-to-control-group.

%cat/var/local/sv/[이메일 보호됨]/서비스/실행
#!/빈/노쉬
#./생성된 파일 실행[이메일 보호됨]
#127.53.0.1의 DNS/UDP 소켓
udp-socket-listen --systemd-compatibility --combine4and6 127.53.0.1 도메인
통제그룹 "../"으로 이동[이메일 보호됨]/[이메일 보호됨]"
환경 환경
envuidgid——tinydns-d
setlogin——tinydns-d
하드 제한 -d 3000000
소프트 제한 -d 하드
. /제공하다
%

다른 프로세스 상태 변경은 systemd에 고유하지 않습니다. setenv(체인 로딩 도구) userenv, 또는 (체인 로딩 도구)를 사용 machineenv하여 환경 변수를 설정하고, (체인 로딩 도구)를 사용하거나 export리소스 제한을 설정하고, 파일 설명자를 사용하거나 열고, 네임스페이스를 사용하고, 예약 우선 순위를 사용할 수 있습니다. 전략 등softlimitulimits6-softlimitredirfdfdredirunsharertpriochrtnumactl

LISTEN_FDS위에서 볼 수 있듯이 systemd가 이 프로토콜의 유일한 대변인은 아닙니다. 다시 말하지만, 이것은 프로그램 시작 부분에 채워지고 연결되는 연습일 뿐입니다 INVOCATION_ID. 이들 중 어느 것도 지표로 신뢰할 수 없습니다.env/INVOCATION_IDrunenvdir

개념 오류

에 의해 시작된 프로세스를 제외하려는 함정도 있습니다 cron. 여기서 개념적 결함은 이것이 cron서비스이고 이것이 생성되는 프로세스라는 것입니다.이 서비스의 컨텍스트에서 실행 중입니다.. 가지다아니요cron서비스의 프로세스에 의해 생성된 프로세스 cron와 다른 서비스의 다른 서비스 프로세스에 의해 생성된 프로세스 간에는 마법 같은 차이가 있으며, 이는 전자를 후자와 다소 다르게 만듭니다.

이 개념적 오류를 제거하면 답이 나타납니다. 데몬은 자신이 속한 (POSIX) 세션에 제어 터미널이 없다는 점에서 다릅니다.다른모든 로그인 세션과의 연결(set name 에서 setloginsystemd의 사용자 공간 로그인 세션 메커니즘을 통해 다양한 보안 컨텍스트까지) 세션의 제어 터미널이 무엇인지 쿼리할 수 있는 이식 가능한 직접적인 방법은 없지만 공개 /dev/tty실패는 간접적인 방법으로 사용할 수 있습니다. 유망해 보이는 일부 C 라이브러리 함수는 실제로 실제로는 신뢰할 수 없습니다.

추가 읽기

답변2

다음 명령을 사용할 수 있다고 생각합니다.

#> systemctl list-unit-files --state=enabled
cups.path                                  enabled        
accounts-daemon.service                    enabled        
anacron.service                            enabled        
apparmor.service                           enabled        
atd.service                                enabled        
[email protected]                            enabled        
avahi-daemon.service                       enabled        
...

여기에는 systemctl list-unit-files서비스를 시작할 수 있는 설치된 모든 장치 파일이 나열됩니다. 표시된 항목은 enabled명령을 입력할 때 실행됩니다.

관련 정보