pm2 ppid 날려먹은 후기

in #krlast year

서막

오늘도 평화롭게 새벽에 코딩을 하고 있었습니다. python에서 thread로 여러 작업을 돌리는걸 구현하려다가 deamon 설정을 안하는 바람에 좀비를 만들게 되면서 일이 시작되었죠.

좀비 처리

좀비를 처리하기 위해서 pid을 kill했지만 다시 살아났습니다. 그래서 ppid로 parent을 kill sigint을 날려서 확실히 보내버렸죠..

ppid는 바로 pm2

python코드에 다시 살리는 부분이 없으니 이상한걸 알았어야 했는데... 좀비에 빠져서 운영중인 프로세스 이름이랑 혼동하면서 개발중인 python 프로젝트 이름과 동일한 프로세스의 ppid인 pm2을 날려먹었죠. 그래서 pm2가 깨끗하게 비었습니다. 그리고 더 큰 문제는 pm2가 실행중이던 프로세스는 그대로라서 Port을 점유하고 있었습니다.

복구 시작

일단 깔금하게 ubuntu을 재부팅하고(새벽이라 다행입니다ㅎㅎ) pm2 시작을 편하게 하려고 동일한 스크립트 이름으로 grep을 해서 하나하나 다 실행했습니다. 왜냐면,, pm2 save을 하지 않고 있어서 dumps가 없었습니다ㅠㅠ
프로젝트별로 pm2 운영중이던거 다 살리고 토이프로젝트도 살리고 기록에 남은거 & 기억나는거 다 살렸습니다.

데이터 조회가 안되네?

redis, mysql은 다 프로세스가 돌아오고 데이터도 가져와있는데 토이 프로젝트 데이터가 안나오고 있어서 찾아보니 mongod가 멈춰있었습니다. mongod는 systemctl enable에 빠져있었습니다. 그래서 mongo도 살렸습니다.

외양간 고치기

이번 일을 통해서 장애 복구에 대한 안전장치를 설정했습니다.
그리고 맨 처음에 생긴 좀비라고 생각된건 ctrl+c가 안먹혔었는데 그냥 터미널을 종료하면 해결되지 않았을까 싶습니다.

1. mongod


$ systemctl enable mongod
$ systemctl list-unit-files | grep enabled | grep mongod
mongod.service                         enabled         enabled     

2. pm2

crontab -e

# pm2 
0 1 * * * pm2 save
0 3 * * * /usr/bin/python3 /root/.pm2/move_dump.py

move_dump.py

dump 스냅샷을 위한 코드

import os
import datetime


def move_dump():

    now = datetime.datetime.now()
    timestamp = now.strftime("%Y-%m-%d_%H-%M-%S")
    filename = "dump_" + timestamp + ".pm2"

    if not os.path.exists("dumps"):
        os.makedirs("dumps")                  
        
    if not os.path.exists("dump.pm2"):
        print("dump.pm2 file not found")      
        return
    os.system("mv dump.pm2 dumps/" + filename)

move_dump()
Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

말만 들어도 끔찍함니다. 그래도 복구하셨다니 다행입니다.

지금 pm2에 7개 올라가있는데 제 기억엔 분명히 10개 넘긴 였던것 같긴 한데..ㅋㅋㅋ 어쩌다보니 안쓰는 프로세스가 다 정리되버렸습니다ㅋ

Coin Marketplace

STEEM 0.18
TRX 0.16
JST 0.030
BTC 61766.31
ETH 2428.16
USDT 1.00
SBD 2.64