활용하기

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

 

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

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

    • 안녕하세요. 답변이 조금 늦었네요..ㅠㅠ
      쉘에서 in-active로 나타나는 경우는 여러가지가 있습니다.
      1. 올바르지 않은 프로세스이거나 확인이 되지 않은 경우
      2. initd와 같이 systemd가 아닌 방법으로 서비스가 시작된 경우
      -> systemd(systemctl restart ####)로 수동으로 서비스를 정지 및 재시작한 후 재시도해보시기 바랍니다.

      해당 프로세스가 다시 실행되는지에 대한 확인 방법은 스크립트를 반복적으로 실행할 수 있도록 crond 설정을 해주시거나,
      포스트 예제의 내용을 한 번 더 호출하는 방법이 있을 것 같습니다.

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

1개월 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

7개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

9개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

9개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

9개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

9개월 ago