프로세스가 실행 중인지 확인하기 위해 .pid 파일이 신뢰할 수 있습니까?


11

sshd와 같은 많은 프로그램은 / var / run /에 프로세스 ID가 포함 된 .pid 파일을 만듭니다. 이러한 파일이 프로세스 실행 여부를 결정하는 데 신뢰할 수 있습니까? 내 생각에 이러한 파일은 프로세스에 의해 수동으로 생성되므로 프로그램이 충돌해도 파일 시스템에 남아 있습니다.

답변:


16

간단히 말해서, no : 프로세스 (예 : 데몬)가 충돌하여 .pid 파일을 지울 시간이 없습니다.

프로그램의 상태를보다 확실하게하는 기술 : 소켓과 같은 명시 적 통신 채널을 사용하십시오. 소켓 포트를 파일에 쓰고 supervisor프로세스가 찾아 보도록하십시오.

Linux에서 DBus의 서비스를 사용할 수도 있습니다. 특정 이름을 등록하고 감독자 프로세스 (이것이 무엇이든)가 해당 이름을 확인하도록합니다.

수많은 기술이 있습니다.

한 가지 기억해야 할 것은 PID 파일을 관리하는 것은 OS의 책임이 아닙니다.


1
그러나 프로세스의 존재와 결합 된 pid 파일의 존재는 충분해야합니다. 프로세스가 종료되면 확인할 수 있습니다. PID는 재사용되지만 자주는 아닙니다.
MarkR

2
pid가 얼마나 자주 재사용되는지는 문제의 특정 시스템에 따라 다릅니다. 시스템이 최소한 매일 PID 순환되는 것을 보았습니다. pid를 확인하고 프로세스가 있으며 프로세스가 pid를 소유 할 것으로 예상되는지 확인해야합니다.

@atk : 정확히. 표준 per-se는 없으며, 존재하는 경우에도 일부 구현에 의해 잘 존중되지 않을 수 있습니다. 예를 들어 PID 파일을 전혀 쓰지 않는 데몬을 만들고 백 채널을 사용하여 관리 명령을 가져올 수 있습니다.
jldupont

@atk : 불행히도, 점검 시간과 사용 시간 사이에 PID가 재사용되지 않도록하는 방법은 없습니다.
SamB

3

Jldupont는 충돌시 파일이 제거 되지 않을 수 있으므로 프로세스가 실행 중인지 여부를 결정하기 위해 .pid 파일이 신뢰할 수 없음 을 나타내는 것이 정확 합니다.

경쟁 조건을 제쳐두고, 프로세스가 실행 중인지 알아야 할 때 종종 pgrep을 사용 합니다. 그런 다음 필요하다고 생각되면 .pid 파일에 대해 출력을 상호 참조 할 수 있습니다.


3

프로세스 ID를 포함하는 파일이 신뢰할 수없는 경우 프로세스가 실행 중인지 확인하십시오. 프로세스에 마지막으로 주어진 프로세스 ID를 파악하는 것은 신뢰할 수있는 소스입니다.

프로세스 ID가 있으면 프로세스가 실제로 실행중인 경우 추가 검사를 수행해야합니다.

예를 들면 다음과 같습니다.

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

pgrep는 좋은 명령이지만 여러 인스턴스를 실행하면 문제가 발생합니다. 예를 들어, 당신은 포트 TCP / 22에서 실행되는 일반 SSHD을 가지고 있고 검색 할 때 TCP / 2222, 다음 pgrep을 두 프로세스 ID를 제공 할 것입니다 포트에서 실행중인 다른 SSHD가있을 때 SSHD 일반 SSHD가에서의 / var의 PID가있을 때 ... /run/sshd.pid 및 다른 하나는 /var/run/sshd-other.pid에 pid가있을 수 있으므로 프로세스를 명확하게 구별 할 수 있습니다.

나는 하지 않습니다 만 사용하는 것이 좋습니다 PS 와 하나 개 또는 여러 개의 파이프를 통해 배관, 그렙GREP -v 그것을 조금 사용하는 것과 같이 ... 당신이 관심을하지 않는 다른 모든 물건을 필터링하는 것을 시도

find . | grep myfile

파일이 종료되면 알아낼 수 있습니다.


2

파일에 포함 된 것과 동일한 pid를 가진 프로세스의 존재를 단순히 확인하는 것은 신뢰할 수 없습니다.

그러나 많은 pidfile 구현도 pidfile을 잠그므로 프로세스가 종료되면 잠금이 사라집니다. 잠금 메커니즘이 안정적인 경우 파일이 여전히 잠겨 있는지 확인하는 것은 원래 프로세스가 여전히 실행 중인지 여부를 결정하는 비교적 안정적인 메커니즘입니다.


1

Jldupont가 정확합니다.

그러나 프로세스가 아직 활성 상태인지 확인하기 위해 프로세스에 0 신호 (kill -s 0 pid)를 보낼 수 있습니다 (이러한 신호를 보낼 권한이 있다고 가정하면 일반적으로 프로세스 소유자 만 보낼 수 있음) 그것은 신호).


4
그러나 해당 PID로 프로세스가 있는지 확인한다고해서 관심있는 PID라는 의미는 아닙니다.
janm

0

나는 jschmier에 동의합니다.

일부 시스템에서는 pgrep에 액세스 할 수 없습니다. 이 경우 ps -aef | grep <pid>프로세스가 실제로 실행 중인지 확인할 수 있습니다.


1
문제의 핵심은 "신뢰할 수있는"것이었다. PS를하고 PID를 찾는 것은 신뢰할 수 없습니다.
janm

글쎄 ... 프로그램의 이름을 알고 있다고 가정하면 왜 ps -aef | grep을 신뢰할 수 없습니까?
user29584

3
경쟁 조건 : ps가 완료 될 때까지 시스템 상태가 변경되었습니다. 프로세스 제목 : 다른 프로세스는 관심있는 프로세스와 비슷한 제목을 가질 수 있습니다. 여러 인스턴스 : 각각 PID 파일이있는 동일한 서비스의 두 인스턴스가있는 시스템을 고려하십시오. 하나는 실패하고 다른 하나는 다시 시작하여 첫 번째 서비스의 PID를 가져옵니다. 당신은 어떻게 말합니까? 기타 경쟁 조건으로 인해 신뢰할 수없고 올바른 정보를 얻는 것이 불가능하며 신뢰할 수있는 기술이 있습니다. 신뢰할 수있는 대안은 예를 들어 cr.yp.to/daemontools.html
janm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.