SERVICE_RESULT에 "start-limit-hit"이 포함되도록 서비스를 실패시키는 방법

SERVICE_RESULT에 "start-limit-hit"이 포함되도록 서비스를 실패시키는 방법

그래서 ExecStopPost에서 스크립트를 실행하는 시스템 서비스가 있습니다.

[Unit]
Description=foobar-test
StartLimitBurst=3
StartLimitIntervalSec=120

[Service]
Type=simple
ExecStart=/do_something.sh
ExecStopPost=/handle_stop.sh $SERVICE_RESULT
Restart=on-failure
RestartSec=1

[Install]
...

"do_something.sh" 스크립트는 반환 코드 1로 종료되므로 시작 제한에 도달할 때까지 서비스가 실패해도 계속 다시 시작됩니다.

"handle_stop.sh" 스크립트는 $SERVICE_RESULT의 내용만 인쇄합니다.

서비스가 시작 제한에 도달하면 $SERVICE_RESULT의 내용은 예상대로 "Start Limit Hit" 대신 "Exit Code"입니다.문서

내가 뭔가 잘못하고 있는 걸까요, 아니면 시스템의 버그인가요?

systemd 버전: systemd 244 (244.5+) +PAM -AUDIT -SELINUX +IMA -APPARMOR -SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN - PCRE2 기본 계층=혼합

답변1

man 5 systemd.exec설명하다:

"start-limit-hit": 장치에 대해 시작 제한이 정의되어 있으며 제한에 도달하면 장치가 시작되지 않습니다.

man 5 systemd.unit설명하다:

시작 제한에 도달한 Restart=로 구성된 장치는 더 이상 다시 시작을 시도하지 않지만 간격이 경과한 후에도 수동으로 또는 타이머나 소켓에서 다시 시작할 수 있습니다.

systemd이것이 문서에 따라 수행되었다고 주장할 수 있습니다 . start-limit-hit이는 장치가 부팅에 실패한 경우에만 발생합니다. 그러나 이미 시작된 장치를 Restart=(재)시작하려는 시도는 이루어지지 않습니다 .StartLimitBurst=StartLimitIntervalSec=

하지만 나는 이런 접근 방식이 나타나도록 노력했습니다.

먼저 버스트를 트리거한 다음 다른 버스트를 시도하여 systemctl start수동으로 시작했습니다. systemd는 해당 제한을 초과하는 장치를 다시 시작하지 않기 때문에 부팅 제한에 도달한 후에는 장치가 시작되지 않는다고 가정합니다. 사실이라면 이 실험에서 명시적으로 시작 명령을 내리고 필수 코드를 제공했을 때 장치가 시작되지 않습니다.

$ systemctl --user cat startlimit.service 
# ~/.config/systemd/user/startlimit.service
[Service]
ExecStart=/bin/false
Restart=always
StartLimitIntervalSec=20

$ systemctl --user start startlimit.service
$ systemctl --user start startlimit.service
Job for startlimit.service failed because the control process exited with error code.
See "systemctl --user status startlimit.service" and "journalctl --user -xeu startlimit.service" for details.

$ systemctl --user status startlimit.service
× startlimit.service
     Loaded: loaded (/home/stew/.config/systemd/user/startlimit.service; static)
     Active: failed (Result: exit-code) since Mon 2022-10-24 18:10:11 CEST; 5s ago
   Duration: 1ms
    Process: 5008 ExecStart=/bin/false (code=exited, status=1/FAILURE)
   Main PID: 5008 (code=exited, status=1/FAILURE)
        CPU: 1ms

Oct 24 18:10:11 systemd[1129]: startlimit.service: Scheduled restart job, restart counter is at 5.
Oct 24 18:10:11 systemd[1129]: Stopped startlimit.service.
Oct 24 18:10:11 systemd[1129]: startlimit.service: Start request repeated too quickly.
Oct 24 18:10:11 systemd[1129]: startlimit.service: Failed with result 'exit-code'.
Oct 24 18:10:11 systemd[1129]: Failed to start startlimit.service.
Oct 24 18:10:12 systemd[1129]: startlimit.service: Start request repeated too quickly.
Oct 24 18:10:12 systemd[1129]: startlimit.service: Failed with result 'exit-code'.
Oct 24 18:10:12 systemd[1129]: Failed to start startlimit.service.

이 가정은 잘못된 것으로 판명되었습니다.

다음 추측은 "아마도 systemctl이 해당 제한을 초과하는 장치 시작을 거부할 것입니다"입니다. "어쩌면 이것은 시스템이 스스로 실행해야 하는 것일 수도 있습니다." 이를 위해 위와 같은 또 다른 일회성 가상 서비스를 만들었습니다 Wants=. 그러다가 몇 번이나 발동시켰어요.

$ systemctl --user cat startlimit{,Wanter.service}
# ~/.config/systemd/user/startlimit.service
[Service]
ExecStart=/bin/false
Restart=always
StartLimitIntervalSec=20

[Install]
WantedBy=startlimitWanter.service

# ~/.config/systemd/user/startlimitWanter.service
[Service]
Type=oneshot
ExecStart=/bin/true

$ systemctl --user start startlimitWanter.service
$ systemctl --user start startlimitWanter.service
$ systemctl --user start startlimitWanter.service
$ systemctl --user status startlimit{,Wanter.service}
× startlimit.service
     Loaded: loaded (~/.config/systemd/user/startlimit.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Mon 2022-10-24 18:13:49 CEST; 7s ago
   Duration: 1ms
    Process: 5066 ExecStart=/bin/false (code=exited, status=1/FAILURE)
   Main PID: 5066 (code=exited, status=1/FAILURE)
        CPU: 1ms


Oct 24 18:13:50 systemd[1129]: Failed to start startlimit.service.
Oct 24 18:13:52 systemd[1129]: startlimit.service: Start request repeated too quickly.
Oct 24 18:13:52 systemd[1129]: startlimit.service: Failed with result 'exit-code'.
Oct 24 18:13:52 systemd[1129]: Failed to start startlimit.service.

○ startlimitWanter.service
     Loaded: loaded (~/.config/systemd/user/startlimitWanter.service; static)
     Active: inactive (dead)

Oct 24 18:13:48 systemd[1129]: Starting startlimitWanter.service...
Oct 24 18:13:48 systemd[1129]: Finished startlimitWanter.service.
Oct 24 18:13:50 systemd[1129]: Starting startlimitWanter.service...
Oct 24 18:13:50 systemd[1129]: Finished startlimitWanter.service.
Oct 24 18:13:52 systemd[1129]: Starting startlimitWanter.service...
Oct 24 18:13:52 systemd[1129]: Finished startlimitWanter.service.

그 사람도 네 소식을 듣지 못했어.

이 시점에서 나는 당신이 버그를 발견했다는 데 동의하고 싶습니다.

관련 정보