저는 파일 시스템 변경 사항을 모니터링하고 변경되는 파일을 기반으로 명령을 실행하기 위해 fswatch
및 를 사용하고 있습니다. 변경된 파일을 표준 출력으로 인쇄하고 표준 입력에서 사용합니다.xargs
fswatch
xargs <my command>
을 사용하면 xargs -n1
모든 변경 후에 명령이 실행됩니다. 을 사용하면 xargs -n100
100번의 변경이 발생할 때까지 내 명령이 실행되지 않습니다. 1초 이내에 발생하는 모든 변경사항(파라미터)을 일괄 처리하고 싶습니다.
xargs가 stdin에서 한 번에 50줄을 수신하는 경우 xargs가 한 번의 호출로 50줄을 모두 내 명령에 전달하도록 하고 싶습니다 xargs -n1
. 하지만 xargs가 분당 1줄만 수신한다면 호출하기 전에 50분을 기다리고 싶지 않습니다. 명령은 상대적으로 대화형이기를 원합니다(예: xargs가 stdin에서 0이 아닌 수의 인수를 수신하는 경우 최대 1초).
미리 감사드립니다!
답변1
Bash에 액세스할 수 있는 경우 및/또는 변수의 -t
(시간 초과) 옵션을 사용할 수 있습니다.read
SECONDS
조금 보기 흉하지만 약 1초 내에 발생하는 입력을 그룹화할 수 있습니다.
#!/bin/bash
while true; do
values=()
start=$SECONDS
while [ "$SECONDS" -lt $((start + 1)) ]; do
if IFS= read -r -t 1 line; then
values+=("$line")
fi
done
if [ "${#values[@]}" != 0 ]; then
echo got "${values[@]}"
# do something useful with "${values[@]}" here
fi
done
타임아웃은 영원히 차단되는 것을 방지하며, read
매초 영원히 입력을 받는 병리적인 경우에도 SECONDS
내부 루프가 끊어지는 것을 테스트를 통해 보장합니다.read
답변2
바퀴를 재발명하는 대신 Lsyncd를 사용하십시오.
lsyncd -rsyncssh /home remotehost.org backup-home/
https://github.com/axkibe/lsyncd/blob/master/README.md
Lsyncd는 로컬 디렉터리 트리 이벤트 모니터 인터페이스(inotify 또는 fsevents)를 모니터링합니다. 몇 초 동안 이벤트를 집계하고 결합한 다음 프로세스를 생성하여 변경 사항을 동기화합니다.