반응형

<출처> https://ichi.pro/ko/bash-seukeulibteulo-fastapi-seobeoleul-dasi-sijaghaneun-bangbeob-264270881025116

 

FastAPI 시작, 중지, 재시작 

 

FastAPI 서버 시작 프로세스를 다루는 bash 스크립트 제작 내용입니다. 
참고로 개발 중에 reload 인수를 사용하여 서버를 다시 시작할 수 있습니다.

  uvicorn myapp:app --reload

nohup 및 &로 프로세스가 백그라운드 실행할 수 있으며 서버를 재시작하는 상황이 발생할 수 있습니다.
FastAPI 서버를 다시 시작하는 일반 과정은 다음과 같습니다.

- FastAPI 서버를 실행하는 프로세스 ID 확인
- 프로세스 종료
- nohup 파일 정리
- FastAPI 서버 시작

실행 중인 FastAPI 서버에서 사용하는 PID를 확인하는 방법은 여러 가지입니다.
 예를 들어 netstat 명령을 통해 확인합니다.

  netstat -tulpn

또 다른 방법은 ps 특정 프로세스와 관련된 세부 정보를 보여주는 명령입니다. 
grep(전역 정규식 인쇄) 명령과 사용하여 정규식을 통해 원하는 프로세스를 찾을 수 있습니다. 
다음 명령을 사용하여 서버를 시작했다고 가정하겠습니다.

  nohup uvicorn myapp:app &

  ps aux | grep 'uvicorn myapp:app'
  grep --color=auto uvicorn myapp:app
  ps aux | grep 'uvicorn myapp:app' | grep -v grep

FastAPI 서버 PID가 있으면 kill -9 PID를 사용하여 정상적으로 프로세스를 종료할 수 있습니다. 
PID가 12345라고 가정하면 다음과 같이 실행해야 합니다.

  kill -9 12345

nohup 출력 파일
-------------------
기본적으로 프로세스는 nohup.out에 호출된 파일에 모든 메시지를 저장합니다. 
디버깅 및 유지 관리를 쉽게 하기 위해 매번 지우는 것을 선호합니다. (실행)

  echo "" > nohup.out

그 후 다음을 통해 FastAPI 서버를 정상적으로 시작할 수 있습니다.

  nohup uvicorn myapp:app &

Bash 스크립트로 다시 시작
-------------------------------
재시작을 자동화하기 위해 bash 스크립트를 사용할 수 있습니다. 
먼저 restart_server.sh 파일을 만들고 내용을 작성합니다. 다음처럼 충분한 권한을 지정합니다. 

  chmod 755 restart_server.sh

파일에 다음 명령을 추가합니다.

#!/bin/bash  
source /home/project/myenv/bin/activate
cd /home/project/server

  - 서버가 실행 중이 아니면 정상적으로 서버를 시작하십시오.
  - 기존 서버가 있는 경우 프로세스를 종료하고 서버를 재시작합니다.

이를 수행하려면 실행 중인 프로세스를 식별하고 모든 ID를 가져와야 합니다. 
앞 ps 명령을 변형하여 사용합니다. 두 추가 명령으로 파이프를 만들고 변수로 저장합니다.

PID=$(ps aux | grep 'uvicorn myapp:app' | grep -v grep | awk {'print $2'} | xargs)

1234
1235

1234 1235

variable_name=$(your_command)

변수는 달러 기호 접두사를 통해 참조합니다.

$variable_name

kill -9 $PID

if [ "$PID" != "" ]
then
kill -9 $PID
sleep 2
echo "" > nohup.out
echo "Restarting FastAPI server"
else
echo "No such process. Starting new FastAPI server"
fi

마지막으로 서버를 정상적으로 재시작할 수 있습니다.

  nohup uvicorn myapp:app &

[스크립트]
--------------------------------------------------------------------------------
#!/bin/bash
source /home/project/myenv/bin/activate
cd /home/project/server
PID=$(ps aux | grep 'uvicorn myapp:app' | grep -v grep | awk {'print $2'} | xargs)
if [ "$PID" != "" ]
then
kill -9 $PID
sleep 2
echo "" > nohup.out
echo "Restarting FastAPI server"
else
echo "No such process. Starting new FastAPI server"
fi
nohup uvicorn myapp:app &
--------------------------------------------------------------------------------------

Bash 스크립트 호출
필요한 곳에 bash 스크립트를 복사합니다. 
보통 FastAPI 서버의 루트 디렉토리에 넣어두고 사용합니다. 

./path/to/file/restart_server.sh

./restart_server.sh

서버가 여러 작업자에서 실행 중인 경우

nohup uvicorn myapp:app --workers 4 &
ps aux | grep 'python -c from multiprocessing'
ps aux | grep '/home/project/myenv/python -c from multiprocessing'

[스크립트]
------------------------------------------------------------------
#!/bin/bash
source /home/project/myenv/bin/activate
cd /home/project/server
PID=$(ps aux | grep 'uvicorn myapp:app' | grep -v grep | awk {'print $2'} | xargs)
if [ "$PID" != "" ]
then
kill -9 $PID
PID=$(ps aux | grep '/home/project/myenv/bin/python -c from multiprocessing' | grep -v grep | awk {'print $2'} | xargs)
if [ "$PID" != "" ]
then
kill -9 $PID
fi
sleep 2
echo "" > nohup.out
echo "Restarting FastAPI server"
else
echo "No such process. Starting new FastAPI server"
fi
nohup uvicorn myapp:app &
--------------------------------------------------------------------

반응형

+ Recent posts