답변:
간단히 말해서, no : 프로세스 (예 : 데몬)가 충돌하여 .pid 파일을 지울 시간이 없습니다.
프로그램의 상태를보다 확실하게하는 기술 : 소켓과 같은 명시 적 통신 채널을 사용하십시오. 소켓 포트를 파일에 쓰고 supervisor
프로세스가 찾아 보도록하십시오.
Linux에서 DBus의 서비스를 사용할 수도 있습니다. 특정 이름을 등록하고 감독자 프로세스 (이것이 무엇이든)가 해당 이름을 확인하도록합니다.
수많은 기술이 있습니다.
한 가지 기억해야 할 것은 PID 파일을 관리하는 것은 OS의 책임이 아닙니다.
프로세스 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
파일이 종료되면 알아낼 수 있습니다.
Jldupont가 정확합니다.
그러나 프로세스가 아직 활성 상태인지 확인하기 위해 프로세스에 0 신호 (kill -s 0 pid)를 보낼 수 있습니다 (이러한 신호를 보낼 권한이 있다고 가정하면 일반적으로 프로세스 소유자 만 보낼 수 있음) 그것은 신호).
나는 jschmier에 동의합니다.
일부 시스템에서는 pgrep에 액세스 할 수 없습니다. 이 경우 ps -aef | grep <pid>
프로세스가 실제로 실행 중인지 확인할 수 있습니다.