글쓴이 보관물: 소장 마

파이프 라인에서 이전에 명령의 PID 얻기 데 사용하는 bash 스크립트를 작성 중입니다. 다음과

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
}


답변

이 SO 답변 은 해당되는 것으로 보입니다.

inotifywait -m file > >(while read f; do echo f; done) &


답변