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
Pourriez-vous poster le scénario? – thejh
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. –
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