Я развертываю службу Windows со скриптом Ruby.После копирования файлов на сервер с помощью FileUtils.cp я запускаю sc \\MYSERVER start MyService
с использованием синтаксиса Ruby cmd .Эта команда возвращает следующую ошибку для каждой из 20 последовательных попыток с интервалом в пять секунд:
[SC] StartService FAILED 32:
The process cannot access the file because it is being used by another process.
Если я запускаю команду вручную сразу после завершения моего сценария Ruby, она работает нормально:
SERVICE_NAME: MyService
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 21736
FLAGS :
Возможно ли FileUtils.cp блокировать скопированный EXE?Если нет, то что еще в моем сценарии могло бы удерживать эту блокировку?
Вот как выглядит мой сценарий без кода и повторной настройки автоматического повтора:
srcRoot = Pathname.new 'c:\\MyService'
destRoot = Pathname.new '\\\\MYSERVER\\services\\MyService'
destRoot.each_entry() {|item|
if not %w(. ..).include?( item.to_s )
FileUtils.rm_r destRoot.to_s + "\\" + item.to_s, :force => true
end
}
destRoot.mkdir unless destRoot.exist?
for dir in %w(Release)
copy(src_root + dir + ".", destRoot) { destRoot + dir }
end
`sc \\\\MYSERVER start MyService`
Вотфункция копирования, которая рекурсивно копирует каталоги и файлы:
# recursively copies the given source file or directory to the given destination directory.
def copy( src, destDir )
src = Pathname.new src
destDir = Pathname.new destDir
destDir.mkdir unless destDir.exist?
exclusions = %w(. .. .svn _svn Thumbs.db)
for item in Dir.glob( src + "*" )
itemPath = Pathname.new item
if not %w(. .. .svn _svn Thumbs.db).include?( itemPath.basename.to_s )
if itemPath.directory?
copy( itemPath, destDir + itemPath.basename ) {destDir + itemPath.basename}
elsif exclusions.select {|k,v| extension? k}.select {|k,v| item.include? k}.empty?
begin
FileUtils.cp( itemPath, destDir, {:verbose => true, :preserve => true} )
rescue
puts "Warning! " + $!
end
end
end
end
end