systemd를 사용하여 이 사용자로 여러 서비스를 실행하면 이 사용자에 대한 모든 서비스가 종료됩니다.

systemd를 사용하여 이 사용자로 여러 서비스를 실행하면 이 사용자에 대한 모든 서비스가 종료됩니다.

우리는 Ubuntu 16.04 LTS를 사용하고 있으며 부팅 시 시작되어야 하는 여러 Tomcat 설치를 사용하고 싶습니다. Tomcat 중 하나는 Jenkins를 호스팅하여 다른 Tomcat에 웹 애플리케이션을 배포하고 다시 시작합니다.

서비스를 시작하기 위해 systemd 서비스 스크립트를 추가했습니다. 우리는 수컷 고양이 한 마리가 멈추거나 죽으면 다른 수컷 고양이도 멈춘다는 것을 알아냈습니다.

우리는 이를 /usr/bin/yes만 사용하는 두 개의 간단한 스크립트로 줄였습니다.

유닛 A

[Unit]
Description=A
After=syslog.target network.target

[Service]
Type=simple

ExecStart=/usr/bin/yes
ExecStop=/bin/kill -15 $MAINPID

User=tomcat8
Group=tomcat8

[Install]
WantedBy=multi-user.target

유닛 B

[Unit]
Description=B
After=syslog.target network.target

[Service]
Type=simple

ExecStart=/usr/bin/yes
ExecStop=/bin/kill -15 $MAINPID

User=tomcat8
Group=tomcat8

[Install]
WantedBy=multi-user.target

무슨 일이 일어나는지: 하나의 서비스가 종료되면( kill -9) 두 서비스도 함께 사라집니다.

  1. 두 서비스가 모두 종료된 이유는 무엇입니까? 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
  2. 단일 사용자로 여러 서비스를 실행하는 것이 권장되지 않습니까, 아니면 좋은 방법입니까?

편집하다:명확히 하기 위해 - systemd 없이 tomcat을 시작할 때도 동일한 작업을 수행하려고 했습니다. 이 경우 동작은 예상대로입니다. 즉, 종료된 서비스만 중지되고 다른 서비스는 계속 실행됩니다.

편집 2:이 사용자는 로그인/아웃을 수행하는 프런트엔드 사용자가 아닙니다. 서비스에 대한 액세스는 시스템 사용자로만 제한됩니다.

답변1

이것변경 로그systemd(v230)의 경우:

사용자가 로그아웃하면 systemd-logind는 이제 기본적으로 사용자 세션 범위 단위(session-XX.scope)의 일부인 사용자 프로세스를 종료합니다. 이 동작은 logind.conf의 KillUserProcesses= 설정에 의해 제어됩니다. 이전 기본값인 "no"는 이제 "yes"로 변경되었습니다. 이는 사용자 세션이 나중에 적절하게 정리되지만 의도적으로 장기 실행 프로세스가 로그아웃 상태에서 유지되도록 하려면 추가 단계가 필요함을 의미합니다.

이것이 기본 동작입니다. 또한 변경 사항을 취소하는 방법도 설명합니다: , ( 및 ) 으로 logind.conf설정KillUserProcesses=no --without-kill-user-processes optionconfigure

그러나 변경 로그에는 다음도 포함됩니다...

사용자가 한 번 이상 로그인했을 때 실행 [email protected]중이고 단일 로그인 세션이 끝난 후에도 유지되어야 하는 모든 서비스는 사용자 서비스 또는 범위를 사용하여 시작할 수 있습니다 systemd-run. systemd-run(1) 매뉴얼 페이지는 아래 범위 단위에서 화면을 실행하는 방법을 보여주는 예제로 확장되었습니다 [email protected]. 동일한 명령이 tmux에서도 작동합니다.

그리고

사용자가 모든 세션에서 로그아웃한 후[이메일 보호됨]또한 사용자가 활성화하지 않는 한 기본적으로 종료됩니다 lingering. 사용자가 로그아웃한 동안 장기 실행 작업을 효과적으로 실행할 수 있도록 하려면 지연을 활성화해야 합니다.자세한 내용은 loginctl(1)을 참조하십시오. 사용자가 인증 없이 스스로 지연을 설정할 수 있도록 기본 polkit 정책을 수정했습니다..

이것은 기본값(kill'm all)과 예외를 제공하는 방법(enable)을 사용하기 때문에 더 중요합니다 lingering.

추가 정보:

답변2

문제는 systemd종속성 배열에 있다고 생각합니다.

이런 소리가 나네요긴밀한 논리무슨 일이 일어날 수 있습니까?

순차 종속성을 갖는 두 장치가 종료되면 시작 순서의 반대가 적용됩니다. 즉, 한 장치가 다른 장치에 After=를 구성한 경우 두 장치가 모두 종료되면 전자가 후자보다 먼저 중지됩니다.

그러나 예제 스크립트에는 둘 사이에 종속성을 생성했음이 표시되지 않습니다.

예제 "A" 스크립트를 실행해 보았지만 시작되지 않았습니다.

 Failed at step USER spawning /usr/bin/yes: No such process

(저는 Ubuntu 16.04에서 테스트했습니다.)

관련 정보