
저는 RHEL 7.5를 사용하고 있으며 PID 번호가 있는 파일을 포함하는 Java 프로그램이 있습니다. 프로세스가 종료되면 파일은 여전히 존재하며 해당 파일에 저장된 PID가 살아 있는지 확인하는 스크립트를 수행 중이지만 의심스럽거나 문제가 있습니다.
PID 445가 존재하고 2445가 존재합니다. 그럼 어떻게 445만 얻을 수 있나요?
다음 명령으로 시도했습니다.
ps -ax | egrep "^ 445"
그러나 아무것도 반환하지 않았습니다.
두 가지 프로세스:
ps -ax | grep -v grep | egrep "445"
445 pts/2 Sl 3:50 /opt/
2445 ? S 0:00 dbus-launch
답변1
사용 -p
:
-p proclist
프로세스 ID 번호가 에 제공되는 프로세스에 대한 정보를 작성합니다proclist
. […]
(원천)
귀하의 경우:
ps -p 445
ps
POSIX는 "오류가 발생"한 경우 긍정적인 종료 상태를 반환해야 한다고 말합니다 . ps
내가 테스트한 모든 항목 proclist
에는 PID가 하나 이상 포함되어 있지 않은 것으로 간주됩니다.기존의"잘못"으로 처리됩니다. 이것은 유용합니다. 예:
ps -p 445 >/dev/null && echo "Process exists."
노트:
- 종료된 프로세스의 PID는 결국 재사용될 수 있습니다.이므로 PID를 사용 중이더라도 관심 있는 프로세스가 아닐 수도 있습니다.
- 파일의 PID가 최근 (재)부팅 이전의 것이라면 PID가 현재 사용 중이더라도 프로세스는 분명히 더 이상 존재하지 않습니다. (힌트:파일이 있도록 프로그램을 구성하십시오.
tmpfs
).
답변2
다음과 같이 Bash 스크립트에서 프로세스가 실행 중인지 확인할 수 있습니다 kill -0
.
if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
exit
else
rm -rf ${pid_file}
exit
fi
는 ${pid_file}
PID가 포함된 파일 경로와 같습니다. -f ${pid_file}
PID 파일이 존재하는지 확인합니다 . 그런 다음 kill -0 $(cat ${pid_file})
프로세스가 실행 중인지 확인합니다.
이는 다음과 같이 요약됩니다.
- 프로세스가 실행 중이면 스크립트를 종료하는 것 외에는 아무것도 하지 마십시오.
- Else(프로세스가 다음과 같은 경우~ 아니다실행 중이면 PID 파일을 제거하기만 하면 됩니다.
의 마법은 kill -0
매뉴얼 페이지에 설명되어 있습니다.kill
:
만약에시그가 0이면 신호가 전송되지 않지만 오류 검사는 계속 수행됩니다. 이는 프로세스 ID 또는 프로세스 그룹 ID가 있는지 확인하는 데 사용할 수 있습니다.