배경 "감시"가 변경 시 명령을 실행하도록 만드는 방법

배경 "감시"가 변경 시 명령을 실행하도록 만드는 방법

watch특정 명령과 파일(예 w: )에 사용하고 백그라운드에서 실행하고 변경 사항을 알려주고 싶습니다 . 나는 다음을 시도했습니다 :

(watch -g cat tmp && echo "changed") &

그러나 내용을 변경하면 아무 일도 일어나지 tmp않고 watch전경으로 가져올 때만 종료 됩니다 fg.

watch이것을 백그라운드에서 실행하고 변경 사항을 알려주는 방법이 있습니까 ?

답변1

쉬운 방법은 inotifywait모니터 -m모드를 사용하는 것입니다. 즉, 처음 기록된 이벤트 이후 종료하는 대신 영원히 실행하는 것입니다. 모니터링할 파일/디렉터리 수정과 같은 통풍구를 지정 -e하거나 열기, 액세스, 쓰기 등과 같은 모든 이벤트를 표시하지 않습니다. man inotifywait가능한 이벤트에 대한 자세한 내용은 리소스를 참조하세요.

$inotifywait -m -e modify tmp &
$echo 1 >> tmp
tmp MODIFY

단점은 이 버전에서는 명령을 직접 실행할 필요가 없고 표준 알림만 받을 수 있다는 것입니다. 명령을 명시적으로 실행하고 파일/디렉토리를 무기한 모니터링하려면 유사한 접근 방식을 사용할 수 있습니다( -quiet 모드 사용).

while ((1)) ; do \
   inotifywait -q -e modify tmp && echo "tmp was changed" \
done &

답변2

watch당신이 원하는 것을 위해 설계되지 않았습니다.

어느 시점에서 watch터미널을 재구성해 보십시오. 백그라운드에서SIGTTOU를 얻습니다그리고 멈춰라. 전체 작업은 SIGTTOU 신호를 수신합니다.

작업 제어 기능이 있는 대화형 셸에서는 jobs이후 호출에서 이를 확인할 수 있습니다. 에 zsh댓글이 표시됩니다 suspended (tty output). jobs이 정도의 정보는 다른 셸에서는 제공되지 않을 수 있습니다.

내 테스트에서는 stdout 및 stderr을 터미널에서 멀리 리디렉션해야 합니다.

(watch -g cat tmp >/dev/null 2>&1 && echo "changed") &

터미널의 원래 설정에 포함된 경우 tostop쓰기 echo를 시도할 때 SIGTTOU가 트리거됩니다. stty -tostop설정이 echo터미널로 인쇄를 허용하는지 미리 실행하여 확인하세요.

stty -tostop; (watch -g cat tmp >/dev/null 2>&1 && echo "changed") &

다른 프로세스가 터미널 자체를 구성할 수 있으므로 간섭이 발생할 수 있습니다.

관련 정보