IT박스

Unix에서 PID 파일을 올바르게 처리하기위한 참조

itboxs 2020. 12. 13. 09:08
반응형

Unix에서 PID 파일을 올바르게 처리하기위한 참조


Unix에서 PID 파일을 올바르게 처리하는 방법을 자세히 설명하는 존경받는 참조어디에서 찾을 수 있습니까 ?

Unix 운영 체제에서는 특수 잠금 파일 인 PID 파일을 사용하여 프로그램 (종종 데몬)을 "잠그는"것이 일반적입니다.

이것은 예측 가능한 위치에있는 파일이며 종종 '/var/run/foo.pid'입니다. 프로그램은 시작할 때 PID 파일이 있는지 확인하고 파일이 있으면 오류와 함께 종료합니다. 그래서 이것은 일종의 자문, 협업 잠금 메커니즘입니다.

파일에는 현재 잠금을 보유하고있는 프로세스의 숫자 프로세스 ID (따라서 이름은 "PID 파일") 인 한 줄의 텍스트가 포함됩니다. 이를 통해 잠금을 유지하는 프로세스에 신호를 보내는 것을 자동화 할 수 있습니다.

내가 찾을 수없는 것은 PID 파일 처리에 대한 예상 또는 "모범 사례"동작에 대한 좋은 참조입니다. 다양한 뉘앙스가 있습니다. 파일을 실제로 잠그는 방법 (귀찮게하지 마십시오? 커널을 사용합니까? 플랫폼 비 호환성은 어떻습니까?), 부실 잠금 처리 (자동 삭제? 확인시기), 잠금을 정확히 획득하고 해제 할시기 , 기타 등등.

이 작은 주제에 대해 존경 받고 가장 권위있는 참조 (이상적으로는 W. Richard Stevens 수준)를 찾을 수있는 곳은 어디 입니까?


내가 아는 한, PID 파일은 존경 받고 권위있는 소스를 찾을 수있는 것이 아니라 관례입니다. 내가 찾을 수있는 가장 가까운 것은 Filesystem Hierarchy Standard 의이 섹션 입니다.

이 Perl 라이브러리 는 저자가 적어도 발생할 수있는 문제에 대해 생각한 것처럼 보이므로 도움이 될 수 있습니다.

/ var / run 아래의 파일은 데몬의 작성자가 아니라 배포판 관리자가 처리하는 경우가 많다고 생각합니다. 모든 init 스크립트가 잘 작동하는지 확인하는 것은 distro 관리자의 책임이기 때문입니다. 데비안과 페도라의 개발자 문서를 확인했지만 자세한 지침을 찾지 못했지만 개발자의 메일 링리스트에 대한 더 많은 정보를 얻을 수있을 것입니다.


첫째, 모든 최신 UNIX /var/run에서는 재부팅 후에도 유지되지 않습니다.

PID 파일을 처리하는 일반적인 방법은 초기화 중에 파일을 만들고 일반 또는 신호 처리기의 모든 종료에서 삭제하는 것입니다.

파일을 원자 적으로 생성 / 확인하는 두 가지 표준 방법이 있습니다. 요즘 가장 중요한 것은 O_EXCL플래그로 파일 을 여는 것입니다 . 파일이 이미 존재하면 호출이 실패합니다. 예전 방식 ( O_EXCL없는 시스템에서는 필수 )은 임의의 이름과 링크로 생성하는 것입니다. 대상이 있으면 링크가 실패합니다.


Stevens의 Unix Network Programming, v2에있는 pidfile 구현을 기반으로하는 Kerrisk의 The Linux Programming Interface , 섹션 55.6 "프로그램의 단일 인스턴스 실행"을 참조하십시오 .

또한 pidfile의 위치는 일반적으로 distro (init 스크립트를 통해)가 처리하는 것이므로 잘 작성된 데몬은 명령 줄 인수를 사용하여 pidfile을 지정하고 실수로 구성 파일에 의해 재정의되는 것을 허용하지 않습니다. 또한 부실 pid 파일을 자체적으로 정상적으로 처리해야합니다 (O_EXCL을 사용해서는 안 됨). fcntl () 파일 잠금을 사용해야합니다. 데몬의 pidfile이 로컬 (비 NFS) 파일 시스템에 있다고 가정 할 수 있습니다.


배포판에 따라 실제로 pidfile을 처리하는 init 스크립트입니다. 시작할 때 존재를 확인하고 중지 할 때 제거합니다. 그런 식으로하는 것이 싫습니다. 나는 내 자신의 init 스크립트를 작성하고 일반적으로 stanard init 함수를 사용하지 않습니다.

잘 작성된 프로그램 (데몬)에는이 pidfile (있는 경우)이 작성되어야하는 위치를 알려주는 일종의 구성 파일이 있습니다. 또한 신호를 처리 할 수있을 때마다 PID 파일이 정상 또는 비정상 종료시 정리되도록 신호 핸들러를 설정하는 데주의를 기울입니다. 그런 다음 PID 파일은 init 스크립트에 올바른 PID를 제공하므로 중지 할 수 있습니다.

따라서 시작할 때 pidfile이 이미 존재하는 경우 이전에 충돌 한 프로그램에 대한 매우 좋은 지표이며 (해당되는 경우) 복구 작업을 수행해야합니다. 초기화 스크립트 자체가 PID의 존재를 확인하거나 링크를 해제하는 경우 해당 로직을 발에 넣는 것입니다.

이름 공간에 관해서는 프로그램 이름을 따라야합니다. 'foo-daemon'을 시작하는 경우 foo-daemon.pid가됩니다.

/ var / lock / subsys도 살펴 봐야하지만, 대부분 Red Hat 버전에서 사용됩니다.


systemdRed Hat 7 패키지는 daemon(7)"Writing and packaging system daemons"라는 헤더 행이 있는 man 페이지 제공합니다 .

이 매뉴얼 페이지는 "이전 스타일"(SysV)과 "새 스타일"(systemd) 데몬 화에 대해 설명합니다. 새로운 스타일에서 systemd는 자체적으로 PID 파일을 처리합니다 (그렇게 구성된 경우). 그러나 이전 스타일에서 man 페이지에는 다음과 같은 내용이 있습니다.

  1. 데몬 프로세스에서 데몬 PID (getpid ()에 의해 반환 됨)를 PID 파일 (예 : /run/foobar.pid (가상 데몬 "foobar"의 경우))에 기록하여 데몬이 두 번 이상 시작되지 않도록합니다. . PID 파일에 이전에 저장된 PID가 더 이상 존재하지 않거나 외부 프로세스에 속하지 않는 것과 동시에 PID 파일이 확인 될 때만 PID 파일이 업데이트되도록 경쟁없는 방식으로 구현해야합니다.

이 매뉴얼 페이지를 온라인으로 읽을 수도 있습니다 .

참고 URL : https://stackoverflow.com/questions/688343/reference-for-proper-handling-of-pid-file-on-unix

반응형