본문 바로가기

Linux/systemd

systemd로 서비스 관리하기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

systemd로 서비스를 관리하기 위해서는 먼저 systemctl이란 명령을 알아야합니다.

systemctl은 systemd의 전반적인 설정에 필수적인 명령으로, 앞으로 systemd를 사용하기 위해서 가장 많이 사용할 명령입니다.


먼저 시스템 내부의 유닛들을 보기 위해서 list-units 라는 내부 명령이 있습니다. 

$ systemctl list-units

이렇게 정말 다양한 unit들이 존재합니다. list-units는 기본적으로 실행중인 유닛들을 표시합니다. 만약 모든 유닛들을 보고싶다면 --all 옵션을 사용하면 됩니다.

$ systemctl --all list-units

여기서는 service 유닛들을 다룰 예정이라 이 유닛들만 보기 위해서는 -t 옵션을 사용하면 됩니다.

$ systemctl -t service list-units

현재 제 컴퓨터에서는 이러한 서비스들이 작동중입니다. 실행중이지 않은 서비스도 보고싶다면 --all 옵션을 함께 사용하시면 됩니다. 여기서 중요한 점은 unit-lists 명령은 실행중이 아니면서 부팅 때 로드되지 않은 (즉 enabled 되지 않은) 유닛은 출력하지 않습니다. 그러므로 제 컴퓨터에는 nginx 가 설치되어 있지만 부팅 때 실행하도록 설정하지 않아서 표시되지 않습니다. 이러한 유닛들까지 모두 표시하려면 list-unit-files 명령을 사용해야합니다.

$ systemctl -t service list-unit-files

상당히 다양한 서비스들이 존재하는 것을 볼 수 있습니다.


이제 각 서비스들의 상태를 자세히 보려면 status 명령을 사용하면 됩니다. status 명령 뒤에는 유닛 파일 이름이 오면 되는데 기본적으로 확장자를 붙히지 않는다면 .service 유닛으로 간주합니다. 그러므로 tmp.mount 유닛의 상태를 보기 위해서 systemctl status tmp 로 적으면 tmp.service를 못찾았다고 나옵니다.

$ systemctl status "유닛 명"

예시로 nginx 서비스 상태를 표시해봤습니다.

여기서 Loaded: 뒤의 정보들을 보면 경로과 disabled; vendor preset: disabled 가 있습니다. 먼저 경로는 해당 service 유닛이 존재하는 위치를 보여줍니다. 그리고 중간의 disabled는 현재 이 서비스는 부팅 시 자동으로 실행하지 않는다는 것을 나타냅니다. 마지막으로 vendor preset: disabled는 이 서비스가 기본 설정으로 부팅 시 자동 실행되지 않는다는 것을 나타냅니다. 우분투 같은 경우 nginx를 설치하면 자동으로 부팅 때 시작되는데 이 경우에는 vendor preset: enabled로 표시됩니다.

그 밑의 Active: 를 보면 현재 작동중이지 않다는 것을 보여줍니다.


밑에 5줄의 로그가 표시되었는데 이건 systemd와 nginx가 실행하면서 출력한 문자들로 systemd-journald에서 이 서비스에 관련된 부분을 알아서 가져와서 표시해준 겁니다.


본격적으로 서비스를 관리하기 위해서 서비스를 실행하는 방법을 알아야 합니다. 옛날의 init 시절엔 service [서비스 명] start 명령을 자주 사용했는데 systemd 또한 이와 비슷한 명령을 가지고 있습니다.

$ sudo systemctl start "유닛 명"

단지 start의 위치가 앞으로 왔을 뿐입니다. 서비스가 제대로 실행되면 아무런 출력이 없습니다. 만약 설정 문제로 인해 실행 도중 죽어버린다면 추가적으로 status와 journalctl 정보를 확인하라는 메시지가 나옵니다.

또 예시로 nginx 서비스를 실행해 봤습니다.

Active: 가 active (running)으로 표시된 것을 볼 수 있습니다. 밑의 로그에 붉은 글자는 제가 nginx 설정을 잘못해서 표준 에러로 nginx가 출력한 것으로 보입니다. 다만 nginx가 종료하지 않은걸 보니 실행 자체에 문제는 없었나봅니다.


서비스 종료도 마찬가지입니다. 시작하는 명령에서 start를 stop으로 바꾸면 서비스는 종료됩니다.

$ sudo systemctl stop "유닛 명"

추가적으로 다시 시작하는 restart, 설정 파일을 reload 명령도 알아두면 좋습니다.

$ sudo systemctl restart "유닛 명"
$ sudo systemctl reload "유닛 명"

주의할 점은 reload는 service 유닛에 ExecReload가 정의되어 있지 않다면 SIGHUP을 해당 프로세스에 보냅니다. 많이 사용되는 프로그램에서는 시그널 처리가 잘 되어있을테니 그리 걱정이 없지만 자신이 대충 적당히 만든 프로그램을 서비스로 등록하고 reload 명령을 내렸다간 SIGHUP을 받고 죽어버릴 수 있으니 유의하시기 바랍니다.


만약 프로그램을 시작 프로그램으로 등록하고 싶다면 enable 명령이 있습니다.

$ sudo systemctl enable "유닛 명"

이 명령을 실행하면 시작 프로그램으로 등록됩니다.

Loaded: 를 보시면 중간에 enabled로 바뀐 것을 확인할 수 있습니다. enable는 단지 시작 프로그램으로 등록하는 것이기 때문에 이 명령을 내린다고 프로그램이 실행되진 않습니다.


enable 명령이 있으면 당연히 disable 명령도 존재합니다. 이 명령의 동작 또한 enable과 반대로 시작 프로그램에서 해제하는 것입니다.

여기까지 사용법을 익혔다면 기초적인 서비스 관리에 어려움이 없을겁니다. 최근의 배포판들이 대부분 systemd를 채용하고 있고, 패키지들도 systemd의 서비스 유닛을 포함하고 있으니 systemctl을 통해 서비스를 관리하는 방법을 알아두는 것이 중요합니다.

'Linux > systemd' 카테고리의 다른 글

systemd 사용자 유닛 만들기  (0) 2019.01.09
리눅스 시스템 시간 동기화하기  (0) 2018.12.30
systemd timer로 cron 대체하기  (4) 2018.12.30
systemd란 무엇인가  (0) 2018.12.27
systemd-resolved 사용하기  (2) 2018.12.23