내가 원하는 것: watch 명령을 사용하여 y 명령을 실행하고 명령 y의 출력이 변경되는 경우에만 watch 명령을 업데이트하십시오.
3줄의 에코 출력이 있는 bash 스크립트를 상상해 보세요.
Hello world!
Hello universe!
Aloha multiverse!
Bash 스크립트를 모니터링하고 싶지만, 스크립트를 편집하고 저장한 결과(따라서 수정 날짜) 해당 출력이 변경되는 경우에만 업데이트가 발생해야 합니다.
평소와 마찬가지로 기본적으로 2초마다 업데이트되는 watch 명령을 하루에 여러 시간 실행하면 스토리지 디스크의 수명이 너무 빨리 단축될까 걱정됩니다. 내 말은, 이 명령이 얼마나 많은 읽기/쓰기 작업을 생성할지 상상해보세요. 이건 정말 낭비라고 생각해요. watch 명령은 단순히 sleep하고 watch 명령을 저장하는 동작으로 watch를 깨우고 스크립트를 다시 실행한 다음 다시 sleep하면 더 좋을 것입니다.
내 말은: 우리 모두가 손으로 알고 있는 것과 자동으로 동일하다는 것입니다. 1. 스크립트를 작성하고, 2. 그런 다음 저장하고, 3. 그런 다음 다시 실행하여 저장된 변경 사항이 예상대로 실행되는지 확인합니다. 반복합니다. 변경 사항을 확인하기 위해 명령을 2초마다 실행하지 않고 이벤트에 따라 한 번만 실행한다는 의미입니다.
스크립트 작성과 스크립트 실행 사이의 지루하고 지속적인 전환을 자동화하는 비용은 읽기 및 쓰기 프로세스의 과도한 증가로 인해 스토리지 디스크의 수명을 소진시키는 불가피한 지속적인 간격 업데이트입니까?
타협점은 -n 옵션을 통해 간격을 연장하는 것일 수 있습니다(예: 30초마다). 하지만 watch 명령이 어떻게든 더 잘 수행할 수는 없을까요?
내 말은, 파일이 변경되면 -g 옵션을 사용하여 시계를 종료하도록 고려했지만 시계에서 아무 것도 변경되지 않고 2초마다 또는 변경이 발생할 때까지 무엇이든 읽게 되어 저장 디스크를 계속 사용하게 됩니다.
while 루프에도 같은 문제가 있습니다. 그렇죠? 아니면 이것이 해결책일 수도 있습니다. while 루프를 사용하여 watch 명령을 다시 작성하여 진정한 이벤트 기반(?)으로 만들고 스크립트를 개발할 때 읽기 및 쓰기 작업의 양을 최소화할 수 있을까요?
효율성, 미니멀리즘, 가능한 한 자원 절약에 관한 것입니다.
답변1
을 사용하는 대신 watch
을 사용하십시오 inotifywait
. 이것은 Linux용으로 제작되었습니다.아이노드 알림파일 시스템 변경 사항을 관찰하기 위해 이벤트 기반 API를 제공하는 커널 하위 시스템입니다.
Ubuntu에서 이 inotify-tools
패키지는 inotifywait
무엇보다도 파일, 디렉터리 또는 전체 파일 시스템에서 작동할 수 있는 다양한 가젯을 제공합니다.
따라서 (bash에서) 다음을 수행할 수 있습니다.
while true; do
diff <(./watchee) <(inotifywait -qqe modify ./watchee; ./watchee)
done
또는 다음을 사용하십시오 watch
(인용된 세미콜론 참고).
watch inotifywait -qqe modify ./watchee';' ./watchee
그리고 시계가 놓친 간격을 따라잡기 위해 많은 명령을 생성하지 않기를 바랍니다. BUGS
매뉴얼 페이지의 섹션에서 알 수 있듯이 이는 경우에 따라 발생할 수 있습니다.