본문 바로가기
개발/AWS

백그라운드로 파이썬 파일 실행 관리하기

by beomcoder 2023. 12. 21.
728x90
반응형

해결한지는 좀 됐지만 그래도 잊어버리지 않게 정리하려고 한다.

 

AWS에서 프로세스를 1~2개를 관리할때는 문제가 생기지 않았는데 4~5개를 관리하려고 하니까 문제가 많이 생겼다. 처음엔 nohup으로 백그라운드 관리하였는데 프로세스가 많이 생기고 백그라운드에서 돌아가다 보니까 메모리를 많이 잡아먹어 AWS 서버가 자주 꺼지는 일이 생겼다. 이것저것 찾아보다가 결국엔 pm2와 crontab, shell script로 해결했다.

 

해결방법은 마지막에 나와있어 바로 알고 싶으면 제일 아래로 내려가면 된다. 내가 해결하기 위해 노력한 방법들을 차례대로 기술해보려고 한다. 처음엔 nohup으로 자체로 해결해보려고 했다. 하지만 nohup만으로는 한계가 있었다. 그래서 다음으로 시도한 방법은 nohup으로 백그라운드로 파일들을 실행시키고, crontab으로 스케줄링해보기로 했다.

 

---home

    -- main

        -- api_server

        -- db_update

    -- test

        -- api_server

        -- db_update

 

폴더는 이런식으로 구성되어 있다. 한 폴더에 전부 있으면 쉽게 해결될 것 같았으나 잘 되지 않았다. 먼저 스크립트 파일을 만들었다. 먼저 돌아가고 있는 프로세스의 pid값 4개를 모두 찾아서 kill 명령어로 프로세스를 죽인다. 그리고 다시 실행시키는 방법을 생각해서 명령어를 작성하였다.

 

#! /bin/bash


# main.py에 해당하는 프로세스들의 PID를 찾아서 변수에 저장
pid1=$(pgrep -f "python3 main.py" | awk 'NR==1{print $1}')
pid2=$(pgrep -f "python3 main.py" | awk 'NR==2{print $1}')
pid3=$(pgrep -f "python3 main.py" | awk 'NR==3{print $1}')
pid4=$(pgrep -f "python3 main.py" | awk 'NR==4{print $1}')

# process kill
echo kill -9 $pid1
echo kill -9 $pid2
echo kill -9 $pid3
echo kill -9 $pid4

# 다시 실행
nohup python3 /home/test/db_update/main.py
# ..
# ..
# ..

# 실행했는지 날짜 확인
echo $(date) > test.txt

 

스크립트 파일을 만들고 crontab을 이용하여 스케줄링을 해주기로 했다. crontab은 특정시간에 특정파일을 실행시킨다고 생각하면 된다.

 

$ crontab -e

 

리눅스에서 파일 만드는 방법이랑 똑같이 작성하고 :wq를 하면 저장된다.

*      *      *      *      *
분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

 

5개의 자리를 숫자를 지정해주면 해당하는 시간이 된다. 나는 매일 오전 3시에 재시작이 되는 걸 원했기 때문에

 

0 3 * * * /home/restart.sh

 

라고 저장하고 :wq로 빠져나와 crontab을 설정해주었다. restart.sh는 위에 적은 스크립트의 이름이다.

잘 적은지 확인하려면 crontab -l 로 확인하면 알 수 있다.

 

crontab은 잘 실행하고 스크립트도 잘 실행되어 날짜가 제대로 찍혀있는데 파일이 제대로 실행되지 않았다. 프로세스 아이디는 잘 받아오는데 kill 명령어가 실행되지 않았다. 

echo kill -9 $pid1
echo kill -9 $pid2
echo kill -9 $pid3
echo kill -9 $pid4

result = $(kill -9 $(pid1))
result = $(kill -9 $(pid2))
result = $(kill -9 $(pid3))
result = $(kill -9 $(pid4))

 

위의 echo kill을 아래와 같이 바꾸니까 프로세스가 정상적으로 잘 죽었다. 왜인지는 나중에 시간이 나면 공부해보려고 한다. 위의 sh파일은 찾은게 아니라 이것저것 해보다가 발견한것이라 더 쉬운방법이 있을 수 도 있다.

 

꺼지긴 했는데 파일 실행이 되지 않았다. 원인을 또 찾아보니 폴더 위치의 문제가 생겼다.

 

---home

   -- restart.sh

    -- main

        -- api_server

        -- db_update

    -- test

        -- api_server

        -- db_update

 

이렇게 하니까 스크립트가 실행되는곳과 파일이 실행되는 곳의 폴더 위치가 다른데, 파일을 실행하는 파일 내부에서 다른 파일들을 부를때 현재폴더 기준으로 작성을 해두어 파일을 제대로 찾지 못했다. 그렇다고 일일히 전부 절대경로로 바꾸기에는 시간이 오래걸려 다른방법을 찾게 되었다.

 

<해결>

node에서 사용하는 pm2를 사용했다. pm2를 사용해서 python3을 쉽게 관리가 가능해졌다.

 

sudo apt install npm
npm install -g pm2

 

npm을 설치하고 npm으로 pm2를 설치했다.

그리고 nohup으로 실행시킨 프로세스들을 모두 종료시켜주고 pm2로 파이썬 파일들을 실행시켜주었다.

 

실행시키는방법은 간단하다.

pm2 start /home/main/main.py --name main_api --interpreter python3

 

pm2로 start를 해주는데 어디 폴더에 들어있는 파일을 실행시킬지 알려주면 되고, 나는 모든 파일이 main.py라 이름을 구분짓기 위해 --name으로 이름을 지어주었다. 그리고 python3파일을 실행시키기 위해 --interpreter을 넣어 주었다.

 

 

그다음 아까 만든 restart.sh파일을 변경해주었다.

 

 

그리고 시간은 따로 crontab에서 변경시켜주진 않았다.

드디어 제대로 작동하였다. 제대로 작동되는지 확인하려면 pm2 dash 명령어를 쳐보면 된다.

 

제대로 api 통신을 하고 있다. nohup으로 관리하고 있다가, node의 pm2까지 오는 길이 너무 험난했다고 생각했다. 짧게 썼지만 굉장히 많이 고민하고 찾아보아서 잊어버리지 않게 기록해두어야겠다.

728x90
반응형

댓글