리눅스 systemd와 systemctl 명령어
systemd는 기존의 init 시스템을 대체할 새로운 프로세스 관리 시스템이며 최신 리눅스 시스템에는 대부분 systemd
를 채택하고 있기 때문에 어떤 배포판이던 상관없이 systemd
관련 동작이나 명령의 파악이 중요해져가고 있습니다.
systemd
는 서비스를 시작, 중지하는 등의 대부분의 서비스를 관리할 수 있도록 하는 systemctl
명령어가 있습니다.
예를 들어 Nginx 서버의 설정을 변경해서 서비스를 다시 시작해야 하는 경우 다음 명령어와 같이 사용할 수 있습니다.
[root@localhost ~]# systemctl restart nginx 또는 [root@localhost ~]# systemctl reload nginx
이는 기존의 대부분의 배포판에서 존재했던 service
명령어와 비슷하지만, systemctl
은 서비스명과 동작 값을 뒤바꾸어 작성해야 합니다. nginx restart
가 아닌 restart nginx
가 올바른 명령이기 때문에 기존 리눅스 사용자에게는 살짝 혼동될 수도 있을 것입니다.
systemctl 명령어로 서비스 구동 여부 확인하기
아무튼 systemctl
의 명령어 중에서는 서비스의 구동 상태를 확인할 수 있는 명령어 또한 존재합니다.
systemctl
의 명령어를 살펴보겠습니다. 여기에 자세히 살펴보면 is-active
라는 명령이 있을 것입니다.
[root@localhost ~]# systemctl add-requires force-reload list-sockets set-environment add-wants get-default list-timers set-property cancel halt list-unit-files show cat help list-units show-environment condreload hibernate mask snapshot condrestart hybrid-sleep poweroff start condstop is-active preset status daemon-reexec is-enabled reboot stop daemon-reload is-failed reenable suspend default isolate reload switch-root delete is-system-running reload-or-restart try-restart disable kexec reload-or-try-restart unmask edit kill rescue unset-environment emergency link reset-failed enable list-dependencies restart exit list-jobs set-default
다음 명령어를 사용하면 systemctl
로 서비스 구동 여부를 확인할 수 있습니다.
systemctl is-active [서비스명]
만약 nginx
서비스가 구동 중인지 확인하려면 다음과 같이 입력합니다.
systemctl is-active nginx
결과 값은 다음과 같이 나타날 것입니다. 서비스가 문제 없이 구동 중임을 알 수 있을 것입니다.
active
상태는 대략 3가지로 보여질 것입니다. 각각의 의미는 다음과 같습니다.
- active : 서비스가 현재 구동 중 상태임
- inactive : 서비스가 현재 정지 상태임
- unknown : 서비스를 찾을 수 없음 (설치되지 않았거나 잘못된 이름)
리눅스 bash 스크립트 – 서비스 구동 여부 확인
이제 이를 활용하여 간단히 서비스를 체크하고 정지 상태의 서비스를 자동으로 시작하는 스크립트를 만들어보겠습니다.
bash 스크립트(셸 스크립트) 파일을 만들기 위해 원하는 디렉토리에서 다음 명령어를 실행합니다. 여기서는 서비스 재시작을 위해 어차피 root
권한이 필요하므로 root
사용자로 작업을 해보도록 하겠습니다.
[root@localhost]# touch serviceCheck.sh
다음으로 해당 파일의 권한을 소유자만 읽고 쓰고 실행할 수 있는 상태로 만듭니다.
[root@localhost]# chmod 700 serviceCheck.sh
이제 vim
이나 nano
등의 편집기로 해당 파일을 열어 편집 상태로 만듭니다.
[root@localhost]# vim serviceCheck.sh
파일 안에 다음 내용을 붙여넣습니다.
#!/bin/bash servicename="nginx" echo "현재 $servicename 서비스 상태 : $(systemctl is-active $servicename)" if [ $(systemctl is-active $servicename) == "inactive" ]; then echo "$servicename 서비스를 재시작하는 중..." service $servicename restart fi
필요에 따라 servicename
의 값을 변경하면 해당 서비스를 체크하게 됩니다.
위 내용을 여러번 복사하거나 반복문으로 처리하게 되면 다양한 서비스를 한꺼번에 확인할 수도 있습니다.
이제 serverCheck
스크립트를 실행해보겠습니다. 문제 없이 실행되고 있습니다.
[user@localhost ~]$ ./serverCheck.sh 현재 nginx 서비스 상태 : inactive nginx 서비스를 재시작하는 중... Redirecting to /bin/systemctl restart nginx.service
좋은 정보 감사드립니다. 잘 활용할 수 있을 듯 합니다.
근데 추가로 쉘스크립트 상에서 특정 프로세스 실행 후, 다시 해당 프로세스가 실행되는 지 쉘상에서 조회 시
fail (in-active) 로 확인 되는 데 혹시 쉘상에서 확인 할 수 있는 방법이 있을까요?
쉘스크립트 종료 후 command 창에서 조회하면 실행되어 있는데, 쉘상에서 조회하면
이상하게 fail로 확인 이 되네요.
안녕하세요. 답변이 조금 늦었네요..ㅠㅠ
쉘에서 in-active로 나타나는 경우는 여러가지가 있습니다.
1. 올바르지 않은 프로세스이거나 확인이 되지 않은 경우
2. initd와 같이 systemd가 아닌 방법으로 서비스가 시작된 경우
-> systemd(systemctl restart ####)로 수동으로 서비스를 정지 및 재시작한 후 재시도해보시기 바랍니다.
해당 프로세스가 다시 실행되는지에 대한 확인 방법은 스크립트를 반복적으로 실행할 수 있도록 crond 설정을 해주시거나,
포스트 예제의 내용을 한 번 더 호출하는 방법이 있을 것 같습니다.