Os 'xargs' executam os argumentos que recebem a cada período de tempo máximo em vez de todos os argumentos '-n'?

2

Estou usando fswatch e xargs para observar alterações no sistema de arquivos e executar comandos dependendo de quais arquivos estão sendo alterados. fswatch imprime os arquivos alterados para stdout e xargs <my command> os consome de stdin.

Se eu usar xargs -n1 , meu comando será executado após cada alteração. Se eu usar xargs -n100 , meu comando não será executado até que haja 100 alterações. Eu gostaria de lote todas as alterações (argumentos) que ocorrem dentro de 1 segundo.

Se o xargs receber 50 linhas no stdin de uma só vez, gostaria que o xargs passasse todas as 50 delas para o meu comando em uma única chamada, em vez de 50 invocações separadas com xargs -n1 . Mas se xargs receber apenas 1 linha por minuto, eu não quero esperar 50 minutos antes do meu comando ser chamado; Eu quero que seja relativamente interativo (ou seja, ~ 1 segundo no máximo, desde que xargs tenha recebido um número de argumentos diferente de zero no stdin).

Obrigado antecipadamente!

    
por arya 16.08.2018 / 22:41

2 respostas

4

Se você puder usar o Bash, poderá usar a opção -t (tempo limite) para read e / ou a variável SECONDS .

Isso é um pouco feio, mas funciona para agrupar as entradas que chegam aproximadamente dentro de um segundo:

#!/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

O tempo limite em read impede que o bloqueio permaneça para sempre, e o teste contra SECONDS garante que o loop interno seja interrompido mesmo no caso patológico em que read é inserido uma vez por segundo, para sempre.

    
por 16.08.2018 / 23:06
1

Use o Lsyncd em vez de reinventar a roda;

lsyncd -rsyncssh /home remotehost.org backup-home/

link

Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes.

    
por 17.08.2018 / 01:28