본문 바로가기
  • 개발하는 곰돌이
Development/etc.

[Linux] 특정 프로세스를 종료하는 쉘 스크립트 작성하기

by 개발하는 곰돌이 2023. 3. 2.

목차

    시작 배경

    사내에서 프로젝트를 배포할 때 리눅스 서버에 nohup를 사용하여 배포하고 있었다. 그러다보니 기존에 실행중인 프로젝트를 종료하기 위해 매번 ps 명령어로 프로세스 id를 찾아서 종료하는 것이 여간 번거로운 일이 아니었다.

     

    그러다가 문득 든 생각이 그냥 실행만 하면 해당 프로세스를 종료해주는 프로그램을 만들면 되지 않을까?하는 것이었다. 처음에는 C를 사용하여 만들면 될거라 생각했는데 관련 내용을 찾다보니 그냥 쉘 스크립트 파일로도 충분히 가능한 일이어서 쉘 스크립트로 작성하게 되었다.

     

    그리하여 쉘 스크립트를 통해 따로 프로세스 id를 찾지 않고도 프로세스를 종료하고, 나아가 이를 다시 시작하는 쉘 스크립트를 작성해보았다.


    쉘 스크립트 작성

    먼저 터미널에서 vi {파일명.sh}를 입력하여 새로운 쉘 스크립트 파일을 생성하고 vim 편집기를 실행한다.

    vim 편집기

    명령어를 입력하면 위와 같은 화면이 나올텐데 여기서 i를 누르면 하단의 "{파일명.sh}" [New File]이라고 적힌 부분이 -- INSERT --로 바뀌면서 내용을 편집할 수 있게 된다.

    에디터에 아래 내용을 작성한다.

    var=$(ps -ef|grep $1|grep -v 'grep'|grep -v $0)
    pid=$(echo ${var} | cut -d " " -f2)
    
    if [ -n "${pid}" ]
    then
        kill -9 ${pid}
        echo $* is terminated.
    
    else
        echo $* is not running.
    fi

    각 라인에 대한 설명은 다음과 같다.

    • 1번째 줄 : 쉘 스크립트를 실행하면서 띄어쓰기로 주어진 매개변수를 이름으로 가진 프로세스를 ps 명령어로 검색하여, 그 결과를 var에 저장한다. 이 때, grep과 실행한 쉘 스크립트의 이름은 ps의 결과에서 제외된다.
    • 2번째 줄 : 위의 var를 띄어쓰기 단위로 자른 후 그 중 2번째 값을 pid에 저장한다.(ps -ef의 경우 2번째 값이 pid를 나타낸다.)
    • 4번째 줄 : pid의 길이가 0이 아니면 참이 되어 then 이하의 내용을 실행한다.
    • 5~7번째 줄 : pid의 길이가 0이 아니면 해당 pid를 가진 프로세스를 종료하고, 프로세스가 종료되었다고 터미널에 출력한다.
    • 9~10번째 줄 : pid의 길이가 0이라면 해당 프로세스는 실행중이 아니라고 터미널에 출력한다.
    • 11번째 줄 : if문의 종료를 나타낸다.

    만약 해당 프로그램으로 종료할 프로세스가 항상 같은 프로세스라면 첫번째 줄에 $1 대신 '{프로세스 이름}'을 입력하면 된다.

    var=$(ps -ef|grep 'test'|grep -v 'grep'|grep -v $0)

    또한 7번째 줄과 10번째 줄의 echo는 결과를 터미널에 출력하기 위해 넣었기 때문에 필요하지 않다면 제거해도 무방하다.

     

    모든 내용을 작성하였다면 esc를 누르고 :wq를 입력하여 저장하고 vim 에디터를 종료한다. 아래 내용에서는 제대로 pid를 가져왔는지 확인하기 위해 echo로 pid를 출력하는 부분을 추가했다.


    작성한 쉘 스크립트에 실행권한 부여

    기본적으로 vim 에디터로 파일을 작성하면 파일 소유자라면 읽기, 쓰기 권한만 부여되어 실행이 불가능하다.

    읽기, 쓰기 권한만 부여되어 있는 kill_process.sh

    그렇기 때문에 이렇게 작성한 쉘 스크립트 파일을 실행하려면 실행 권한을 추가로 부여해야 한다. chmod 755 {파일명}을 입력하면 파일 소유자에게는 읽기, 쓰기, 실행 권한을, 나머지의 경우에는 읽기, 실행 권한을 부여하게 된다.

    소유자는 읽기, 쓰기, 실행이 모두 가능하고 나머지 사용자는 읽기, 실행 권한만 부여된 kill_process.sh


    쉘 스크립트 실행하기

    작성한 쉘 스크립트를 실행하려면 작성한 파일이 있는 디렉토리로 이동 후 아래 세가지 명령어 중 하나를 입력하면 된다. 개인적으로는 세번째 방법을 가장 많이 사용하는 편이다.

    sh {파일명} {종료할 프로세스 명}
    bash {파일명} {종료할 프로세스 명}
    ./{파일명} {종료할 프로세스 명}

    kill_process.sh를 실행하여 test 프로파일이 활성화된 스프링 프로세스 하나를 정상적으로 종료시켰다


    마무리

    실제 업무 환경에서는 이러한 프로세스 종료와 더불어 동일한 프로젝트 파일을 다시 실행시키는 동작까지 수행하는 쉘 스크립트를 작성하여 사용하고 있다. 이 부분에 대해서는 어떤 파일을 실행하느냐에 따라 쉘 스크립트에 추가되는 내용이 달라지기 때문에 추가적으로 다루지는 않았다.

    댓글