Поддерживайте актуальность удаленного каталога

StackOverflow https://stackoverflow.com/questions/9279

  •  08-06-2019
  •  | 
  •  

Вопрос

мне очень нравится Поддерживайте актуальность удаленного каталога функция в 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 автоматизируют это.Прочтите следующую пошаговую инструкцию здесь:

http://kushellig.de/linux-file-auto-sync-directories/

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

  1. Я создал ключ для входа без пароля, используя этот урок из вики Dreamhost: http://cl.ly/MIw5

    1.1.Когда вы закончите, проверьте, все ли в порядке… если вы не можете войти в систему без пароля, возможно, вам придется попробовать монтирование afp.Dreamhost (где находится мой сайт) не разрешает монтирование afp, но разрешает вход без пароля.В терминале введите:

    ssh username@host.com Вы должны войти в систему без запроса паролей: P

  2. Я установил Уведомитель терминала со страницы Github: http://cl.ly/MJ5x

    2.1.Я использовал команду установщика Gem.В Терминале введите:

    gem install terminal-notifier

    2.3.Проверьте, работает ли уведомление. В Терминале введите:

    terminal-notifier -message "Starting sync"

  3. Создайте сценарий 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 синхронизирует вашу локальную папку с удаленной папкой.

  4. Наконец, я скачал и установил 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

  5. Теперь все установлено! Перейдите в папку, которую хотите синхронизировать., измените этот код под свои нужды, и введите Терминал:

      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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top