Bir komut çağırın, bekleyin, sonra başka bir komutu yürütün


3

Bu bir akışı izlemem gereken bir durum gibi görünüyor (stdin), bir satır gelirse, bir dakika bekle, sonra emri başlat ve biraz daha bekle.

Pyinotify veya fswatch gibi bir araç kullanarak, değişiklikler için bir klasörü izleyebiliriz ve biri bulunduğunda, onu dışkılayabilir.

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

veya

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

Benim durumumda, make buildbir dosya değiştiğinde nasıl arayacağımı bulmaya çalışıyorum . Yukarıdaki araçlar işe yararken, make buildçok fazla ve hızlı bir şekilde art arda arayabilirler . Her araç biraz farklı çalışır, ancak sonuç aynıdır (make çok fazla aranıyor)

Durup durmadan, durmak için 1 saniye, sonra da bir kez yapmak için çağrı yapmam gerekiyor.

Komutları toplamak ve daha sonra make'i çağırmak için bir unix yolu var mı? Bunun gibi bir şey:

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


Yapıyı sleep 1en üstte bir yerlerde çalıştıran bir betik yazın . Kendiniz fswatchya da pyinotifyo betiği arayın.
DopeGhoti

Akıntıya 5 satır gelirse, bu yaklaşım komutu hala 5 kez ateşler.
010110110101

Yanıtlar:


1

Kanaryaya (değişiklikleri arama işlemi) örneğin bir durum dosyası yazmasını sağlayın /var/run/build-needed.

Her dakika (veya her beş dakikada bir veya kullanım durumunuz için uygun olduğunu düşündüğünüz frekansı) çalıştırmak için bir cron işi kurun:

  • kontrol edin /var/run/build-neededve daha yeni değilse /var/run/last-buildiptal edin.
  • kontrol edin /var/run/build-in-progressve varsa durdurun.
  • yaratmak, yapmak, tasarlamak, üretmek /var/run/build/in-progress
  • yapıyı çalıştır.
  • kaldırmak /var/run/in-progressve touch /var/run/last-build.

Örnek bir iskelet uygulaması:

Kanarya işlemi:

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

croniş:

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

Oluşturucu komut dosyası:

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

Söylemekten nefret ediyorum, ama bu yapmaya çalıştığım şey için çok karmaşık. Aslında bir Makefile kullanıyorum, bu yüzden oldukça dar, küçük, minimal bir şey arıyorum. Bir cron tab girişi çok ağır. Bununla birlikte, genel olarak, bir kanarya dosyası nosyonu anlamlıdır. Böyle bir şey sadece 2-3 satır bashta nasıl yapılabilir?
010110110101

Bu komut çifti çalışır, ancak onları aynı anda çağırmanın bir yolu var ve sonra Ctrl + C olduğunda ikisi de bırakıyorlar mı? @fswatch --recursive src/ | xargs -I{} touch build-canary; @while inotifywait -e close_write build-canary; do sleep 3 && make build; done
010110110101

Ne kadar sağlam olmasını istediğine bağlı. Örneğin bu örnek, bir başkası giderken bir yapı oluşturmamanızı sağlar, ki bu iyi bir fikirdir, ancak asıl sorunuzda belirtilmemiş.
DopeGhoti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.