Home » OS » 리눅스 » ubuntu systemctl service 종료 시 자동 재시작 하게 해 봅시다.

ubuntu systemctl service 종료 시 자동 재시작 하게 해 봅시다.

데몬으로 돌고 있는 서비스가 갑자기 실패하면 어떻게 될까요? 서버의 경우, 자동 재시작이 없다면 재부팅 될 때 까지 접속할 수 없을 겁니다. 즉, ubuntu systemctl service 종료 자동 재시작 하게 하려면, Restart 옵션을 service 파일에 넣어두면 됩니다.


test 서비스를 강제 종료시켜 보기

서비스를 9번 시그널1을 날려서 종료해 봅시다.

[그림 1] test 서비스의 상태 보기

먼저, status 명령어로 서비스 test의 상태를 보겠습니다. Active가 active (running)으로, 현재 실행되고 있음을 의미합니다. Main PID가 있는데요. 875입니다. 이 프로세스에 9번 시그널을 보내서 강제로 종료되게 해 보겠습니다.

9번 시그널은 무시하거나 잡을 수도 없습니다.

[그림 2] Fail이 된 서비스

-9번은 시그널 9번을 보내겠다는 의미입니다. 뒤에 875는 pid를 의미해요. 875번 프로세스는 돌고 있었던 test 서비스를 의미하기 때문에, 모종의 에러가 발생하여 종료되었다고 상정한 것입니다. 다음에 다시 test의 상태를 보니, failed가 뜨게 되었습니다.

이 상황에서 일정 시간 후에 다시 띄우고 싶다면 어떻게 하면 될까요? 해결책은 간단합니다.

  • 실패 상태로 종료한 경우
  • 자동 재시작 옵션을 넣는다.

이것을 test.service 파일에 정의하겠습니다. /usr/lib/systemd/system의 test.service 파일을 수정합니다.

[그림 3] 수정된 service 파일

[Service] 탭에 Restart와 RestartSec가 있습니다. 이는 아래를 의미합니다.

  • Restart=on-failure
    • 재시작 옵션입니다.
    • 비정상 종료 되었을 때 재시작을 하게 됩니다.
  • RestartSec=5s

아래 두 줄을 추가하고 다시 실행시켜 보겠습니다. 서비스 파일을 새롭게 로드하는 방법은 이 에 간단하게 나와 있으니, 참고해 주세요.


다시 9번 시그널을 날려 보기

다시 test 서비스를 실행시켜 봅시다. 9번을 실행되고 있는 서비스에 날려 보겠습니다.

[그림 4] 돌고 있는 test 서비스

2436번 프로세스로 돌고 있군요. 그러면 9번 시그널을 2436으로 보내면 되겠네요.

[그림 5] 2436번에 9번 시그널 보내기

이제 다시 status를 보겠습니다. 그러면, Active 상태가 activating이 됩니다. 이 상태에서 몇 초만 더 기다려 봅시다.

[그림 6] 다시 활성화 된 서비스

몇 초간 더 기다려 보니, Active가 active (running)으로 되었습니다. 여기까지 상황을 정리해 봅시다.

  • 9번 시그널을 날려서 test 서비스를 강제 종료시켰습니다.
  • fail exit 되었으므로 재시작 조건에 맞았습니다.
  • 따라서 5초 후에 자동 재시작을 하게 되었습니다.

그런데, 사실 프로그램은 비정상적으로 종료될 수도 있지만, 정상적으로 종료될 수도 있습니다. 아래 케이스를 봅시다.


정상적으로 종료된 경우

아까와는 다르게 2번 시그널을 날려보겠습니다. 그러면 어떻게 될까요?

[그림 7] test 서비스에 2번 시그널 날리기

이 경우에는 5초 후에 자동으로 실행될까요? 안타깝게도 그렇지 않습니다. 왜?

  • 성공적으로 종료되었습니다.
  • 고로 재시작 조건을 만족하지 않았습니다.

종료 후 10초 뒤의 상황을 보겠습니다.

[그림 8] 여전히 멈춰 있는 test

여전히 실행 중이 아님을 볼 수 있습니다. test.service 파일을 어떻게 바꿔야 할까요?

[그림 9] 바뀐 서비스 파일

Restart 옵션을 on-failure에서 on-success로 바꾸었습니다. 이러면 성공적으로 종료된 경우 다시 재시작을 하게 됩니다. 이제 test 서비스를 다시 재시작 합니다. 그리고 나서, 돌고 있는 test 서비스에 2번 시그널을 날려보겠습니다.

[그림 10] 2번 시그널 다시 날리기

종료가 성공적으로 된 상태입니다. 그 다음에 5초만 기다려 보겠습니다. 어떻게 될까요?

[그림 11] 성공적으로 다시 시작된 test

다시 재시작 되었음을 볼 수 있어요. 반면에 9번 시그널을 날렸다면, 5초 후에도 재시작 되지 않았을 겁니다. 재시작 조건을 만족하지 않기 때문입니다.


종료 시 자동 재시작 하게 하기

그러면 ubuntu systemctl service 종료 자동 재시작 하게 하려면 어떻게 해야 할까요? 정상적으로 종료되던 그렇지 않던지요. 이 경우 항상, always 옵션을 사용하면 됩니다.

[그림 12] 종료 시 항상 재시작하게 하기

Restart=always가 보이시나요? 이는 서비스가 정상적으로 종료되던, 비정상적으로 종료되던 항상 재시작 한다는 의미입니다. 다시 서비스 파일을 reload 하고, 9번 시그널과 2번 시그널을 날려서 재시작 되는지 검증해 보도록 하겠습니다.

[그림 13] test 서비스에 9번 시그널 날리기

9번은 비정상 종료를 의미합니다. 5초 후에 다시 띄워졌는지 확인해 봅시다.

[그림 14] 다시 띄워진 test 서비스에 2번 날리기

다시 띄워졌습니다. 이는, 비정상 종료가 always 조건에 만족하기 때문입니다. 이제 2번을 날려서 서비스가 정상 종료되게 한 다음에, 몇 초 후에 서비스가 정상적으로 띄워졌는지 확인해 보겠습니다.

[그림 15] 정상적으로 띄워진 test

몇 초가 지난 후, 정상적으로 띄워졌음을 볼 수 있습니다. 정리하자면, 이 글에서 Restart에 쓴 옵션들은 아래와 같습니다.

  • on-failure
    • 비정상 종료 시 재시작 합니다.
  • on-success
    • 정상 종료 시 재시작 합니다.
  • always
    • 정상 종료되건, 비정상 종료되건 재시작 합니다.
  1. 절대로 잡거나 무시될 수 없는 신호 중 하나입니다. ↩︎

Leave a Comment

17 + 15 =