파이프 라인에서 이전에 명령의 PID 얻기


11

inotifywait디렉토리를 모니터링하고 변경 사항이 감지되면 작업을 시작하는 데 사용하는 bash 스크립트를 작성 중입니다. 다음과 같은 것 :

inotifywait -m ... | while read f; do something; done

이후 inotifywait자체가 종료되지 않습니다,이 스크립트는 중단되지 않습니다.

그래서 내 계획은 inotifywait 프로세스의 PID를 가져 와서 파일에 저장하고 나중에 다른 프로세스가 종료하도록하는 것입니다.

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }

그러나 PID를 얻는 방법을 모르겠습니다. 이것을 달성하는 간단한 방법이 있습니까? 또 다른 방법은 쉘 스크립트의 PID를 $$파일에 저장하고 전체 쉘 스크립트를 종료하는 것이지만 while 루프 후 정리를 원했습니다.

나는 사용을 시도했지만 coproc그것이 효과가 있다고 생각하지만 필요 이상으로 더 복잡해 보입니다.


이`ps -ef | grep processName | grep -v grep | awk '{print $ 2}'| xargs를 죽일 -9`
Kiwy

@Kiwy-그 혼란 대신에 그냥 pgrep inotifywait. 그러면 PID를 죽일 수 pkill inotifwait있습니다.
slm

@slm 시스템에 따라 grep 및 ps가 거의있는 동안 pgrep 및 pkill이 없습니다. 천만에요
Kiwy

@Kiwy-의심의 여지가 있지만, 이러한 도구는 어디에나 있습니다. 또한 당신은 grep -v grep대신 ps -ef | grep [p]rocessname...할 필요가 없습니다 .
slm

1
@DavidsonChua-예, -f더 많은 실행 파일 이름과 일치 해야하는 경우 스위치를 사용할 수 있습니다 .
slm

답변:


6

파이프 라인에서 모든 프로세스는 동시에 시작 되며 다른 프로세스 보다 빠른 프로세스는 없습니다 .

당신은 할 수 있습니다 :

(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에 무언가를 쓸 때 자동으로 종료됩니다 .


3

루프에 프로세스 ID가 필요한 경우 먼저 인쇄하십시오.

sh -c 'echo "$$"; exec inotifywait -m ...' | {
  read inotifywait_pid
  while IFS= read -r f; do
    
    if …; then kill "$inotifywait_pid"; break;
  done
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.