파일시스템 계층구조 표준(https://yiunsr.tistory.com/756) 에 따라 실행중인 파일의 .sock파일(port 가 아닌 파일로 stream 을 주고 받을 때 생성되는 파일) 이나 .pid파일(Process identifier 로 프로세스가 실행중일 때 중복실행을 방지하고 위해 생성하는 파일, 계속 상주하는 프로그램의 경우 특정 경로에 자신의 pid 파일이 존재하고 있으면 이미 실행중임을 인식해서 자동으로 종료되는 방식으로 구현되오 있다.)의 경우 보통 /var/run 내 디렉토리를 만들어 파일을 생성한다.
전에 gunicorn 으로 flask 배포(https://yiunsr.tistory.com/888) 에서 /var/run/ 으로 sock 파일이나 pid 를 파일을 설정했던 것도 이런 이유이다. 그런데 이 경로 /var/run 안에 디렉토리를 만들면 재부팅시 이 파일 뿐만 아니라 디렉토리도 삭제된다. 이것은 아마 종료시 run 중이 아니기 때문에 시스템에서 알아서 해당 파일 전부를 삭제하는 것으로 추정된다.
오늘 이 때문에 디렉토리가 없어 systemd 가 동작하지 않는 현상을 경험했다. 내가 다른 /var/run 과 섞이지 않게 하기 위해 따로 디렉토리를 만들었는데, 재부팅 해니 이 디렉토리까지 사라져서 systemd 로 동작하는 스크립트가 pid, sock 파일을 만들지 못해서 동작하지 않는 문제가 있었다.
찾아보니 systemd 설정시
[Service]
User=www-data
Group=www-data
RuntimeDirectory=uwsgi
RuntimeDirectoryMode=0777
같은 식으로 하면 /run/var/uwsgi 디렉토리가 생성되고 설정한 대로 group 과 user 가 생성되고 RuntimeDirectoryMode 대로 퍼미션도 설정되는 것을 확인 했다.
systemd 는 뭔가 공부할 것이 너무 많은 것 같다. 언젠가 정리가 필요할 것 같다.