systemd는 죽은 데몬을 감지하지 못합니다.

systemd는 죽은 데몬을 감지하지 못합니다.

나는 aaa.service다른 일반적인 것들 중에서 다음을 포함하는 파일(Control JBoss)을 가지고 있습니다.

[Service]
Type=forking
ExecStart=/my/script start
ExecReload=/my/script restart
ExecStop=/my/script stop
PIDFile=...

/my/script startPID 파일을 생성하고 service aaa status표시하면 이상한 경고가 표시됩니다.

Supervising process xxx which is not our child. We'll most likely not notice when it exits.

전체 출력:

   Loaded: loaded (/etc/systemd/system/aaa.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-01-22 20:55:16 CET; 34min ago
  Process: 32435 ExecStart=/my/script start (code=exited, status=0/SUCCESS)
 Main PID: 32542
    Tasks: 0 (limit: 512)
   CGroup: /system.slice/aaa.service

Jan 22 20:54:56 I011-830 su[32447]: (to aaa) root on none
Jan 22 20:54:56 I011-830 su[32447]: pam_unix(su-l:session): session opened for user aaa by (uid=0)
Jan 22 20:55:16 I011-830 aaa[32435]: Starting JBoss application server: Starting JBoss application server:
Jan 22 20:55:16 I011-830 systemd[1]: aaa.service: Supervising process 32542 which is not our child. We'll most likely not notice when it exits.

이제 실제 문제는 프로세스가 종료된 후 실행되면 service aaa stopsystemd가 이를 감지하지 못한다는 것입니다. 심지어 실행 중이라고 주장하고 다시 시작하고 싶지도 않습니다.

# cat <pid-file>
No such file or directory
# service aaa status
   Loaded: loaded (/etc/systemd/system/aaa.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-01-22 20:55:16 CET; 40min ago
  Process: 32435 ExecStart=/konsens/app/aaa/init/aaastart (code=exited, status=0/SUCCESS)
 Main PID: 32542
    Tasks: 0 (limit: 512)
   CGroup: /system.slice/aaa.service
 ...
# service aaa start
# <--- Instant return, no process started

다음 목표를 어떻게 달성할 수 있나요?

  • systemd는 내 서비스를 시작하고 중지할 수 있어야 합니다.
  • service aaa statussystemd에 의해 시작되었는지 수동으로 실행되었는지 여부에 관계없이 프로세스 상태를 표시해야 합니다./my/service start
  • systemd는 수동으로 서비스를 종료한 후 서비스를 시작할 수 있어야 합니다.
  • systemd는 내가 수동으로 시작한 서비스를 중지할 수 있어야 합니다.

답변1

다음 목표를 어떻게 달성할 수 있나요? 1 systemd는 내 서비스를 시작하고 중지할 수 있어야 합니다.

대부분의 배포판은 이전 버전과 호환되므로 기본 서비스를 생성하지 않으려면 서비스를 /etc/init.d/에 저장할 수 있습니다.

2 서비스 aaa 상태는 프로세스가 systemd에 의해 시작되었는지 또는 /my/service start에서 수동으로 실행되었는지 여부에 관계없이 프로세스 상태를 표시해야 합니다.

systemctl start aaa.service이를 수행하는 한 가지 방법은 호출이 처음에 이런 방식으로 호출되지 않았는지 확인하기 위해 스크립트에 검사를 추가하는 것입니다 . 트랩을 사용하여 종료할 수 있습니다.

3 Systemd는 수동으로 서비스를 종료한 후 서비스를 시작할 수 있어야 합니다.

#2로 해결됨

4 systemd는 내가 수동으로 시작한 서비스를 중지할 수 있어야 합니다.

#2로 해결됨

관련 정보