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


61

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

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

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

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

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


рассмотрите возможность использования инструмента 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), как предложено в других ответах, но его проще настроить для тех, кто не знаком со сценариями оболочки.


не только проще, но и пытается правильно обрабатывать ситуации, такие как перемещение каталога, без 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 и т. Д.

Удачи !!


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