- GuessMainPID=
안정적으로 결정할 수 없는 경우 systemd가 서비스의 기본 PID를 추측해야 하는지 여부를 지정하는 부울 값을 사용합니다. Type=forking이 설정되고 PIDFile=이 설정 해제되지 않는 한 이 옵션은 무시됩니다. 다른 유형이나 명시적으로 구성된 PID 파일의 경우 기본 PID가 항상 알려져 있기 때문입니다. 데몬이 둘 이상의 프로세스로 구성된 경우 추측 알고리즘이 잘못된 결론에 도달할 수 있습니다. 주 PID를 결정할 수 없으면 장애 감지 및 서비스 자동 재시작이 안정적으로 작동하지 않습니다. 기본값은 예입니다.
- ExecStop=
ExecStart=를 통해 시작된 서비스를 중지하기 위해 실행할 명령입니다. 이 인수는 위의 ExecStart=에 대해 설명한 것과 동일한 체계에 따라 여러 명령줄을 사용합니다. 이 설정의 사용은 선택 사항입니다. 이 옵션에 구성된 명령이 실행된 후 서비스가 중지되었음을 의미하며 서비스에 남아 있는 모든 프로세스는 KillMode= 설정에 따라 종료됩니다(systemd.kill(5) 참조). 이 옵션을 지정하지 않으면 서비스 중지 요청 시 KillSignal= 또는 RestartKillSignal=에 지정된 신호를 보내 프로세스를 종료합니다. 지정자 및 환경 변수 대체가 지원됩니다($MAINPID 포함, 위 참조).
일반적으로 서비스에 종료를 요청하기만 하고(예를 들어 어떤 형태의 종료 신호를 서비스에 전송하여) 종료를 기다리지 않는 이 설정에 대한 명령을 지정하는 것만으로는 충분하지 않습니다. 명령이 종료된 직후 위에서 설명한 대로 KillMode= 및 KillSignal= 또는 RestartKillSignal=에 따라 서비스의 나머지 프로세스가 종료되므로 완전히 중지되지 않을 수 있습니다. 따라서 지정된 명령은 비동기 작업이 아니라 동기 작업이어야 합니다.
- ExecStop=
ExecStop=에 지정된 명령은 서비스가 처음 성공적으로 시작된 경우에만 실행됩니다. 서비스가 전혀 시작되지 않았거나 시작이 실패한 경우(예: ExecStart=, ExecStartPre= 또는 ExecStartPost=에 지정된 명령이 실패했고 "-" 접두사가 붙지 않은 경우)는 호출되지 않습니다. , 위 참조) 또는 시간이 초과되었습니다. 서비스가 올바르게 시작되지 않고 다시 종료된 경우 ExecStopPost=를 사용하여 명령을 호출합니다. 또한 서비스의 프로세스가 자체적으로 종료되거나 종료된 경우에도 서비스가 성공적으로 시작되면 중지 작업이 항상 수행됩니다. 중지 명령은 이러한 경우를 처리할 준비가 되어 있어야 합니다. 중지 명령이 호출될 때 메인 프로세스가 종료되었음을 systemd가 알고 있으면 $MAINPID가 설정 해제됩니다.
서비스 다시 시작 요청은 중지 작업과 시작 작업으로 구현됩니다. 이는 ExecStop= 및 ExecStopPost=가 서비스 재시작 작업 중에 실행됨을 의미합니다.
완전한 종료를 요청하는 서비스와 통신하는 명령에 이 설정을 사용하는 것이 좋습니다. 사후 정리 단계의 경우 대신 ExecStopPost=를 사용하십시오.
- RestartSec=
서비스를 다시 시작하기 전에 휴면 시간을 구성합니다(Restart=로 구성된 대로). 초 단위의 단위 없는 값 또는 "5분 20초"와 같은 시간 범위 값을 사용합니다. 기본값은 100ms입니다.
- RestartSteps=
RestartSec=에서 RestartMaxDelaySec=까지 자동 재시작 간격을 늘리기 위해 수행할 단계 수를 구성합니다. 비활성화하려면 양의 정수 또는 0을 사용합니다. 기본값은 0입니다.
이 설정은 RestartMaxDelaySec=도 설정된 경우에만 유효합니다.
- RestartMaxDelaySec=
RestartSteps=로 간격이 증가함에 따라 서비스를 다시 시작하기 전에 가장 긴 휴면 시간을 구성합니다. RestartSec=과 같은 형식의 값 또는 "infinity"를 사용하여 설정을 비활성화합니다. 기본값은 "무한대"입니다.
이 설정은 RestartSteps=도 설정된 경우에만 유효합니다.
- WatchdogSec=
서비스에 대한 감시 시간 제한을 구성합니다. 시작이 완료되면 워치독이 활성화됩니다. 서비스는 "WATCHDOG=1"(즉, "keep-alive ping")을 사용하여 정기적으로 sd_notify(3)를 호출해야 합니다. 이러한 두 호출 사이의 시간이 구성된 시간보다 크면 서비스가 실패 상태가 되고 SIGABRT(또는 WatchdogSignal=에 지정된 신호)로 종료됩니다. Restart=를 on-failure, on-watchdog, on-abnormal 또는 항상으로 설정하면 서비스가 자동으로 다시 시작됩니다. 여기서 설정한 시간은 WATCHDOG_USEC= 환경 변수에서 실행된 서비스 프로세스로 전달됩니다. 이렇게 하면 서비스에 대한 감시 지원이 활성화된 경우 데몬 이 자동으로 keep-alive ping 로직을 활성화할 수 있습니다. 이 옵션을 사용하는 경우 NotifyAccess=(아래 참조)는 systemd에서 제공하는 알림 소켓에 대한 액세스를 열도록 설정해야 합니다. NotifyAccess=가 설정되지 않은 경우 암시적으로 기본으로 설정됩니다. 기본값은 0으로 이 기능을 비활성화합니다. 서비스는 서비스 관리자가 워치독 연결 유지 알림을 기대하는지 여부를 확인할 수 있습니다. 자세한 내용은 sd_watchdog_enabled(3)를 참조하십시오. sd_event_set_watchdog(3)는 자동 감시 알림 지원을 활성화하는 데 사용할 수 있습니다.
- Restart=
서비스 프로세스가 종료되거나 종료되거나 시간 초과에 도달했을 때 서비스를 다시 시작할지 여부를 구성합니다. 서비스 프로세스는 메인 서비스 프로세스일 수도 있지만 ExecStartPre=, ExecStartPost=, ExecStop=, ExecStopPost= 또는 ExecReload=로 지정된 프로세스 중 하나일 수도 있습니다. 프로세스 종료가 systemd 작업(예: 서비스 중지 또는 다시 시작)의 결과인 경우 서비스가 다시 시작되지 않습니다. 시간 초과에는 워치독 "keep-alive ping" 기한 누락과 서비스 시작, 다시 로드 및 작업 중지 시간 초과가 포함됩니다.
no, on-success, on-failure, on-abnormal, on-watchdog, on-abort 또는 always중 하나를 선택합니다. no(기본값)로 설정하면 서비스가 다시 시작되지 않습니다. on-success로 설정하면 서비스 프로세스가 정상적으로 종료된 경우에만 다시 시작됩니다. 이 맥락에서 클린 종료는 다음 중 하나를 의미합니다.
- exit code 0;
- Type=oneshot 이외의 유형에 대해서는 SIGHUP, SIGINT, SIGTERM 또는 SIGPIPE 신호 중 하나입니다.
- SuccessExitStatus=에 지정된 종료 상태 및 신호.
on-failure로 설정하면 프로세스가 0이 아닌 종료 코드로 종료되고 신호(코어 덤프 포함, 앞서 언급한 네 가지 신호 제외)에 의해 종료될 때 서비스가 다시 시작됩니다. reload) 시간이 초과되고 구성된 워치독 시간 초과가 트리거될 때. on-abnormal로 설정하면 시그널(코어 덤프 포함, 앞서 언급한 4가지 시그널 제외)에 의해 프로세스가 종료되거나, 작업 시간이 초과되거나, watchdog timeout이 트리거될 때 서비스가 다시 시작됩니다. on-abort로 설정하면 깨끗한 종료 상태로 지정되지 않은 잡히지 않은 신호로 인해 서비스 프로세스가 종료되는 경우에만 서비스가 다시 시작됩니다. on-watchdog으로 설정하면 서비스에 대한 감시 시간 초과가 만료된 경우에만 서비스가 다시 시작됩니다. 항상으로 설정하면 정상적으로 종료되었는지, 시그널에 의해 비정상적으로 종료되었는지, 타임아웃이 발생했는지에 관계없이 서비스를 다시 시작합니다.
Table 1. Exit causes and the effect of the Restart= settings
Restart Settings/Exit cause | no | always | on-success | on-failure | on-abnormal | on-abort | on-watchdog |
Clean exit code or signal | X | X | |||||
Unclean exit code | X | X | |||||
Unclean signal | X | X | X | X | |||
Timeout | X | X | X | ||||
Watchdog | X | X | X | X |
위의 설정에 대한 예외로 RestartPreventExitStatus=(아래 참조)에 종료 코드 또는 신호가 지정되거나 systemctl stop 또는 이와 동등한 작업으로 서비스가 중지된 경우 서비스가 다시 시작되지 않습니다. 또한 종료 코드 또는 신호가 RestartForceExitStatus=(아래 참조)에 지정된 경우 서비스는 항상 다시 시작됩니다.
서비스 다시 시작은 StartLimitIntervalSec= 및 StartLimitBurst=로 구성된 단위 시작 속도 제한의 적용을 받습니다. 자세한 내용은 systemd.unit(5)을 참조하십시오.
이를 오류 시 자동 복구를 시도하여 안정성을 높이기 위해 장기 실행 서비스에 권장되는 선택은 실패 시로 설정하는 것입니다. 자신의 선택에 따라 종료할 수 있는 서비스의 경우(즉시 다시 시작하지 않아도 됨) on-abnormal이 대안입니다.
- RestartMode=
서비스를 다시 시작하는 방법을 지정하는 문자열 값을 사용합니다.
- normal(기본값)로 설정하면 실패/비활성 상태를 거쳐 서비스가 다시 시작됩니다.
- direct로 설정하면 서비스는 자동 재시작 중에 실패/비활성 상태를 건너뛰고 바로 활성화 상태로 전환됩니다. ExecStopPost=가 호출됩니다. OnSuccess= 및 OnFailure=를 건너뜁니다.
이 옵션은 종속성이 일시적으로 실패할 수 있지만 이러한 일시적 실패로 인해 종속 장치가 실패하는 것을 원하지 않는 경우에 유용합니다. 이 옵션을 direct로 설정하면 종속 장치에 이러한 일시적 오류가 통지되지 않습니다.
- RestartPreventExitStatus=¶
기본 서비스 프로세스에 의해 반환될 때 Restart=로 구성된 다시 시작 설정에 관계없이 자동 서비스 다시 시작을 방지하는 종료 상태 정의 목록을 가져옵니다. 종료 상태 정의는 숫자 종료 코드 또는 종료 신호 이름일 수 있으며 공백으로 구분됩니다. 기본값은 빈 목록이므로 기본적으로 구성된 다시 시작 로직에서 종료 상태가 제외되지 않습니다. 예를 들어:
RestartPreventExitStatus=1 6 SIGABRT
종료 코드 1 및 6과 종료 신호 SIGABRT로 인해 자동 서비스가 다시 시작되지 않도록 합니다. 이 옵션은 두 번 이상 나타날 수 있으며 이 경우 다시 시작 방지 상태 목록이 병합됩니다. 빈 문자열이 이 옵션에 할당되면 목록이 재설정되고 이 옵션의 이전 할당은 모두 적용되지 않습니다.
이 설정은 ExecStartPre=, ExecStartPost=, ExecStop=, ExecStopPost= 또는 ExecReload=를 통해 구성된 프로세스에는 영향을 미치지 않지만 주 서비스 프로세스, 즉 ExecStart= 또는 (Type=, PIDFile에 따라 호출된 프로세스)에만 영향을 미칩니다. =, ...) 그렇지 않으면 구성된 기본 프로세스.
- RestartForceExitStatus=
Restart=로 구성된 다시 시작 설정에 관계없이 기본 서비스 프로세스에서 반환될 때 자동 서비스 다시 시작을 강제하는 종료 상태 정의 목록을 가져옵니다. 인수 형식은 RestartPreventExitStatus=와 유사합니다.
- FileDescriptorStoreMax=
sd_pid_notify_with_fds(3)의 "FDSTORE=1" 메시지를 사용하여 서비스에 대한 서비스 관리자에 저장할 수 있는 파일 설명자 수를 구성합니다. 이는 명시적 요청 또는 충돌 후 상태 손실 없이 다시 시작할 수 있는 서비스를 구현하는 데 유용합니다. 다시 시작하는 동안 닫히지 않아야 하는 열려 있는 소켓 및 기타 파일 설명자는 이러한 방식으로 저장될 수 있습니다. 애플리케이션 상태는 RuntimeDirectory=의 파일로 직렬화되거나 memfd_create(2) 메모리 파일 디스크립터에 저장될 수 있습니다. 기본값은 0입니다. 즉, 서비스 관리자에 파일 설명자를 저장할 수 없습니다. 특정 서비스에서 서비스 관리자에게 전달된 모든 파일 설명자는 다음 서비스 재시작 시 서비스의 기본 프로세스로 다시 전달됩니다(사용된 정확한 프로토콜 및 파일 설명자가 전달되는 순서에 대한 자세한 내용은 sd_listen_fds(3) 참조). 서비스 관리자에게 전달된 모든 파일 설명자는 POLLHUP 또는 POLLERR이 표시되거나 서비스가 완전히 중지되고 대기 중이거나 실행 중인 작업이 없을 때 자동으로 닫힙니다(후자는 FileDescriptorStorePreserve=로 조정할 수 있음, 아래 참조). . 이 옵션을 사용하는 경우 NotifyAccess=(위 참조)는 systemd에서 제공하는 알림 소켓에 대한 액세스를 열도록 설정해야 합니다. NotifyAccess=가 설정되지 않은 경우 암시적으로 기본으로 설정됩니다.
systemd-analyze(1)의 fdstore 명령을 사용하여 서비스 파일 설명자 저장소의 현재 콘텐츠를 나열할 수 있습니다.
서비스 관리자는 파일 디스크립터 저장소에 포함된 파일 디스크립터만 서비스 자체 프로세스로 전달하며 IPC 등을 통해 다른 클라이언트로는 전달하지 않습니다. 그러나 권한이 없는 클라이언트가 서비스의 현재 열려 있는 파일 설명자 목록을 쿼리할 수 있습니다. 따라서 민감한 데이터는 참조된 파일 내에 안전하게 배치될 수 있지만 저장된 파일 설명자의 메타데이터(예: 파일 이름에 포함됨)에 첨부되어서는 안 됩니다.
이 옵션을 0이 아닌 값으로 설정하면 이 서비스에 대해 호출된 프로세스에 대해 $FDSTORE 환경 변수가 설정됩니다. 자세한 내용은 systemd.exec(5)를 참조하십시오.
- FileDescriptorStorePreserve=
아니오, 예, 다시 시작 중 하나를 취하고 서비스의 파일 설명자 저장소를 해제할 시기(즉, 포함된 파일 설명자(있는 경우)를 닫을 시기)를 제어합니다. no로 설정하면 서비스가 중지될 때 파일 설명자 저장소가 자동으로 해제됩니다. 다시 시작하는 경우(기본값) 장치가 비활성 상태이거나 오류가 발생하지 않았거나 작업이 서비스를 위해 대기 중이거나 서비스가 다시 시작될 것으로 예상되는 동안 유지됩니다. 그렇다면 파일 설명자 저장소는 장치가 메모리에서 제거될 때까지(즉, 더 이상 참조되지 않고 비활성화될 때까지) 유지됩니다. 후자는 서비스 관리자가 종료될 때까지 파일 설명자 저장소의 항목을 고정된 상태로 유지하는 데 유용합니다.
systemctl clean --what=fdstore … 를 사용하여 파일 설명자 저장소를 명시적으로 해제합니다.
Example 3. Oneshot service
때때로 유닛은 파일 시스템 검사 또는 부팅 시 정리 작업과 같은 활성 프로세스를 유지하지 않고 작업을 실행해야 합니다. 이를 위해 Type=oneshot이 존재합니다. 이 유형의 단위는 지정된 프로세스가 종료될 때까지 대기한 다음 비활성 상태로 돌아갑니다. 다음 장치는 정리 작업을 수행합니다.
[Unit]
Description=Cleanup old Foo data
[Service]
Type=oneshot
ExecStart=/usr/sbin/foo-cleanup
[Install]
WantedBy=multi-user.target
systemd는 프로그램이 종료될 때까지 장치가 "시작" 상태에 있는 것으로 간주하므로 순서가 지정된 종속성은 프로그램이 완료될 때까지 기다린 후 시작됩니다. 실행이 완료된 후 장치는 "활성" 상태에 도달하지 않고 "비활성" 상태로 되돌아갑니다. 이는 장치를 시작하라는 또 다른 요청이 작업을 다시 수행함을 의미합니다.
Type=oneshot은 둘 이상의 ExecStart=를 지정할 수 있는 유일한 서비스 단위입니다. 여러 명령(Type=oneshot)이 있는 장치의 경우 모든 명령이 다시 실행됩니다.
Type=oneshot의 경우 Restart=always 및 Restart=on-success는 허용되지 않습니다.