В Linux версия GNU coreutils tail
использует inotify для блокировки ожидания изменения файла. В FreeBSD tail
использует kevent для того же. Это будет лучше, чем многократная проверка изменений и сон. В зависимости от того, как часто вам нужно это делать и с какой частотой происходят изменения, порождение внешнего процесса из node.js просто для вызова tail
может стоить или не стоить.
Если вы не используете Linux или FreeBSD (или, возможно, MacOS?), Утилита tail
, вероятно, не лучше, чем то, что вы можете делать непосредственно в JavaScript, многократно проверяя и спящий.
В качестве альтернативы, если вы используете Linux или FreeBSD, вы можете использовать inotify
или kevent
непосредственно из node.js с каким-либо расширением / плагином / модулем без создания процесс. Я не знаю, существует ли это.
Итак, лучший способ, который я нашел, - это иметь пользователя с доступом sudo только для этой команды и использовать - rsync-path = 'sudo rsync'
. например:
rsync -avz -e 'ssh -l rsync -i /home/rsync/.ssh/rsync -o StrictHostKeyChecking=no' /path/ --rsync-path='sudo rsync' rsync@xxx.xxx.xxx.xxx:/path/
Право собственности на файлы в целевом каталоге полностью определяется целевой учетной записью, используемой для их создания / передачи. (Для обычных учетных записей невозможно изменить владельца файлов.)
Если вы хотите, чтобы целевые файлы принадлежали apache
, на ум приходят четыре варианта
Перенести файлы, вход в целевую учетную запись как пользователь apache
. С сертификатом ssh
вы можете избежать необходимости встраивать пароль. Вы также можете настроить соединение ssh
, чтобы запрещать любые операции, кроме запуска службы rsync
.
Извлечь файлы с целевого хоста.Вы можете настроить это задание на частое выполнение под cron ( rsync
без работы может быть относительно дешевым вариантом), или вы можете проверить его на наличие триггера, такого как создание файла, и только если который активируется, запускает полный процесс rsync
.
В этой ситуации я бы запустил cron
на вашем целевом хосте, проверяя наличие файла локально каждые пять минут с помощью такого фрагмента
test -f "$ HOME" /. Rsync_trigger && rsync ... && rm -f "$ HOME" /. rsync_trigger
Используйте inotifywait
для исправления прав собственности на файлы после того, как файлы были скопированы. Это потребовало бы, чтобы процесс запускался от имени пользователя root, но он мог бы быть полностью автономным, чтобы он мог изменять права собственности только на файлы, принадлежащие centos
в целевом каталоге apache
.
Скопируйте файлы с rsync
, запущенным от имени пользователя root. Не идеально, но может понадобиться, если все остальное не поможет.
Rsync имеет параметр numeric-id
, который вы можете использовать здесь.
Однако две вещи: убедитесь, что на обоих ваших серверах у вашего пользователя apache одинаковый числовой идентификатор; и убедитесь, что пользователь, запускающий rsync, может записывать / обновлять файлы, принадлежащие apache, в target.