Linux: Постійно синхронізуйте файли, один спосіб


61

Сценарій: IDE встановлюється на робочому столі Linux, редагуючи файли PHP локально. Кожного разу, коли я зберігаю файл, я хочу, щоб ця зміна з’являлася на сервері linux, де працює Apache. На сервері є ssh (і самба та nfs для цього питання).

В якості довідки, коли я редагував файли в Windows, я нарешті натрапив на WinSCP як точний інструмент, який мені потрібен. У WinSCP є лише ця функція, наявна з початковою синхронізацією, а потім безперервним оновленням, використовуючи службу перегляду файлової системи: "Зберігайте віддалений каталог до Дата".

У Linux можна стверджувати, що sshfs можуть бути використані для повного виходу з потреби в синхронізації. У вікнах поділка самби зробила б те саме. Однак я хочу, щоб IDE працював з локальними файлами (на SSD-диску!), Не потрібно переходити по мережі, щоб робити індексацію PHP та інше, що займає віки.

Але sshfs все ж може бути частиною рішення - так що безперервну синхронізацію потрібно було зробити між двома локальними каталогами.

Якісь ідеї чи покажчики?


Подумайте про використання інструменту rsync або обміну папкою в корені документа веб-сервера, щоб ви могли працювати з файлами безпосередньо під Windows
— Vinicius Kamakura,

2
rsync - це "один хід". Мені потрібні безперервні оновлення, у цьому вся суть - я редагую файл, зберігаю його, а продукт / система / ідея, яку я запитую, підберу цю операцію збереження та негайно завантажую нову версію. NB: Обидві сторони є Linux. NB2: Я хочу редагувати в локальних файлах, інакше sshfs сам би вирізав це.
— stolsvik

6
Виборці поза темою, це прикордонний випадок, але я думаю, що це досить чітко підпадає під "інструменти, якими зазвичай користуються програмісти" у FAQ.
— Карл Білефельдт

Хоча це не ідеальна відповідність, ви можете подивитися накладки
— phs

Відповіді:


57

Ви також можете використовувати inotifywaitз пакету інструментів inotify-tools.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

13
На веб-сайті inotify-tools є досить хороший приклад використання inotify-wait, щоб запустити rsync.
— Карл Білефельдт

Я шукав саме цю річ минулої ночі! ах, я люблю
— суперрузер

Чи є спосіб це зробити, але тримати розетку відкритою? rsync/ scpмає дратівливу затримку під час встановлення ssh-з'єднання.
— Спалах

1
@Flash так, ви можете використовувати мультиплексування SSH, щоб зберегти розетку відкритою.
— Вілл Еглі

31

Lsyncd був би хорошим рішенням для цього.

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

Знизу, він використовує ті ж інструменти, щоб виконувати роботу (ініціювати та rsync), як пропонують інші відповіді, але це легше налаштувати для того, хто не знайомий із сценарієм оболонок.


не тільки простіше, але також намагається правильно впоратися з ситуаціями, такими як переміщення каталогу, без rsyncing.
— Ciantic

5
Остерігайтеся: Ця програма має деякі проблемні особливості. На момент написання цього запису: 1. Він видаляє віддалені файли, відсутні у джерелі за замовчуванням. 2. "віддалений:" посилається на "віддалений: /" замість домашньої папки. 3. Це демонізує, тож ви не знаєте, що відбувається. 4. Не одразу поважає сигнал TERM.
— Фрідріх

27

Мені це дуже потрібно, оскільки мій код повинен працювати на віддалених коробках, і я пишу код на локальній машині. Я знайшов чудовий інструмент, за допомогою якого можна постійно контролювати локальні папки та синхронізувати їх у віддаленій або локальній папці: https://github.com/axkibe/lsyncd

Проста команда для постійної синхронізації локального режиму з віддаленою машиною над ssh буде:

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

Як і в будь-якій іншій команді rsync, переконайтеся, що ви правильно вказали шлях до папки та перевірте, перш ніж запустити команду. Я ледь не вбив одну зі своєї віддаленої машини, тому що я пропустив правильний каталог призначення. Переконайтеся, що ви не пропустіть віддалений шлях і не використовуйте "/", якщо ви не знаєте, що робите.


Це заслуговує на набагато більше результатів, навіть через три роки після його опублікування
— FliiFe,

Чудово працює, нарешті отримав це, працюючи на моїй Mac OS Sierra, працює чудово.
— Ерік ван де Вен

2

Якщо вам потрібно спостерігати за файловою системою, то спосіб ініціації - це зробити. Я б написав простий скрипт python, використовуючи pyinotify для виконання синхронізації при зміні файлової системи. Дивіться документацію . Ви також можете ознайомитись з autosync.py за деяким натхненням. Весело.


1

Що я колись робив - це сценарій bash, який працює ls -lв циклі (з деяким сном) і порівнюється з попереднім результатом. Якщо він змінився, виконайте синхронізацію.

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

Запустіть цей скрипт у новому терміналі, імена файлів як аргументи (після введення інструменту синхронізації).

(Я використовував це для запуску компіляції, а не для синхронізації, але це діятиме аналогічно.)


-1

Набагато простіший підхід:

Експортуйте / var / www за допомогою samba (або nfs) та працюйте над файлами безпосередньо на сервері.

Ще одне рішення: більшість IDE дозволяють різні конфігурації розгортання - перевірте, чи є такий, який вам підходить.

Або встановіть систему управління вихідним кодом на зразок Git, Bazaar тощо.

Удачі !!


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