본문 바로가기
프로젝트/라즈베리

[5] Systemd 를 이용한 go 어플리케이션 프로세스 관리

by Riverandeye 2020. 10. 12.

최근에 배포한 서비스의 서버가 자꾸 꺼지는 현상이 발생합니다. 

로그에도 프로세스가 종료된 흔적이 남지 않았어요... (당황) 

현재 추정하는 이유는 라즈베리가 혼자 죽는것 때문이라고 생각을 하고 있어요. 

시스템 로그에 다음과 같이 저전력 상황이라는 메세지가 자꾸 떴기 때문이죠. 

 

/var/log/messages

오래된 낡은 멀티탭을 문어발 식으로 쓰다 보니까 이런 문제가 생기는 것으로 생하고 있습니다. 

전력이 낮아 서버가 죽었다가 다시 켜지면서, 자동으로 go 프로세스가 켜지지 않아서 서버가 죽는 것 처럼 보였던거죠.

좀 제대로 된 멀티탭을 사서 개선을 해야겠습니다. 

 

당장 수많은 사용자가 쓰고 있는 서비스는 아니기 때문에

우선 서버가 껐다 켜지면 자동으로 go 프로세스가 재실행될 수 있게 구성하려고 합니다. 

그래서 검색을 해보니 이런 게 있었습니다. 또 검색해보니 Systemd 라는게 꼭 Debian에 국한된 것이 아니라

다른 리눅스 배포판에서도 사용되는 것이라는 걸 알게 되었습니다. 

 

시스템을 껏다 켰다 프로세스를 자동으로 실행하는 것 뿐만 아니라  

다양한 역할을 맡는 것으로 생각이 되는데요

나중에 좀 더 알게 되면 정리하고 배우고 싶네요

nginx를 껐다 켤 때 Systemctl을 쓰는데, 이것도 Systemd 를 사용하기 위한 Utility 라고 하더라구요 (몰랐습니다) 

 

Systemd 에 service 등록하기

우선 Systemd에서 관리할 서비스를 등록해봅시다. 

/etc/systemd/system 폴더에 들어가면 여러 service들이 정의되어 있을 것입니다. 

다양한 Service와 wants

여기에 추가하고 싶은 service에 대한 파일을 생성한 후 다음을 작성합니다. 

 

 

아주 간단하게 Go 서버를 빌드하면 생성되는 Executable을 다음과 같이 ExecStart로 등록하고 

해당 Process 내 정의된 Scope의 Config를 지정하기 위해 WorkingDirectory를 적절하게 선택합니다. 

중요한 부분은 Restart 조건을 다음과 같이 always, RestartSec 를 5로 지정하는 것입니다. 

 

다음과 같이 설정한 후 Systemctl을 이용해서 해당 서비스를 enable 해줍니다. 

enable 시 해당 서비스가 부팅시 자동 구동되게 됩니다. 

Systemctl start 명령어를 이용해 해당 서비스를 시작해줍니다. 

 

백그라운드에서 실행되는 프로세스에 대한 syslog는 journalctl 명령을 통해 조회할 수 있습니다. 

journalctl 로그

자세히 보면, 처음 서버 구동시 커넥션 오류가 있었는데,

Systemd가 서비스를 5초후에 다시 스케줄링해서 실행하는 것을 확인할 수 있습니다.

restart counter를 통해 몇번 재실행 되었는지를 확인할 수 있습니다.

 

해당 로그를 실시간으로 확인하고 싶으면 journalctl의 -f 옵션을 사용하시면 됩니다. 

설정이 완료된 후 서버를 restart 하고 나서도 자동으로 프로세스가 실행되어 있는 것을 확인할 수 있을 것입니다. 

 

사실 이게 Go에 국한된 것은 아니고, 서버에 설정해 주고 싶은 어떤 프로세스든 직접 설정하여 구성하고 관리할 수 있습니다.

일종의 프로세스 통합 관리 시스템이라고 생각하시면 될 것 같습니다. 

 

도움이 되셨다면 구독 좋아요와 댓글 부탁드립니다 :) 

댓글