systemd는 서비스가 중지되었는지 어떻게 결정합니까?

systemd는 서비스가 중지되었는지 어떻게 결정합니까?

우리 애플리케이션은 init.d 스크립트를 사용하여 애플리케이션을 서비스로 시작하고 중지합니다. CentOS 7에서는 /sbin/init심볼릭 링크가 systemd이므로 다음 중 하나를 사용하여 애플리케이션을 시작할 수 있습니다.

service myapp start

또는

systemctl start myapp

내가 겪고 있는 문제는 서비스를 사용하거나 stop서비스를 실행해도 내 응용 프로그램이 중지되지 않는다는 것입니다. 산출:servicesystemctlsystemctl status

[root@nec04 ~]# systemctl status myapp
myapp.service - SYSV: Service script to start/stop my application
   Loaded: loaded (/etc/rc.d/init.d/myapp)
   Active: inactive (dead) since Mon 2015-10-05 15:17:41 CEST; 22h ago
  Process: 31850 ExecStop=/etc/rc.d/init.d/myapp stop (code=exited, status=0/SUCCESS)
  Process: 21054 ExecStart=/etc/rc.d/init.d/myapp start (code=exited, status=0/SUCCESS)

사용 service명령:

[root@nec04 ~]# service myapp status
Local database at :3307 is started
Watchdog is running
Application is running

내 애플리케이션이 왜 systemctl실행되지 않는다고 생각하시나요? 내 응용 프로그램이 중지되었다고 생각했기 때문에 systemctl이 중지 기능을 호출하지 않았나요?

답변1

출력을 모르고 service실제로 도구를 사용한 적이 없지만 systemctl응용 프로그램에 따라 중지되었습니다. 이것이 바로 이 Active: inactive (dead)줄이 의미하는 바입니다. ( Loaded단지 systemd가 유닛 파일을 메모리에 로드했다는 의미입니다. 이는 애플리케이션이 실행 중인지 여부에 관계없이 항상 그렇습니다.)

애플리케이션에 실제로 여전히 실행 중인 프로세스가 있는 경우 이는 중지 기능이 제대로 작동하지 않음을 의미합니다. 그러나 이러한 일이 발생해서는 안 됩니다. 일단 systemctl무언가가 중지되면 (시간 초과 후) cgroup을 사용하여 해당 애플리케이션에서 시작된 모든 프로세스를 강제 종료합니다. 따라서 프로세스가 루트로 실행되고 의도적으로 cgroup을 떠나지 않는 한(매우 병리적인 동작) systemd는 이를 종료해야 합니다. 그러나 sysVinit 에뮬레이션과 어떻게 상호 작용하는지 잘 모르겠습니다.

전체 문제는 sysVinit 에뮬레이션을 사용하는 systemd가 init 스크립트를 유닛 파일로 사용한다는 사실로 인해 복잡해집니다. 언급한 대로 적절한 단위 파일에 다시 작성하는 것이 더 나을 수도 있습니다.여기. Type=simple프로그램이 dbus 와 대화하는 것보다 스위치나 이에 상응하는 기능을 갖는 것이 더 일반 Type=dbus적이고 제어할 수 있는 코드에 추가하는 것이 더 쉽기 때문에 대신 사용하는 것이 좋습니다 .--no-daemon

답변2

내 애플리케이션이 왜 systemctl실행되지 않는다고 생각하시나요?

Tom Hunter가 말했듯이 실행되지 않았기 때문입니다.

systemctl내 애플리케이션이 중지되었다고 생각하고 중지 기능을 호출하지 않기 때문 인가요 ?

아니, 아주 명확하게했다중지 기능을 호출하고 프로세스 #31850으로 실행합니다.

여기에는 두 가지 가능성이 있으며 둘 다 시스템 문제는 아닙니다.

  • 어떤 시점에서는 시스템 서비스가 아닌 서비스 프로그램을 직접 시작합니다. 그것이 아직도 실행되고 있는 것입니다. 물론 systemd는 이것을 알지 못합니다.
  • status스크립트 기능에 문제가 있습니다 init.d. 이것은 init.d세계 역사상 처음으로 결함이 있는 대본이 아닙니다 .

myapp.service - SYSV: 내 앱에 대한 서비스 시작/중지 스크립트

"sysv:"에 경품이 있다는 것은 귀하의 init.d스크립팅이 좋지 않다는 것을 보여줍니다. LSB 헤더 블록도 없습니다.

Tom Hunter가 말했듯이 몇 가지 서비스 단위를 작성하십시오. 또는 systemd로 마이그레이션하는 첫 번째 규칙을 기억한 다음 이미 작성된 규칙을 조정하십시오. 표면적으로는 실제로 세 가지 상호 의존적이지만 서로 다른 서비스가 있으며 이러한 상호 의존성을 표현하려면 여러 서비스 단위를 작성해야 합니다. 그 중 하나가 포트 3307에서 수신 대기하는 데이터베이스 서버인 경우 첫 번째 규칙이 거의 확실하게 적용됩니다.

추가 읽기

관련 정보