Як запустити rsync для зміни файлу?


18

Я можу синхронізувати папки rsync -avz /directory /target, тепер я хочу це зробити, якщо я змінив файл на /directoryтак, rsyncщоб він викликався автоматично.

Я використовую Virtual Box, і спільна папка Virtual Box дуже повільна, особливо якщо у вас є веб-сторінка, яка використовує спільну папку як корінь документа. З rsyncя міг би працювати з моїми локальними файлами в спільній папці і автоматично синхронізувати її з корінцем документа.

Я сподіваюся, що хтось має ідею, як це зробити, crontabбуло б не добре, тому що він виконується кожні х хвилин, тому якщо я нічого не роблю, він все одно зателефонує, rsyncале не, якщо я змінив файл.

З повагою

Відповіді:


18

crontab було б непогано, тому що він виконується кожні х секунд / хвилин, тому якщо я нічого не роблю, він все одно зателефонує rsync, але не, якщо я змінив файл

rsyncбуде синхронізувати лише ті файли, які були змінені. Якщо нічого не змінилося, воно вийде. Це дійсно мінімум накладних витрат.

Якщо ви незадоволені цим, можете скористатися inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Це буде миттєвішим, але воно буде робити щоразу, коли ви економите.


1
ну проблема здається, що inotify не в змозі перевірити спільні папки nfs. щоб переконатися, що я хочу, спробуйте описати, у мене встановлена ​​віртуальна скринька з бродячим, там у мене є спільна папка "проекти", вона встановлена ​​на завантажувальній системі; всі мої файли веб-сервера розташовані там, щоб я міг змінити їх на своєму хості Система (win7), як я сказав віртуальним папкам у спільному вікні, дуже повільна, тому рішенням може бути синхронізація встановленої папки nfs в інше місце, наприклад / var / www, але загальні способи не працюють, я спробував зміни файлів, icrontab, gues gamin або fam допоможе, але я не знаю, як їх запустити
BlackScorp

@BlackScorp реально, ви застрягли з просто заклинанням rsync і дозволяєте йому вирішити, що потрібно синхронізувати. Як я веду у відповіді, це не дуже страшний варіант.
Олі

1
Інший варіант - це виштовхувати файли з хоста, а не намагатися виявляти зміни віддалено.
Олі

добре це рішення я використовував раніше, у нього є 2 проблеми: 1) мені довелося щоразу відновлювати свою віртуальну скриньку для редагування файлів, а це означає, що моя віртуальна версія повинна працювати, швидке редагування більше не працює 2) я не знаю чому, але тому процес сканування проекту моєї IDE (Netbeans) самби показує 99% використання процесора, і все, що знаходиться у віртуальній коробці, просто повільно під час розробки я спробую рішення rsyn + cronjob або php побудувати в веб-сервері
BlackScorp

inotifywaitРішення має один невеликий , але істотний недолік: він не виявляє зміни , які відбулися , коли rsyncпрацюють. Розглянемо таку ситуацію: файл A змінено; спрацьовує rsync; коли rsync майже виконано синхронізацією файлу A, файл B змінюється. Тепер rsyncзакінчено і inotifywaitпрацює, але файл B не синхронізується і не буде синхронізований до наступних змін. Подумайте про використання,lsyncd як запропонував @Arigion.
MarSoft

6

Ви можете скористатися Lsyncd (Live Syncing Daemon) :

Lsyncd спостерігає інтерфейс монітора подій дерев локальних каталогів (ініціювати чи fsevents). Він агрегує та поєднує події протягом декількох секунд, а потім породжує один (або більше) процес (и) для синхронізації змін. За замовчуванням це rsync. Таким чином, Lsyncd - це легке живе дзеркальне рішення, яке досить просто встановити, не вимагаючи нових файлових систем або блокувати пристрої, і не перешкоджає роботі локальної файлової системи.

Ось, наприклад, підручник для Ubuntu 16.04 .


2

Ви можете використовувати inotifywaitі rsync. inotifywaitз modify,create,deleteактивованою подією Таким чином, ви будете синхронізуватися зі своїм сервером лише тоді, коли файл зміниться, інакше він синхронізується щоразу, коли файл буде прочитаний (редактори читають кілька разів ваш файл, щоб перевірити, чи є якісь зміни). Так сказано:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done

Це не виявить зміни, які відбулися під час запуску rsync. Подумайте про використання, lsyncdяк запропонував @Arigion.
MarSoft

це повторно застосує всі події для всіх файлів після кожної зміни ... і при застосуванні він не побачить жодних змін у тому періоді ...
Хтось

0

Трохи розширюючи коментар до прийнятої відповіді, я мав успіх за допомогою fswatch для запуску scpзмінених файлів до гостя. В Linux це обгортка, inotifyале це також крос-платформа (я на Mac з гостем QEMU на базі Arm). Я також брав участь у sshвіддаленій збірці. Підштовхувальний підхід добре працює з акціями, які ведуть себе не менш ідеально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.