inotifywait
디렉토리를 모니터링하고 변경 사항이 감지되면 작업을 시작하는 데 사용하는 bash 스크립트를 작성 중입니다. 다음과 같은 것 :
inotifywait -m ... | while read f; do something; done
이후 inotifywait
자체가 종료되지 않습니다,이 스크립트는 중단되지 않습니다.
그래서 내 계획은 inotifywait 프로세스의 PID를 가져 와서 파일에 저장하고 나중에 다른 프로세스가 종료하도록하는 것입니다.
inotifywait -m ... | { echo ??PID?? > pid-file; while ... }
그러나 PID를 얻는 방법을 모르겠습니다. 이것을 달성하는 간단한 방법이 있습니까? 또 다른 방법은 쉘 스크립트의 PID를 $$
파일에 저장하고 전체 쉘 스크립트를 종료하는 것이지만 while 루프 후 정리를 원했습니다.
나는 사용을 시도했지만 coproc
그것이 효과가 있다고 생각하지만 필요 이상으로 더 복잡해 보입니다.
답변
파이프 라인에서 모든 프로세스는 동시에 시작 되며 다른 프로세스 보다 빠른 프로세스는 없습니다 .
당신은 할 수 있습니다 :
(echo "$BASHPID" > pid-file; exec inotifywait -m ...) | while IFS= read -r...
또는 휴대용으로 :
sh -c 'echo "$$" > pid-file; exec inotifywait -m ...' | while IFS= read -r...
또한 while
루프 를 실행하는 서브 쉘이 종료되면 inotifywait
다음에 stdout에 무언가를 쓸 때 자동으로 종료됩니다 .
답변
루프에 프로세스 ID가 필요한 경우 먼저 인쇄하십시오.
sh -c 'echo "$$"; exec inotifywait -m ...' | {
read inotifywait_pid
while IFS= read -r f; do
…
if …; then kill "$inotifywait_pid"; break;
done
}