본문 바로가기

IT 인프라/Database

PID 파일이 사라지는 이유

반응형

문제점

glibc 보안패치 후 리눅스 시스템 재부팅을 할 때, MySQL/MariaDB 복제 구성이 되어 있는 서버은 직접 작업했다.
재부팅 전에 MySQL 프로세스를 Stop하려고 하였으나 아래와 같은 메시지가 나오며 데몬이 정상적으로 내려가지 않았다.

[root@Linux ~]# /etc/init.d/mysql stop
MySQL server PID file could not be found!       [FAILED]

MySQL 데몬의 Process ID 값을 가지고 있는 PID 파일이 없고, 따라서 어느 데몬을 죽여야 할지 알 수 없기 때문에 발생한 문제이다.
종료할 MySQL 데몬의 PID 값을 찾아 이 PID 값을 가진 pid 파일을 생성하여 해결할 수 있다.

원인

리눅스는 내부적으로 /tmp/var/tmp 내 특정 조건에 부합하는 파일들을 Daily Cron 스케쥴링을 통해 삭제하는 프로세스를 가진다.

해당 파일의 경로와 소스코드는 다음과 같다.

[root@Linux ~]# cat /etc/cron.daily/tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

소스를 보면 -x 옵션에 적힌 파일들은 제외하고 /tmp는 10일간, /var/tmp는 30일간 접근되지 않은 파일들을 삭제한다.

아래는 테스트 결과이다.
VM을 설치 직후 스냅샷(2014/9/29)으로 돌린 후 MySQL을 설치하고 나서, 시간을 동기화(2015/3/4)하고 나서 tmpwatch를 실행하였더니 mysql.pid파일이 삭제되었다.

[root@Linux ~]# ls -lht /tmp
-rw-rw----.  1 mysql mysql    5 Sep 29 15:31 mysql.pid
srwxrwxrwx.  1 mysql mysql    0 Sep 29 15:31 mysql.sock

[root@Linux ~]# rdate -s time.bora.net

[root@Linux ~]# date
Wed Mar  4 16:03:06 KST 2015

[root@Linux ~]# /etc/cron.daily/tmpwatch

[root@Linux ~]# ls -lht /tmp
srwxrwxrwx.  1 mysql mysql    0 Sep 29 15:31 mysql.sock

해결방법

  • 방법1(권장)
    • my.cnf 파일에 /tmp 디렉터리가 아닌 다른 디렉터리를 사용하도록 설정한다.
    • 보통 /var/run/mysql 디렉토리를 만들고, 여기에 pid, sock 파일을 넣는다.
  • 방법2
    • 계속해서 /tmp 디렉터리를 사용할 것이라면 tmpwatch 소스코드에 -x /tmp/mysql.pid를 추가하여 10일 이상 Access 하지 않아도 삭제되지 않도록 한다.

참고

반응형