2010-11-04 6 views
0

Je déploie un service Windows avec un script Ruby. Après avoir copié des fichiers sur le serveur en utilisant FileUtils.cp, je lance sc \\MYSERVER start MyService via cmd syntax de Ruby. Cette commande renvoie l'erreur suivante pour chacun des 20 tentatives consécutives, à cinq secondes d'intervalle:Verrouillage du fichier Ruby lors du déploiement du service Windows

[SC] StartService FAILED 32: 

The process cannot access the file because it is being used by another process. 

Si je lance la commande manuellement immédiatement après mon fin du script Ruby, il fonctionne très bien:

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    : 

Est FileUtils.cp peut-être mettre un verrou sur le fichier EXE copié? Sinon, quoi d'autre dans mon script pourrait éventuellement contenir ce verrou?

Voici à peu près ce que mon script ressemble, sans tout le code de nouvelle tentative automatique et configuration:

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` 

est ici la fonction de copie, les répertoires récursive copies et fichiers:

# 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

Pourriez-vous poster le scénario? – thejh

+0

Oui, s'il vous plaît, montrez-nous le script car les scripts Ruby normaux ne peuvent pas être instanciés en tant que service en raison de certaines exigences. Incluez également la ligne de commande que vous avez utilisée pour installer le service. –

+0

Je ferai de mon mieux pour créer un exemple de script. J'utilise un framework personnalisé autour de rake, donc je ne peux pas simplement copier et coller un peu de code. – MikeWyatt

Répondre

0

J'ai trouvé le problème. Le fichier MyService.exe.config a été copié dans une méthode distincte, qui a manipulé le contenu du fichier source avant de créer un nouveau fichier sur le serveur. Le nouveau fichier n'étant pas fermé, la tentative de démarrage du service a échoué lorsqu'il n'a pas pu verrouiller le fichier de configuration.

Questions connexes