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.