Unix

pm2를 systemctl --user 로 실행하기

ForceCore 2023. 10. 12. 10:50

pm2가 다 좋은데 pm2 자체가 뻗어버리는 상황에서 되살아나지 않아서 pm2에 속한 서비스들이 통으로 다 죽을수도 있다는 약점이 있다.

(ex 서버 메모리가 모자라서 여러 프로세스가 죽어버리는 상황. 연구작업이 이루어지는 서버에서는 일어날 수 있는 일이다.)

 

반면 systemctl은 매우 불편한데, systemd의 일부라서 out of memory 상황에서도 잘 살아남는다는 것!

 

두가지 옵션중에서 안정성 이슈 때문에 여러 서비스를 systemctl --user로 실행했는데 관리가 몹시 불편했다. 서비스 정의를 만드는 부분이나 로깅이 매우 불편했다. (아예 파일로 로깅하든지, journal로 로깅하든지, 로깅부분에 신경을 써서 wrapper script를 만들거나 프로그램 자체 로깅을 잘 쓰든지... 버전에 따라 다르지만 구버전일수록 유연하진 않다. systemctl 버전따라 다른 부분도 문제인게 systemd는 시스템의 일부라서 낡은 리눅스 배포판을 업데이트 할 수도 없으니 곤란하다)

 

양쪽의 장점을 취하려면 systemctl --user로 pm2가 실행되게 하면 되지 않겠나하는 발상이 들었다.

 

[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
TimeoutStartSec=8
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PM2_HOME=%h/.pm2 PM2_API_IPADDR=127.0.0.1
Restart=always
RestartSec=8

ExecStart=/usr/bin/pm2 resurrect --no-daemon
ExecReload=/usr/bin/pm2 reload all
ExecStop=/usr/bin/pm2 kill

[Install]
WantedBy=default.target

출처: https://github.com/Unitech/pm2/issues/2749

 

pm2 매뉴얼을 보면 시스템 전체에 설치하는 방식으로 되어서 좀 껄끄럽게 느껴진다. 이 글에서 제안하는 방식은 user level service unit file을 사용하는 방식임.