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
你能發佈腳本嗎? – thejh 2010-11-04 22:16:21
是的,請向我們展示腳本,因爲普通的Ruby腳本由於某些要求而無法實例化爲服務。還包括您用來安裝服務的命令行。 – 2010-11-04 23:43:22
我會盡我所能創建一個示例腳本。我在rake附近使用了一個定製框架,所以我不能簡單地複製和粘貼一些代碼。 – MikeWyatt 2010-11-05 15:41:05