서비스가 종료되어서는 안 되는 상태인 경우 서비스를 종료하지 않도록 시스템화하세요.

서비스가 종료되어서는 안 되는 상태인 경우 서비스를 종료하지 않도록 시스템화하세요.

systemd 서비스 구성에 대해 질문이 있습니다.

서비스 애플리케이션은 기계를 제어하는 ​​애플리케이션입니다. 애플리케이션에서는 SIGINT, SIGTERM, SIGQUIT 및 SIGHUP이 포착됩니다. 머신이 "실행 중" 상태에 있으면 이러한 신호가 무시되고 애플리케이션이 종료되지 않습니다. 기기가 중지 모드에 있는 경우 제어 응용 프로그램을 종료합니다.

Linux에서 애플리케이션을 시작하려고 하므로 애플리케이션을 시스템 서비스로 추가합니다.

지금까지 우리는 다음과 같은 구성을 가지고 있습니다:

[Unit]
Description=Machine control service
After=network.target

[Service]
Type=simple
User=simplemachine
Group=simplemachine
CPUSchedulingPolicy=other
LimitRTPRIO=80
LimitRTTIME=infinity

WorkingDirectory=/opt/simplemachine/bin/
ExecStart=/opt/simplemachine/bin/simplemachine
KillMode=none
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

이제 다음과 같은 문제가 있습니다. 내가 실행할 때 :

sudo systemctl stop machine.service

애플리케이션이 중지가 허용된 경우에만 중지되도록 systemctl에서 SIGTERM을 보내길 원합니다. 이는 애플리케이션이 중지되지 않는 경우에도 마찬가지입니다. systemctl이 프로세스를 종료하지 않으면 좋겠지만, 예를 들어 일종의 오류나 시간 초과 코드를 반환하여 프로세스를 중지하지 않을 수도 있다는 뜻입니다.

새로운 systemd 시스템을 사용하여 이를 어떻게 달성할 수 있습니까?

답변1

이 답변은 주로 다음 문서를 기반으로 합니다.systemd.kill이지만 몇 가지 테스트를 거친 후 업데이트되었습니다. 물론 이것이 문제에 대한 완벽한 해결책은 아닙니다.

설정으로SendSIGKILL=no유닛 파일에서 프로세스가 종료되는 것을 방지할 수 있습니다. SIGTERM첫 글자 전송을 허용하려면 KillMode이 옵션을 기본값(예: )으로 되돌려 야 할 수도 있습니다 control-group.

이러한 설정을 사용하면 실행은 systemctl stop machine.service다음과 같아야 합니다.

  1. ExecStop=유닛 파일에 지정된 명령이 없으므로 SIGTERMa가 프로세스로 전송됩니다.

  2. 90초( DefaultTimeoutStopSec) 후에 systemd프로세스를 강제 종료하는 것이 좋습니다.

  3. SendSIGKILL설정되어 있으므로 ( ) 는noSIGKILLFinalKillSignal아니요프로세스로 전송되면 프로세스가 계속 실행됩니다.

실제로 프로세스에 전송되는 유일한 신호 systemctl stop는 입니다 SIGTERM. 처리는 SIGTERM애플리케이션 자체 내에서 처리되므로 systemctl stop예상대로 작동해야 합니다. 즉, 원격 컴퓨터가 종료되면 애플리케이션을 중지하고 원격 컴퓨터가 시작되면 시간 초과됩니다.

Michał Politowski는 자신의 리뷰에서 이러한 접근 방식의 문제점을 지적했습니다. 즉, systemd중지 시간 초과가 만료되면 장치는 실패한 것으로 간주됩니다. 이는 프로세스 자체에는 영향을 미치지 않지만 systemd가 프로세스에 대해 생각하는 방식을 변경합니다. 장치가 이 상태에 있는 동안 또 다른 "systemctl start" 명령을 실행하면 두 개의 프로세스가 발생하게 됩니다.

사용한 옵션은 KillMode=none프로세스 종료 논리를 완전히 방지합니다. 그러나 결과는 이 접근법과 유사했습니다. 프로세스가 계속 실행되는 동안 장치 상태는 비활성으로 변경됩니다.

참고로 90초 시간 제한은 다음과 같이 구성할 수 있습니다.TimeoutStopSec.

관련 정보