Linux: непрерывная синхронизация файлов, в одну сторону

61

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

В качестве справки, когда я редактировал файлы в Windows, я наконец-то нашел WinSCP как именно тот инструмент, который мне нужен - в WinSCP есть только эта функция с начальной синхронизацией, а затем постоянным обновлением с использованием службы наблюдения за файловой системой: «Поддерживайте удаленный каталог до Свидание".

В Linux можно утверждать, что sshfs можно использовать, чтобы полностью обойти необходимость синхронизации. На Windows, общий ресурс Samba будет делать то же самое. Тем не менее, я хочу, чтобы среда IDE работала с локальными файлами (на диске SSD!) Без необходимости проходить через сеть для индексирования PHP и чего-то такого, что занимает много времени.

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

Любые идеи или указатели?

stolsvik
источник
рассмотрите возможность использования инструмента rsync или предоставления общего доступа к папке в корневом каталоге документов веб-сервера, чтобы вы могли работать с файлами непосредственно под окнами
Vinicius Kamakura
2
rsync это "один ход". Мне нужны постоянные обновления, вот и весь смысл - я редактирую файл, сохраняю его, и продукт / система / идея, которую я запрашиваю, выберет это действие сохранения и немедленно загрузит новую версию. NB: обе стороны Linux. NB2: я хочу редактировать локальные файлы, иначе sshfs сам порежет это.
stolsvik
6
Избиратели не по теме, это пограничный случай, но я думаю, что он довольно четко подпадает под «инструменты, обычно используемые программистами» в FAQ.
Карл Билефельдт
Хотя это не идеальный матч, вы можете посмотреть на overlayfs
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.
Карл Билефельдт
Я искал именно эту вещь прошлой ночью! аааа, я люблю суперпользователя
CenterOrbit
Есть ли способ сделать это, но оставить сокет открытым? rsync/ scpимеет раздражающую задержку при установлении соединения ssh.
Вспышка
1
@ Flash да, вы можете использовать мультиплексирование SSH, чтобы держать сокет открытым.
Уилл Энгли
31

Lsyncd было бы хорошим решением для этого.

Lsyncd отслеживает интерфейс монитора событий деревьев локальных каталогов (inotify или fsevents). Он объединяет и объединяет события в течение нескольких секунд, а затем запускает один (или более) процесс (ы) для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd - это легкое решение для живого зеркала, которое сравнительно легко установить, не требующее новых файловых систем или блочных устройств, и не снижающее производительность локальной файловой системы.

В итоге, он использует те же инструменты для выполнения работы (inotify и rsync), как предложено в других ответах, но его проще настроить для тех, кто не знаком со сценариями оболочки.

jcharaoui
источник
не только проще, но и пытается правильно обрабатывать ситуации, такие как перемещение каталога, без 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, убедитесь, что вы правильно указали путь к папке и проверили ее перед запуском. Я чуть не убил одну из своих удаленных машин, потому что не смог указать правильный каталог назначения. Убедитесь, что вы не пропустите удаленный путь и не используйте «/», если вы не знаете, что делаете.

Гарри
источник
Это заслуживает гораздо большего количества голосов даже через три года после
публикации
Прекрасно работает, наконец-то получил его работать на моем Mac OS Sierra, работает потрясающе.
Эрик ван де Вен
2

Если вам нужно наблюдать за файловой системой, то inotify - способ сделать это. Я написал бы простой скрипт на 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 и т. Д.

Удачи !!

Dragos
источник
3
Спасибо за ответы. Однако я специально исключил этот самый подход в этом вопросе.
stolsvik