Поддерживайте актуальность удаленного каталога
Вопрос
мне очень нравится Поддерживайте актуальность удаленного каталога функция в Winscp.К сожалению, я не могу найти ничего более простого для использования в OS X или Linux.Я знаю, то же самое может теоретически быть достигнуто с использованием измененные файлы или rsync, но я всегда считал, что учебные пособия по обоим инструментам отсутствуют и/или противоречат друг другу.
По сути, мне просто нужен инструмент, который работает в OSX или Linux и синхронизирует (зеркалирует) удаленный каталог с локальным каталогом, пока я вношу изменения в локальный каталог.
Обновлять
Просматривая решения, я вижу пару, которая решает общую проблему синхронизации удаленного каталога с локальным каталогом. вручную.Я знаю, что могу задать задачу cron для запуска rsync каждую минуту, и это должно быть достаточно близко к реальному времени.
Это не то решение, которое я искал, поскольку winscp делает это и многое другое:он обнаруживает изменения файлов в каталоге (пока я над ними работаю), а затем автоматически отправляет изменения на удаленный сервер.Я знаю, что это не лучшее решение (нет репозитория кода), но оно позволяет мне очень быстро тестировать код на сервере во время его разработки.Кто-нибудь знает, как объединить rsync с другими командами, чтобы получить эту функциональность?
Решение
В каком режиме «реального времени» вы хотите синхронизировать?Я бы по-прежнему склонялся к rsync, поскольку вы знаете, что он будет полностью поддерживаться на обеих платформах (в том числе и Windows с cygwin), и вы можете запустить его с помощью задания cron.У меня есть очень простой файл bash, который я запускаю в своей системе (это делает нет удалить старые файлы):
#!/bin/sh
rsync -avrz --progress --exclude-from .rsync_exclude_remote . remote_login@remote_computer:remote_dir
# options
# -a archive
# -v verbose
# -r recursive
# -z compress
Лучше всего настроить его и опробовать.А -n (--dry-run)
вариант — твой друг!
Имейте в виду, что rsync (по крайней мере, в cygwin) не поддерживает имена файлов в Юникоде (по состоянию на 16 августа 2008 г.).
Другие советы
lsyncd кажется идеальным решением.он сочетает в себе уведомлять (встроенная функция ядра, которая отслеживает изменения файлов в деревьях каталогов) и rsync (инструмент кросс-платформенной синхронизации файлов).
lsyncd -rsyncssh /home remotehost.org backup-home/
Цитата с гитхаба:
Lsyncd отслеживает интерфейс монитора событий деревьев локальных каталогов (inotify или fsevents).Он объединяет и комбинирует события в течение нескольких секунд, а затем запускает один (или несколько) процессов для синхронизации изменений.По умолчанию это rsync.Таким образом, Lsyncd представляет собой легкое решение с живым зеркалом, которое сравнительно легко установить, не требует новых файловых систем или блочных устройств и не снижает производительность локальной файловой системы.
Для удаленного доступа к Linux вы хотите использовать «sshfs» — файловую систему SSH.
# sshfs username@host:path/to/directory local_dir
Тогда относитесь к нему как к сетевому монтированию, а оно и есть...
Немного подробнее, например, как настроить, чтобы вы могли делать это как обычный пользователь, на мой блог
Если вам нужно асинхронное поведение winSCP, вам нужно использовать rsync в сочетании с чем-то, что периодически его выполняет.Приведенное выше решение cron работает, но может быть излишним для варианта использования winscp.
Следующая команда будет выполнять rsync каждые 5 секунд для отправки контента на удаленный хост.Вы можете настроить время сна по мере необходимости, чтобы снизить нагрузку на сервер.
# while true; do rsync -avrz localdir user@host:path; sleep 5; done
Если у вас очень большая структура каталогов и вам нужно уменьшить накладные расходы на опрос, вы можете использовать «найти»:
# touch -d 01/01/1970 last; while true; do if [ "`find localdir -newer last -print -quit`" ]; then touch last; rsync -avrz localdir user@host:path; else echo -ne .; fi; sleep 5; done
И я сказал, что cron может быть излишним?Но, по крайней мере, все это делается из командной строки и может быть остановлено с помощью ctrl-C.
КБ
Чтобы обнаружить измененные файлы, вы можете попробовать fam (монитор изменения файлов) или inotify.Последний специфичен для Linux, у fam есть порт bsd, который может работать в OS X.Оба имеют инструменты пользовательского пространства, которые можно использовать в сценарии вместе с rsync.
У меня такая же проблема.Мне понравилась команда winscp «поддерживать актуальность удаленного каталога».Однако, пытаясь избавиться от Windows, я потерял winscp.Я написал сценарий, который использует fileschanged и rsync, чтобы сделать что-то подобное, гораздо ближе к реальному времени.
Как использовать:
- Убедитесь, что у вас установлены файлы fileschanged.
- Сохраните этот скрипт в /usr/local/bin/livesync или где-нибудь в доступном месте в $PATH и сделайте его исполняемым.
- Используйте Nautilus для подключения к удаленному хосту (sftp или ftp)
- Запустите этот скрипт, выполнив livesync ИСТОЧНИК НАЗНАЧЕНИЯ
- Каталог DEST будет находиться в /home/[имя пользователя]/.gvfs/[путь к ftp scp или как-то еще]
Пара минусов:
- Он медленнее, чем winscp (я думаю, потому что он проходит через Nautilus и также должен обнаруживать изменения через rsync)
- Вам придется вручную создать каталог назначения, если он еще не существует.Поэтому, если вы добавляете каталог, он не обнаружит и не создаст каталог на стороне DEST.
- Наверное больше, чего я еще не заметил
- Кроме того, не пытайтесь синхронизировать каталог SRC с именем «rsyncThis».Наверное, это будет нехорошо :)
#!/bin/sh
upload_files()
{
if [ "$HOMEDIR" = "." ]
then
HOMEDIR=`pwd`
fi
while read input
do
SYNCFILE=${input#$HOMEDIR}
echo -n "Sync File: $SYNCFILE..."
rsync -Cvz --temp-dir="$REMOTEDIR" "$HOMEDIR/$SYNCFILE" "$REMOTEDIR/$SYNCFILE" > /dev/null
echo "Done."
done
}
help()
{
echo "Live rsync copy from one directory to another. This will overwrite the existing files on DEST."
echo "Usage: $0 SOURCE DEST"
}
case "$1" in
rsyncThis)
HOMEDIR=$2
REMOTEDIR=$3
echo "HOMEDIR=$HOMEDIR"
echo "REMOTEDIR=$REMOTEDIR"
upload_files
;;
help)
help
;;
*)
if [ -n "$1" ] && [ -n "$2" ]
then
fileschanged -r "$1" | "$0" rsyncThis "$1" "$2"
else
help
fi
;;
esac
Вы всегда можете использовать контроль версий, например SVN, поэтому все, что вам нужно сделать, это заставить сервер запускать svn для папки каждую ночь.Это приводит к проблемам с безопасностью, если вы публикуете свои файлы публично, но это работает.
Если вы используете Linux, научитесь использовать rsync.На самом деле это не так уж и сложно, поскольку вы можете протестировать каждую команду с помощью -n.Пройдите через справочная страница, основной формат, который вам понадобится, это
rsync [ОПЦИЯ...] SRC...[USER@]ХОСТ:DEST
команда, которую я запускаю со школьного сервера на домашнюю машину резервного копирования, такова:
rsync -avi --delete ~ me@homeserv:~/School/ >> BackupLog.txt
Это берет все файлы в моем домашнем каталоге (~) и использует режим архивирования rsync (-a), подробный (-v), перечисляет все внесенные изменения (-i), удаляя при этом все файлы, которые больше не существуют. (--delete) и помещает его в папку /home/me/School/ на моем удаленном сервере.Вся выводимая информация (что было скопировано, что удалено и т. д.) также добавляется в файл BackupLog.txt.
Я знаю, что это ураганный экскурс по rsync, но надеюсь, что это поможет.
А rsync
решения действительно хороши, особенно если вы вносите изменения только в одну сторону.Еще один замечательный инструмент — unison
-- он пытается синхронизировать изменения в обоих направлениях.Подробнее читайте на домашняя страница Unison.
Похоже, вы решаете не ту проблему.Если вы пытаетесь редактировать файлы на удаленном компьютере, вы можете попробовать использовать что-то вроде плагина ftp для jedit. http://plugins.jedit.org/plugins/?FTP Это гарантирует, что у вас будет только одна версия файла, поэтому он никогда не будет рассинхронизирован.
Основываясь на предложении icco о SVN, я бы посоветовал, если вы используете Subversion или что-то подобное для контроля версий (а если вы этого не делаете, вам, вероятно, следует начать), вы можете поддерживать производственную среду в актуальном состоянии, введя команду чтобы обновить репозиторий с помощью хука после фиксации.
Есть много переменных в том, как вы хотите это сделать, но я видел, как работает то, что разрабатываемый или работающий сайт является рабочей копией, а затем после фиксации используется ключ ssh с принудительной командой для войдите на удаленный сайт и запустите SVN на рабочей копии.В качестве альтернативы в перехватчике post-commit вы можете запустить экспорт svn на удаленном компьютере или локальный (в репозиторий svn) экспорт svn, а затем rsync на удаленный компьютер.
Меня бы беспокоили вещи, которые обнаруживают изменения и отправляют их, и я бы даже беспокоился о вещах, которые выполняются каждую минуту только из-за условий гонки.Откуда вы знаете, что файл не будет передан в тот же момент, когда он записывается?Наткнитесь на это один или два раза, и вы потеряете все преимущество экономии времени, которое у вас было при постоянной синхронизации или чем-то подобном.
Будет ДропБокс(http://www.getdropbox.com/) делай что хочешь?
Пользователь watcher.py и rsync автоматизируют это.Прочтите следующую пошаговую инструкцию здесь:
Раньше у меня были те же настройки под Windows, что и у вас, то есть локальное дерево файлов (версированное) и тестовая среда на удаленном сервере, которую я зеркалировал в реальном времени с помощью WinSCP.Когда я перешел на Mac, мне пришлось немало покопаться, прежде чем я был доволен, но в итоге я использовал:
- СмартСВН как мой клиент Subversion
- Возвышенный текст 2 как мой редактор (уже использовал его в Windows)
- SFTP-плагин для ST2, который обрабатывает загрузку при сохранении (извините, нельзя публиковать более двух ссылок)
Я действительно могу порекомендовать эту установку, надеюсь, она поможет!
Вы также можете использовать Fetch в качестве SFTP-клиента, а затем редактировать файлы непосредственно на сервере изнутри.Существуют также параметры SSHFS (монтировать папку ssh как том).Это соответствует тому, что сказал Стиммс: вы уверены, что хотите, чтобы все синхронизировалось, или просто хотите редактировать файлы на сервере?
В OS X есть собственная система уведомлений о файлах — на этом основан Spotlight.Я не слышал ни о какой программе, которая бы использовала это для синхронизации, но это вполне возможно.
Лично я использую RCS для такого типа вещей: хотя он имеет ручной аспект, маловероятно, что я захочу отправить что-то даже на тестовый сервер со своей машины разработки без предварительного тестирования.А если я работаю на сервере разработки, то использую один из вариантов, приведенных выше.
Ну, у меня была такая же проблема, и их можно использовать вместе:rsync, вход без пароля по SSH, Watchdog (утилита синхронизации Python) и Terminal Notifier (утилита уведомлений OS X, созданная с помощью Ruby.Не требуется, но помогает узнать, когда синхронизация завершилась).
Я создал ключ для входа без пароля, используя этот урок из вики Dreamhost: http://cl.ly/MIw5
1.1.Когда вы закончите, проверьте, все ли в порядке… если вы не можете войти в систему без пароля, возможно, вам придется попробовать монтирование afp.Dreamhost (где находится мой сайт) не разрешает монтирование afp, но разрешает вход без пароля.В терминале введите:
ssh username@host.com
Вы должны войти в систему без запроса паролей: PЯ установил Уведомитель терминала со страницы Github: http://cl.ly/MJ5x
2.1.Я использовал команду установщика Gem.В Терминале введите:
gem install terminal-notifier
2.3.Проверьте, работает ли уведомление. В Терминале введите:
terminal-notifier -message "Starting sync"
Создайте сценарий sh для проверки уведомления rsync +.Сохраните его где угодно и под любым именем.В этом примере я назову это ~/Скрипты/sync.sh Я использовал расширение «.sh», но не знаю, нужно ли оно.
#!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ user@host.com:site_folder/ terminal-notifier -message "Sync has finished"
3.1.Не забудьте дать разрешение на выполнение этому sh-скрипту.В Терминале введите:
sudo chmod 777 ~/Scripts/sync.sh
3.2.Запустите сценарий и проверьте, правильно ли отображаются сообщения и действительно ли rsync синхронизирует вашу локальную папку с удаленной папкой.Наконец, я скачал и установил Watchdog со страницы Github: http://cl.ly/MJfb
4.1.Сначала я установил зависимость libyaml с помощью Brew (есть много подсказок по установке Brew - например, «aptitude» для OS X).В Терминале введите:
brew install libyaml
4.2.Затем я использовал команду «easy_install».Перейдите в папку Watchdog и введите Терминал:
easy_install watchdog
Теперь все установлено! Перейдите в папку, которую хотите синхронизировать., измените этот код под свои нужды, и введите Терминал:
watchmedo shell-command --patterns="*.php;*.txt;*.js;*.css" \ --recursive \ --command='~/Scripts/Sync.sh' \ .
Должно быть ТОЧНО таким образом, с косыми чертами и разрывами строк, поэтому вам придется скопировать эти строки в текстовый редактор, изменить сценарий, вставить в терминал и нажать Enter.
Пробовал без переносов строк, не получилось!
На моем Mac я всегда получаю сообщение об ошибке, но, похоже, это ни на что не влияет:
/Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.
Теперь внесите некоторые изменения в файл внутри папки и наблюдайте за волшебством!
Я использую этот небольшой Ruby-скрипт:
#!/usr/bin/env ruby
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rsyncs 2Folders
#
# watchAndSync by Mike Mitterer, 2014 <http://www.MikeMitterer.at>
# with credit to Brett Terpstra <http://brettterpstra.com>
# and Carlo Zottmann <https://github.com/carlo/haml-sass-file-watcher>
# Found link on: http://brettterpstra.com/2011/03/07/watch-for-file-changes-and-refresh-your-browser-automatically/
#
trap("SIGINT") { exit }
if ARGV.length < 2
puts "Usage: #{$0} watch_folder sync_folder"
puts "Example: #{$0} web keepInSync"
exit
end
dev_extension = 'dev'
filetypes = ['css','html','htm','less','js', 'dart']
watch_folder = ARGV[0]
sync_folder = ARGV[1]
puts "Watching #{watch_folder} and subfolders for changes in project files..."
puts "Syncing with #{sync_folder}..."
while true do
files = []
filetypes.each {|type|
files += Dir.glob( File.join( watch_folder, "**", "*.#{type}" ) )
}
new_hash = files.collect {|f| [ f, File.stat(f).mtime.to_i ] }
hash ||= new_hash
diff_hash = new_hash - hash
unless diff_hash.empty?
hash = new_hash
diff_hash.each do |df|
puts "Detected change in #{df[0]}, syncing..."
system("rsync -avzh #{watch_folder} #{sync_folder}")
end
end
sleep 1
end
Адаптируйте его под свои нужды!
Если вы разрабатываете Python на удаленном сервере, Pycharm может стать для вас хорошим выбором.Вы можете синхронизировать свои удаленные файлы с локальными файлами, используя функцию удаленной разработки pycharm.Ссылка на руководство как:https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html