다른 사용자가 Bunzip 프로세스를 시작하고 Bunzip이 완료된 후 실행을 시작하려는 스크립트가 있다고 가정합니다. 스크립트 내부에서 Bunzip 프로세스가 완료되었는지 확인하는 가장 좋은 방법은 무엇입니까? ps
지정된 PID로 전화하시겠습니까? pgrep 패키지? 스크립트를 crontab에 넣고 5분마다 실행 가능한지 확인한다고 가정해 보겠습니다. 또한 bunzip이 한 시간 이상 실행되었으며 완료하는 데 한 시간 더 걸릴 수 있으므로 중지하고 싶지 않다고 가정합니다.
내 첫 번째 본능은 다음과 같은 것을 사용하는 것이 었습니다.
if `ps -p 12938`
# bunzip is done, execute the code
fi
# exit
그러나 더 좋은 방법이 있는지 궁금합니다. 또한 유닉스에서 ps -pid가 어떻게 작동하는지 잘 모르겠습니다.
답변1
당신의 명백한 질문: 주어진 PID를 가진 프로세스가 존재하는지 테스트하십시오.
ps -p $pid
예POSIX그리고 내장되지 않은 최신 UNIX에서 작동해야 합니다.고대 미술또는미닉스또는바쁜 상자).
주어진 PID에 대한 프로세스가 존재하는지 테스트하는 간단하고 이식 가능한 방법은 입니다 kill -0 $pid
. 이는 프로세스에 신호를 보낼 수 있는 경우에만 작동합니다(신호 0은 항상 전달되지만 효과가 없는 신호처럼 동작함). 즉, 프로세스가 kill
프로세스의 유효 UID 또는 루트로 실행되고 있음을 의미합니다. 다른 사용자로 실행하는 경우 kill
"해당 프로세스 없음"(ESRCH) 또는 "작업이 허용되지 않음"(EPERM) 신호를 보내는지 여부를 테스트할 수 있지만 셸에서 이를 위해서는 구현이 오류 정보 형식을 어떻게 지정하는지 알아야 합니다.
기본 디자인: 프로세스가 완료되었는지 테스트
제안된 디자인에는 한 가지 주요 결함이 있습니다. 해당 PID가 기다리고 있는 Bunzip 프로세스인지 어떻게 알 수 있습니까? 아마도 bunzip이 완료되었고 이제 이전 PID를 사용하는 또 다른 프로세스가 있을 것입니다. 프로세스가 종료될 때까지 안정적으로 기다릴 수 있는 유일한 장소는 상위 프로세스입니다.
더 나은 접근 방식은 압축되지 않은 파일의 존재와 압축된 파일의 부재를 트리거하거나, 압축되지 않은 파일이 lsof
프로세스에서 열려 있지(사용되지) 않는지 확인하는 것입니다.
답변2
ps를 사용하는 데 아무런 문제가 없다고 생각하지만 여기에 대안이 있습니다.
if [ -e /proc/${PID} -a /proc/${PID}/exe ]
% process active
else
% process no longer active
fi
답변3
몇 가지 옵션이 있습니다.
- ps를 사용하여 PID를 찾으십시오. 하지만 프로세스의 PID를 알아야 합니다.
- ps를 사용하고 Bunzip을 찾으면 전체 명령줄을 확인해야 합니다.
- lsof를 사용하여 소스 파일에 더 이상 액세스할 수 없는 시기를 확인하세요.
- 동일하지만 압축이 풀린 파일에 계속 액세스할 수 있는지 확인합니다.
이들 중 어느 것도 정말 완벽하거나 깨끗하지 않습니다.
가장 쉬운 방법은 사용자 제어에서 벗어나 압축 해제를 수행하는 스크립트를 작성한 다음 코드를 실행하는 것입니다.
이것이 가능하지 않은 경우 사용자에게 파일의 압축을 풀 때 디스크에 pid 파일을 생성하는 스크립트를 생성하도록 요청하십시오. 그런 다음 PID 파일을 찾을 수 있습니다.