Ruby блокировка файлов при развертывании службы Windows - PullRequest
0 голосов
/ 05 ноября 2010

Я развертываю службу 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

1 Ответ

0 голосов
/ 05 ноября 2010

Я нашел проблему.Файл MyService.exe.config копировался отдельным методом, который выполнял некоторые манипуляции с содержимым исходного файла перед созданием нового файла на сервере.Новый файл не закрывался, поэтому попытка запустить службу не удалась, если не удалось заблокировать файл конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...