
Сценарий: IDE установлена на настольном компьютере Linux, локально редактируя файлы PHP. Каждый раз, когда я сохраняю файл, я хочу, чтобы это изменение отображалось на сервере Linux, где запущен Apache. На сервере есть ssh (и samba, и nfs, если на то пошло).
Для справки: когда я редактировал файлы в Windows, я, наконец, наткнулся на WinSCP как на тот самый инструмент, который мне был нужен. В WinSCP есть как раз такая функция, с первоначальной синхронизацией и последующим непрерывным обновлением с использованием службы наблюдения за файловой системой: «Keep Remote Directory up to Date».
В Linux можно утверждать, что sshfs можно использовать для полного обхода необходимости синхронизации. В Windows то же самое сделает samba-share. Однако я хочу, чтобы IDE работала с локальными файлами (на SSD-диске!), не обращаясь к сети для индексации PHP и всего такого, что занимает много времени.
Но sshfs все равно может быть частью решения — тогда непрерывную синхронизацию нужно будет выполнять только между двумя локальными каталогами.
Есть идеи или подсказки?
решение1
Вы также можете использовать inotifywait
из пакета inotify-tools.
inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
echo need to rsync $MODFILE ...
done
решение2
Lsyncdбыло бы хорошим решением этой проблемы.
Lsyncd отслеживает локальный интерфейс монитора событий деревьев каталогов (inotify или fsevents). Он собирает и объединяет события в течение нескольких секунд, а затем запускает один (или несколько) процессов для синхронизации изменений. По умолчанию это rsync. Таким образом, Lsyncd — это легковесное решение для зеркалирования в реальном времени, которое сравнительно легко установить, не требуя новых файловых систем или блочных устройств и не снижая производительность локальной файловой системы.
В конечном итоге, он использует те же инструменты для выполнения работы (inotify и rsync), которые предлагаются в других ответах, но его проще настроить для тех, кто не знаком с написанием сценариев оболочки.
решение3
Мне это очень нужно, так как мой код должен работать на удаленных ящиках, а я пишу код на локальной машине. Я нашел хороший инструмент, который вы можете использовать для постоянного мониторинга ваших локальных папок и синхронизации их с удаленной или локальной папкой:https://github.com/axkibe/lsyncd
Простая команда для непрерывной синхронизации локального каталога с удаленной машиной по SSH будет выглядеть так:
lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>
Как и с любой другой командой rsync, убедитесь, что вы указали правильный путь к папке и проверьте перед запуском команды. Я чуть не убил одну из своих удаленных машин, потому что не указал правильный каталог назначения. Убедитесь, что вы не упустили удаленный путь и не используйте '/', если вы не знаете, что делаете.
решение4
Что я сделал однажды, так это запустил скрипт 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
Запустите этот скрипт в новом терминале, указав имена файлов в качестве аргументов (после установки инструмента синхронизации).
(Я использовал это для запуска компиляции, а не для синхронизации, но это будет работать похожим образом.)