Ruby 1.9.3, net-ssh 2.9.2
Я работаю над проектом, в котором мне нужно разделить один и тот же каталог (и его подкаталоги) на двух разных серверах (локальном и удаленном). Оттуда мне нужно скопировать самые новые/недавно измененные файлы на правильный сервер и удалить с удаленного, если файл отсутствует на локальном.
ПРИМЕЧАНИЕ. Я не могу использовать rsync. Мы делаем резервные копии каталогов, связанных с Asterisk, в GlusterFS. При тысячах файлов rsync сравнивает локальный том с томом Gluster очень медленно (когда нам это нужно менее 1 минуты).
Вот мой текущий код. Я опускаю свою работу по копированию/удалению файлов, так как хочу делать это по одному шагу за раз.
require 'thread'
require 'date'
require 'rubygems'
require 'net/ssh'
SERVERS = ['local17', 'development']
CLIENT = SERVERS[0]
CLIENT_PATH = '/home/hstevens/temp_gfs'
BRICK_PATH = '/export/hunter_test'
@files = {
SERVERS[0] => {},
SERVERS[1] => {}
}
def grab_filenames_and_dates(files, server)
files.reject { |x| File.directory? x }
files.each do |file|
name = `ls --full-time "#{file}" | awk '{$1=$2=$3=$4=$5=$6=$7=$8=""; print $0}'`.strip
date = `ls --full-time "#{file}" | awk '{print $6, $7, $8}'`.strip
@files[server][name] = DateTime.parse(date)
end
end
# Collect diff information on all servers
ls_threads = SERVERS.map do |server|
Thread.new do
if server == CLIENT
files = Dir.glob("#{CLIENT_PATH}/**/*")
grab_filenames_and_dates(files, server)
else
Net::SSH.start(server, 'hstevens') do |session|
files = session.exec!(%Q(ruby -e 'puts Dir.glob("#{BRICK_PATH}/**/*")')).split("\n")
grab_filenames_and_dates(files, server)
end
end
end
end
ls_threads.each(&:join)
Когда я запускаю свою программу, она работает на локальном сервере (CLIENT
/local17
), но не работает на удаленном сервере. Я попробовал отладочные операторы (вывод pwd
в консоль, и оказалось, что хотя метод вызывается внутри блока сеанса Net::SSH, он действует на моем локальном сервере.
ls: cannot access /export/hunter_test/sorttable.js: No such file or directory
ls: cannot access /export/hunter_test/sorttable.js: No such file or directory
./gluster_rsync.rb:36:in `parse': invalid date (ArgumentError)
from ./gluster_rsync.rb:36:in `block in grab_filenames_and_dates'
from ./gluster_rsync.rb:33:in `each'
from ./gluster_rsync.rb:33:in `grab_filenames_and_dates'
from ./gluster_rsync.rb:53:in `block (3 levels) in <main>'
from /usr/local/lib/ruby/gems/1.9.1/gems/net-ssh-2.9.2/lib/net/ssh.rb:215:in `start'
from ./gluster_rsync.rb:51:in `block (2 levels) in <main>'
Как правильно обернуть вызов метода внутри сеанса Net::SSH?
rsync
может многое сделать, если все это проверено в бою и является стандартной частью систем *nix. - person the Tin Man   schedule 13.08.2015