pm2 pm2 는 ‘Node.js process manager’로 원래는 Node.js 서버를 운영하는 목적으로 사용된다. javascript 외의 다른 언어의 스크립트 파일도 실행할 수 있는데, RL(Reinforcement Learning) 스크립트를 실행할 때도 유용하다.

RL 스크립트는 한번 실행하면 하루에서 일주일 이상을 돌리는 경우가 많기 때문에, 리눅스에서는 보통 nohup 명령어로 스크립트를 실행해야 한다. 그래야 ssh 접속을 끊었을 때도 프로세스 실행을 유지하기 때문. 이때 pm2를 사용하면 스크립트의 시작/정지/재시작/로그 또는 상태 확인 등을 pm2 command 로 쉽게 할 수 있어서 회사에서 자주 사용하곤 한다. 하지만 요전에 pm2 flush 명령어 때문에 두세 시간을 허비한 적이 있다.

보통 pm2 를 이용해 스크립트를 실행한 경우, 그 프로세스에 대한 로그가 $HOME/.pm2/logs 폴더에 자동으로 생성된다. 예를 들어, pm2 start myapp.py --name myapp 이란 명령어를 실행하면, ‘myapp’ 이란 이름으로 프로세스가 생성되며, ‘myapp’ 프로세스의 로그는 $HOME/.pm2/logs/myapp-*.log 란 이름으로 생성되게 된다.

pm2 flush 명령어

pm2 flush 명령어는 이렇게 생성된 로그들을 모두 삭제하는 명령어이다. 단, 여기서 주의할 점이 있다. 명령어 설명만 보면 모든 로그를 삭제하는 명령어로 이해하기 쉽지만, 실제로는 로그 폴더 상의 모든 로그 파일을 삭제하는 것이 아니라 pm2 에 현재 등록되어 있는 프로세스(pm2 list 명령어 실행시 표시되는 프로세스)의 로그만 삭제한다.

이게 어느 경우에 문제가 될 수 있냐면, 프로세스를 중지하고 재시작하는 경우다. pm2 에서는 보통 프로세스를 중지하고 재시작하는 경우, 프로세스의 이름이 기존과 동일하기 때문에 프로세스의 로그는 기존 로그 파일에 그대로 덧붙여지게 된다.

pm2 에서 프로세스를 중지하는 방법에는 두 가지가 있는데, pm2 stoppm2 delete 명령어다. pm2 stop 명령어로 프로세스를 중지시키면, 중지시킨 이후에도 pm2 가 프로세스에 대한 설정 정보를 가지고 있다.(pm2 프로세스에서 ‘stopped’ 상태로 표시됨) 반면에 pm2 delete 명령어로 프로세스를 중지시키면, 그 프로세스에 대한 설정이 pm2 에서 완전히 제거된다.

즉, pm2 delete 로 프로세스를 중지시키고 나서, pm2 flush 를 실행하면 그 프로세스에 대한 로그 파일은 삭제되지 않는다.

생각지 못한 실수

그 때의 실수를 복기해 보면, RL 스크립트를 실행해 놓고, 수정 사항이 생각나서 코드를 수정하고 스크립트를 다시 재시작해야 했다. 수정 사항 중에 pm2 설정 파일에 대한 변경이 있어 pm2 delete 명령어를 사용해 스크립트 종료한 후, 수정사항에 대한 로그가 스크립트 시작 시 출력되기 때문에 로그 확인의 편의를 위해 pm2 flush 명령으로 로그 파일을 삭제했다. 그리고 스크립트를 다시 실행.

편안한 마음으로 로그 파일의 시작 부분을 확인했는데 수정 전과 로그가 똑같은 거다. ‘이럴 리 없어. 이걸 수정하면 반드시 이렇게 나와야 하는데. 이 기본 가정이 흔들리면 말이 안되는데…’ 로그에 대한 의심은 전혀 없이, 코드 이곳 저곳에 로그를 더 추가하고. 또 다시 위와 같은 방법으로 스크립트를 재시작. ‘어? 이 로그도 안 나오네? 이 함수 실행이 안되나?! 이게 말이 되나?’ 관련 코드를 복기하고…

이렇게 뻘 짓으로 두세 시간 을 날리고 나서야 로그 파일에 의심이 들었고, 몇 가지 확인을 거쳐 로그 파일이 새로 생성되지 않았고, 재시작한 스크립트의 로그가 기존 로그 파일에 덧붙여 지고 있었다는 걸 깨달았다.