리눅스로 구성된 서버에서 작업을 하다보면 `pid`파일을 다룰일이 많이 생기는 것 같습니다. `pid`는 **Process Identifier** 또는 **Process Id** 를 말하는 것으로 특정 프로세스의 고유 식별번호를 나타냅니다.
주로 특정 프로세스의 실행여부를 판단할 때 많이 사용합니다. 예를 들어보면 `tomcat`을 사용하기위해 서비스에 `tomcat`의 실행 및 중단을 제어하기위한 스크립트를 등록해 사용하게 되는데, 이 때 프로세스를 종료하거나 재시작하는 경우 `pid`에 해당하는 프로세스가 실행중인지 확인하고 실행중인 경우 `pid`를 이용해 프로세스를 중단시키는 등의 작업을 하는 경우가 있습니다.
## pid 파일은 어디에 생성해야 하나?
리눅스 서버에 `bash`스크립트를 작성하면서 의문이 생긴점이 `pid 파일은 어디에 생성하는게 좋은가?` 였습니다. 우선 내가 딱히 관리하지 않아도 알아서 생성되고 관리되고 있는 `pid`파일들은 다음의 경로에서 생성 및 관리되고 있습니다.
```bash:line-numbers
$ cd /var/run
$ ls -l
```
아 그럼 그냥 나도 `/var/run` 밑에 생성하면 되겠군. 이라고 생각했지만 그렇게 하지 않은 이유는 접근 권한등의 문제 때문이었습니다.
```bash
# /var/run 은 root 의 소유
drwxr-xr-x 20 root root 800 run
```
모든 프로세스를 `root`사용자로 구동시킬 수는 없어서 저같은 경우엔 주로 실행중인 프로세스의 내부에 적당한 위치를 마련해서 그곳에 생성하거나, 프로세스를 구동하는 사용자(user)의 `HOME`디렉토리에 두곤 했는데 이게 잘하고 있는건지 궁금해져서 `구글`에게 물어보기로 했습니다.
### Must my pidfile be located in /var/run?
관련 내용을 검색 중 **stackoverflow**에서 [Must my pidfile be located in /var/run?](http://stackoverflow.com/questions/5173636/must-my-pidfile-be-located-in-var-run)라는 글을 발견했습니다. 질의자는 `/opt/my_app/run/`경로에 `pid`를 만들었다고 말하고 있고, 그에 달린 답변 내용을 보니 해당 위치에 생성하는건 `opt`디렉토리가 고정적인 파일의 영역으로 기기간 공유되는 디렉터리이기 때문에 안전한 방법이 아니라고 말하고 있네요. `/var/run`이 기본적인 장소인데 권한이 필요하다는 내용입니다.
`root`사용자가 아닐 경우 프로세스를 실행하기전에 사전작업 등을 해야 한다는 내용입니다. 다른 답변 중에는 사용자의 `HOME`디렉터리 하위에 생성한다는 내용도 보입니다.
## `/var/run` 또는 `/home/USER` 에 만들면 되겠네
둘러보니 `HOME` 디렉터리에 만드는 방법도 딱히 나쁜 방법은 아닌 것 같습니다. `HOME`에 만드는 방법이야 권한문제도 없어서 부딪칠 문제가 없어보이지만, `/var/run`경로의 경우 확인해야 할 사항이 있을 것 같아서 검색한김에 알아보려고 남들은 어떻게 하나 찾아봤습니다.
## what permission to write PID file in /var/run
당연히 권한 문제가 대두됩니다. 해당 경로는 위에서 말씀드린 것처럼 `root`사용자의 소유입니다. **stackoverflow**에서 [what permission to write PID file in /var/run](http://serverfault.com/questions/159334/what-permission-to-write-pid-file-in-var-run)이런 글을 찾았습니다. `/var/run`에 특정 사용자의 `pid`파일을 만들고 싶은데 권한문제가 발생했다는 것인데, 답변을 살펴보면 만약 프로세스이름이 `eglowc`라면 다음처럼 하라고 설명하고 있습니다.
```bash:line-numbers
# mkdir /var/run/eglowc
# chown eglowc:eglowc /var/run/eglowc
```
한마디로 사전작업을 해놓으라는 말입니다. `root`사용자 또는 `sudo`권한을 갖고있는 특정 사용자로 `/var/run` 경로 하위에 사용할 디렉터리를 만들고 `chown`권한을 이용해 해당 디렉터리의 소유권을 변경하라는 것입니다. 쉽게 예측할 수 있는 방법이지만 이렇게 하는게 맞나보네요.
### Never do a chmod 757 on `/var/run` !!!
절대로 하지 말아야 할 것이 있습니다. **"귀찮으니까 그냥 /var/run 을..."** 이라고 생각하고 `chmod`로 해당경로의 권한을 변경시키면 보안상 매우 취약한 문제가 발생할 수 있고(위 링크의 답변 중 이렇게 답글 달았다가 ~~비추폭격~~반대의견을 받은 답변도 보입니다.) 또, 이 방법은 다음부팅까지만 유효하기 때문에 굉장히 엉망인 방법입니다.(이어서 설명합니다.)
### `/var/run` is tmpfs
위에서 이어지는 내용입니다. `/var/run`디렉터리는 임시파일 매커니즘을 관리되기 때문에 시스템이 `reboot`되면 기존에 작성된 파일과 내용들은 모두 사라지게 된다. 그렇기 때문에 이점에 유의해서 해당경로에 접근할 수 있는지 확인하고, 접근할 디렉터리를 생성하고 권한을 변경하는 작업을 유동적으로 수행할 수 있도록 대비해두거나 아니면 시스템이 부팅될 때 실행되는 스크립트를 만드는 등의 작업을 해 둘 필요가 있습니다. 이런 이유에서 `chmod 757`명령어를 이용한 작업은 역시나 해서는 안되는 선택이겠습니다.