Linux: непрерывная синхронизация файлов, в одну сторону
Сценарий: IDE устанавливается на рабочем столе Linux, редактируя файлы PHP локально. Каждый раз, когда я сохраняю файл, я хочу, чтобы это изменение появилось на сервере Linux, где работает Apache. На сервере есть ssh (и samba и nfs).
В качестве справки, когда я редактировал файлы в Windows, я наконец-то нашел WinSCP как именно тот инструмент, который мне нужен - в WinSCP есть только эта функция с начальной синхронизацией, а затем постоянным обновлением с использованием службы наблюдения за файловой системой: "Поддерживайте удаленный каталог до Дата".
В Linux можно утверждать, что sshfs можно использовать, чтобы полностью обойти необходимость синхронизации. На Windows, общий ресурс Samba будет делать то же самое. Тем не менее, я хочу, чтобы среда IDE работала с локальными файлами (на диске SSD!) Без необходимости проходить через сеть для индексирования PHP и чего-то такого, что занимает много времени.
Но, тем не менее, sshfs может быть частью решения - так что непрерывную синхронизацию просто необходимо выполнить между двумя локальными каталогами.
Любые идеи или указатели?
6 ответов
Вы также можете использовать inotifywait
из пакета inotify-tools.
inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
echo need to rsync $MODFILE ...
done
Lsyncd будет хорошим решением для этого.
Lsyncd отслеживает интерфейс монитора событий деревьев локальных каталогов (inotify или fsevents). Он объединяет и объединяет события в течение нескольких секунд, а затем запускает один (или более) процесс (ы) для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd - это легкое решение для живого зеркала, которое сравнительно легко установить, не требующее новых файловых систем или блочных устройств, и не снижающее производительность локальной файловой системы.
В итоге, он использует те же инструменты для выполнения работы (inotify и rsync), как предложено в других ответах, но его проще настроить для тех, кто не знаком со сценариями оболочки.
Мне это очень нужно, так как мой код должен работать на удаленных компьютерах, а я пишу код на локальной машине. Я нашел хороший инструмент, который вы можете использовать для постоянного мониторинга ваших локальных папок и синхронизации их с удаленной или локальной папкой: https://github.com/axkibe/lsyncd
Простая команда для непрерывной синхронизации локального каталога с удаленным компьютером через ssh будет:
lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>
Как и с любой другой командой rsync, убедитесь, что вы правильно указали путь к папке и проверили ее перед запуском. Я чуть не убил одну из своих удаленных машин, потому что не смог указать правильный каталог назначения. Убедитесь, что вы не пропустите удаленный путь и не используйте "/", если вы не знаете, что делаете.
Если вам нужно наблюдать за файловой системой, то inotify - способ сделать это. Я написал бы простой скрипт на python, использующий pyinotify для выполнения синхронизации при изменении файловой системы. Смотрите документацию. Вы также можете проверить autosync.py для вдохновения. Повеселись.
То, что я сделал однажды, это запустить скрипт 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
Запустите этот скрипт в новом терминале с именами файлов в качестве аргументов (после добавления в ваш инструмент синхронизации).
(Я использовал это для запуска компиляции, а не для синхронизации, но это будет работать аналогичным образом.)
Другой вариант: https://github.com/mikkorantalainen/rsync-continuous
Этот скрипт использует
bash
,
inotifywait
и
rsync
над
ssh
для создания очень быстрой односторонней синхронизации, потому что нужно передавать только измененные файлы, и если была изменена только часть файла, rsync передаст только измененную часть.
Если ты бежишь
mkdir -p ~/.ssh/connections
и добавьте следующее в начало
~/.ssh/config
производительность будет намного лучше:
ControlMaster auto
ControlPath ~/.ssh/connections/%r@%h:%p
ControlPersist 1
Обратите внимание, что приведенная выше конфигурация вызывает дополнительный вывод для каждого случая, когда вы выходите из-за ошибки ssh-соединения https://bugzilla.mindrot.org/show_bug.cgi?id=3220
Если вы сохраняете открытое ssh-соединение с удаленным хостом, используемым с вышеуказанным скриптом, файлы должны синхронизироваться с задержкой примерно 100 мс.
Гораздо более простой подход:
Экспортируйте ваш /var/www с помощью samba (или nfs) и работайте с файлами прямо на сервере.
Другое решение: большинство IDE допускают различные конфигурации развертывания - проверьте, подходит ли вам такая.
Или установите систему управления исходным кодом, такую как Git, Bazaar и т. Д.
Удачи!!