인수를 받을 때마다 `xargs`를 실행하도록 하세요.모든 "-n" 매개변수 대신?

인수를 받을 때마다 `xargs`를 실행하도록 하세요.모든 "-n" 매개변수 대신?

저는 파일 시스템 변경 사항을 모니터링하고 변경되는 파일을 기반으로 명령을 실행하기 위해 fswatch및 를 사용하고 있습니다. 변경된 파일을 표준 출력으로 인쇄하고 표준 입력에서 사용합니다.xargsfswatchxargs <my command>

을 사용하면 xargs -n1모든 변경 후에 명령이 실행됩니다. 을 사용하면 xargs -n100100번의 변경이 발생할 때까지 내 명령이 실행되지 않습니다. 1초 이내에 발생하는 모든 변경사항(파라미터)을 일괄 처리하고 싶습니다.

xargs가 stdin에서 한 번에 50줄을 수신하는 경우 xargs가 한 번의 호출로 50줄을 모두 내 명령에 전달하도록 하고 싶습니다 xargs -n1. 하지만 xargs가 분당 1줄만 수신한다면 호출하기 전에 50분을 기다리고 싶지 않습니다. 명령은 상대적으로 대화형이기를 원합니다(예: xargs가 stdin에서 0이 아닌 수의 인수를 수신하는 경우 최대 1초).

미리 감사드립니다!

답변1

Bash에 액세스할 수 있는 경우 및/또는 변수의 -t(시간 초과) 옵션을 사용할 수 있습니다.readSECONDS

조금 보기 흉하지만 약 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)를 모니터링합니다. 몇 초 동안 이벤트를 집계하고 결합한 다음 프로세스를 생성하여 변경 사항을 동기화합니다.

관련 정보