Jak mogę sprawdzić, czy rsync wprowadził jakieś zmiany w bash?

12

Mam skrypt, który używa rsync do synchronizacji danych w zdalnym -> scenariuszu lokalnym. Natychmiast po uruchomieniu komendy rsync sprawdź, czy kod błędu jest równy zero, czy nie. Jeśli jest zero, wykonywane są dalsze polecenia. Nie bierze to jednak pod uwagę faktu, że rsync mógł działać poprawnie, ale nie wprowadził żadnych zmian. Z tego powodu warunek równego zeru będzie działał niezależnie, co jest nieco zbędne.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Jakie byłoby najlepsze podejście do rozszerzenia tego, aby sprawdzić, czy rzeczywiście były jakieś zmiany na podstawie uruchomionego polecenia rsync. Czytałem, że flaga -i może dostarczyć wyjście na standardowe wyjście, ale jak można to umieścić w bloku warunkowym?

James White
źródło
Masz już -vtam, więc już dostarcza informacji, których potrzebujesz, aby stdout ... np. Listy plików, które zostały faktycznie wysłane. Jeśli nic się nie zmienia, to po prostu ./.
goldilocks,
Ach! Co jeśli wyjąłem -v i zamiast tego użyję -i, a następnie użyję niepustego sprawdzania ciągu w komendzie rsync?
James White,
Wygląda na to, że sam znalazłeś rozwiązanie? :-)
Bjorn Munch
2
możesz użyć a=$("rsync command"). Spowoduje to wykonanie rsyncpolecenia i zapisanie stdoutw a. Następnie możesz uruchomić testya
nitishch,
1
Możesz także dodać | grep /coś lub coś takiego, a następnie sprawdzić status wyjścia grep za pomocą $?, powinien wynosić 1, jeśli nie było wyjścia.
Bjorn Munch,

Odpowiedzi:

9

Opierając się na komentarzach do mojego pierwotnego pytania, ustaw wyjście rsync na standardowe wyjście z flagą -i i użyj warunku sprawdzania nieciągłości, aby sprawdzić, czy coś faktycznie zmieniło się w ramach sprawdzania kodu błędu. Zawinięcie polecenia rsync w zmiennej pozwala na sprawdzenie.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Potencjalne minusem, musisz stracić pełne dane wyjściowe, ale zawsze możesz zamiast tego zalogować je do pliku.

James White
źródło
1

Chciałem bardziej rygorystycznego rozwiązania. Nie chcę grepować za Number of created files:(wiadomość może być w innym języku) ani usuwać wszystkich wierszy oprócz dwóch -vwyjściowych (kto wie, jakie podsumowanie rsyncwydrukuje w następnej wersji?).

Odkryłem, że możesz ustawić format rsyncdziennika, ale nie format jego standardowego wyjścia (patrz man rsyncd.conf).

Na przykład dodaj „Plik zmieniony!” do każdej linii z faktycznie zmienionym plikiem, a następnie grep:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
Victor Sergienko
źródło