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
단점은 이 버전에서는 명령을 직접 실행할 필요가 없고 표준 알림만 받을 수 있다는 것입니다. 명령을 명시적으로 실행하고 파일/디렉토리를 무기한 모니터링하려면 유사한 접근 방식을 사용할 수 있습니다( -q
uiet 모드 사용).
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") &
다른 프로세스가 터미널 자체를 구성할 수 있으므로 간섭이 발생할 수 있습니다.