JooTC
circuit-card

리눅스 bash 스크립트 – Systemd로 서비스 구동 여부 확인

리눅스 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

 

구독
알림
guest

2 Comments
Inline Feedbacks
모든 댓글 보기
jysgangyu
jysgangyu
5 년 전에

좋은 정보 감사드립니다. 잘 활용할 수 있을 듯 합니다.
근데 추가로 쉘스크립트 상에서 특정 프로세스 실행 후, 다시 해당 프로세스가 실행되는 지 쉘상에서 조회 시
fail (in-active) 로 확인 되는 데 혹시 쉘상에서 확인 할 수 있는 방법이 있을까요?
쉘스크립트 종료 후 command 창에서 조회하면 실행되어 있는데, 쉘상에서 조회하면
이상하게 fail로 확인 이 되네요.

2
0
이 포스트에 대한 의견을 남겨주세요!x