2010-11-04 50 views
0

我正在使用Ruby腳本部署Windows服務。在使用FileUtils.cp將文件複製到服務器之後,我通過Ruby的cmd syntax運行sc \\MYSERVER start MyService。此命令將返回各連續20次嘗試下面的錯誤,每隔5秒鐘:部署Windows服務時Ruby文件鎖定

[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 
+0

你能發佈腳本嗎? – thejh 2010-11-04 22:16:21

+0

是的,請向我們展示腳本,因爲普通的Ruby腳本由於某些要求而無法實例化爲服務。還包括您用來安裝服務的命令行。 – 2010-11-04 23:43:22

+0

我會盡我所能創建一個示例腳本。我在rake附近使用了一個定製框架,所以我不能簡單地複製和粘貼一些代碼。 – MikeWyatt 2010-11-05 15:41:05

回答

0

我發現問題。 MyService.exe.config文件被複制到單獨的方法中,該方法在服務器上創建新文件之前對源文件內容進行了一些操作。新文件沒有關閉,所以嘗試啓動服務失敗時,它無法鎖定配置文件。