Chame um comando, espere e execute outro comando

3

Isso parece uma situação em que preciso assistir a um stream (stdin), se uma linha chegar, espere um momento, depois ative o comando e espere um pouco mais.

Usando uma ferramenta como pyinotify ou fswatch, podemos assistir a uma pasta em busca de alterações e, quando uma for encontrada, ecoá-la.

fswatch --recursive --latency 2 src/ | xargs make build

ou

pyinotify -r -a -e IN_CLOSE_WRITE -c 'make build' src/

No meu caso, estou tentando descobrir como chamar make build sempre que um arquivo é alterado. Embora as ferramentas acima funcionem, elas podem acabar chamando muito make build e em rápida sucessão. Cada ferramenta funciona um pouco diferente, mas o resultado final é o mesmo (make está sendo chamado demais)

Eu preciso de todos os giratórios para parar, 1 segundo para decorrer e, em seguida, invocar fazer apenas uma vez.

Existe alguma maneira unix de agrupar os comandos e invocar o make? Algo parecido com isto:

fswatch --recursive src/ | aggregate_and_wait --delay 1second | make build

    
por 010110110101 26.10.2018 / 15:25

1 resposta

1

Tenha seu canário (o processo procurando por alterações) escreva um arquivo de estado em e. g. /var/run/build-needed .

Configure um cron job para ser executado a cada minuto (ou a cada cinco minutos, ou qualquer frequência que você julgue adequada ao seu caso de uso) seu script de compilação automatizado que:

  • verifique /var/run/build-needed e, se não for mais recente que /var/run/last-build , anule.
  • verifique /var/run/build-in-progress e, se estiver presente, cancele.
  • crie /var/run/build/in-progress
  • execute a compilação.
  • remova /var/run/in-progress e touch /var/run/last-build .

Exemplo de implementação de esqueleto:

O processo canário:

pyinotify -r -a -e IN_CLOSE_WRITE -c 'touch /var/run/build-needed' src/

O trabalho cron :

*/5 * * * * /path/to/autobuilder.sh

O script do construtor:

#!/bin/bash
canaryfile="/var/run/build-needed"
lastbuild="/var/run/last-build"
inprogress="/var/run/build-in-progress"
needbuild="no"
if [[ -f "$canaryfile" ]]; then
    if [[ -f "$lastbuild" ]] && [[ "$canaryfile" -nt "$lastbuild" ]]; then
        needbuild="yes"
    elif ! [[ -f "$lastbuild" ]]; then
        needbuild="yes"
    fi
fi
if ! [[ -f "$inprogress" && "yes" == "$needbuild" ]]; then
    cd /path/to/src
    touch "$inprogress"
    if make build; then
        rm "$inprogress"
        touch "$lastbuild"
    fi
fi
    
por 26.10.2018 / 17:48

Tags