파일의 콘텐츠 변경 사항을 모니터링하고 콘텐츠가 변경되면 새 텍스트를 표시하는 알림을 생성하고 싶습니다.
세부 사항
file( connection.txt
)에는 단어만 포함되어 있다고 가정합니다 "You are connected to the internet"
.
그러나 컴퓨터의 인터넷 연결이 끊어지면 파일 내용이 "You are now disconnected from the internet"
.
파일 내용을 모니터링하고 내용이 변경될 때만 데스크탑 알림에 새 텍스트를 표시하려면 어떻게 해야 합니까(저는 Manjaro를 사용하고 있습니다).
설상가상으로 파일은 4초마다 업데이트되며 종종 정확히 동일한 텍스트를 포함합니다.
내 연구
이 문제에 대한 해결책을 찾았지만 아무 소용이 없었습니다. 파일 생성, 수정, 삭제 등 파일 및 디렉터리 이벤트에 대한 변경 사항을 모니터링하는 사례를 많이 찾았지만 파일 내의 텍스트를 실시간으로 모니터링하는 사례는 없었습니다.
가능하다면 명령 출력의 변경 사항을 모니터링하는 유사한 기술이 있습니까?
답변1
파일을 모니터링하고 내용이 변경될 때 새 파일 내용이 포함된 데스크톱 알림만 보내려는 일반적인 경우에는 inotifywait
(from inotify-tools
) 및 -m
, --monitor
옵션을 사용하여 이 작업을 무기한 수행할 수 있습니다.
--format "%e"
다음 명령에는 이벤트 유형만 인쇄됩니다.
notify-send
, 에서도서관 알림데스크톱 알림의 경우 파일 내용이 수정된 경우에만 알림을 보내는 데 사용됩니다.
#!/bin/bash
f="filename"
curr=$(<"$f")
inotifywait -m -e modify "$f" --format "%e" | while read -r event; do
if [ "$event" == "MODIFY" ]; then
prev="$curr"
curr=$(<"$f")
[ "$curr" == "$prev" ] || notify-send "Title" "$curr"
fi
done
특정 사례의 경우 "연결되었습니다" 또는 "연결이 끊어졌습니다"와 같은 텍스트가 포함된 데스크톱 알림을 표시하는 것이 목표라면 파일 변경 사항을 감시하지 않을 것입니다. 파일에서 해당 텍스트를 인쇄하는 위치를 다음과 같이 수정하겠습니다(말씀하신 대로 N초마다).
while true; do
prev="$curr"
curr=$( <here you output the new text> )
[ "$curr" == "$prev" ] || notify-send "Title" "$curr"
sleep 4
done
답변2
하나 공유하고 싶어요해골암호. 이 아이디어를 확장할 수 있습니다.
#!/bin/bash
# monitor_changes
#
# notifies changes to FILE passed as first parameter $1
# uses tail -1 to return last line of the file
# first run -- save last line on variable old
old=$(tail -1 $1)
# infinite loop
while : ; do
sleep 1
# read again last line
new=$(tail -1 $1)
# this is where the magic should happen
[[ "$old" != "$new" ]] && echo "NOTIFY: $old --> $new"
# save for next round
old=$new
done
답변3
inotify
(잠재적인) 변경 사항을 캡처합니다. 파일이 수정되었다고 해서 파일이 변경되었다는 의미는 아닙니다.
make
파일 변경 동작. 파일 날짜와 함께 작동하므로 신뢰할 수 있어야 합니다. 출력 파일도 필요합니다. 이는 화면에 쓴 후 생성하는 더미 파일일 수 있습니다.
두 번째 부분을 완성하는 다른 도구: 예를 들어 날짜 대신 파일 해시를 사용하고, 파일이 작은 경우 복사본을 유지하고 cmp
.
사용예
#!/bin/bash
while true
do
inotify-wait --event modify source-file.txt
make $(basename source-file .txt).stamp
#there is a race hazard here: if the file changes again before we get back to the wait, then it may not be picked up.
done
# A make file template
%.stamp: %.txt
«tab» do_it $<
«tab» touch $@
«탭»을 탭으로 바꾸세요. do_it
이를 수행하는 코드로 바꿉니다 . $<
소스 파일 이름으로 대체됩니다 .