2015-06-25 14 views
6

Büyük bir yükseltmeyle ilgili bir sorunla karşılaştım. Yükleyici bir hizmet içerir ve yükseltmede kurulum işlemini bitirmek için yeniden başlatma gerektiğini belirten bir açılır pencere aldım.WiX: RemoveExistingÜrününden önce hizmeti durdur VEYA Kaldırılmadan önce işlemi durdurması için yükseltilmiş CustomAction'ı çalıştır. RemoveExistingProducts

Bu davranışı önlemek için, yalnızca hizmeti RemoveExistingProducts (daha çok InstallValidate) yürütülmeden önce durdurmam gerekiyor.

MajorUpgradeInstallInitialize'dan sonra yerleştirilir ve paket InstallPrivileges="elevated" sahiptir. InstallValidate çağrılmadan önce ServiceControl hizmeti durdurma değil

<Component Id="myservice_Service" Guid="*"> 
      <File Id="myservice.exe" KeyPath="yes" Vital="yes" 
        Source="SourceDir\bin\myservice.exe"/> 
      <ServiceInstall Id="myservice_ServiceInstall" Type="ownProcess" 
          Vital="yes" Name="myservice" DisplayName="myservice Service" 
          Description="myservice Service" Start="auto" Account=".\LocalSystem" 
          ErrorControl="ignore" Interactive="no" Arguments="--run"/> 
      <ServiceControl Id="myservice_ServiceControl" Name="myservice" Wait="yes" Stop="uninstall"/> 
     </Component> 

aracılığıyla hizmet ServiceInstall tarafından yüklenir:


Durum 1:

Ben iki dava var. Dur = "her ikisi" de olsa bile. Böylece açılır. Hizmetin yükleyici tarafından başlatılmadığını unutmayın.

Makul mesajlar buldum (alıntı):


Durum 2: Hizmetin bir CustomAction (vardır bazıları tarafından yüklenen Ayrıca neden ServiceInstall aracılığıyla yapmıyoruz). Bu durumda hizmeti durdurmak için bir yürütülebilir dosyayı çağırmak zorundayım ("myservice.exe --stop"). Bunun için zor oluyor, çünkü ICE63 nedeniyle 'un RemoveExistingProducts çağrılmasından önce programlanmasına izin verilmiyor. Peki, bunu nasıl başarabilirim?

Şimdiye kadar okuduğum mesajlar gibi: Ben üretmek gerekir çünkü

Bir bootstrapper exe, hiçbir seçenektir düz bir MSI. Burada

buldum benzer cevaplanmamış sorun: Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService

+0

Olası çoğaltma [Wix durdurma hizmetini kaldırma/yükseltme: önleme "yeniden başlat penceresini aç" (kullanmayla ilgili durum)) (https://stackoverflow.com/questions/31787804/wix-stop-service-on- kaldırma-yükseltme-önleme-yeniden-başlat-pop-dosya-içinde-kullanım-situ) – BartoszKP

cevap

2

InstallValidate sonra ServiceControl sıralaması da önemsizdir. InstallValidate'deki bir hizmet için bir dosya içinde kullanım durumu algılanır, ancak hizmet kaldırma sırasında durdurulacak ServiceControl tablosundaysa, Windows aslında ne olduğunu görmek için herhangi bir dosya kullanım durumunu makul olarak erteler. ServiceControl'den çıkarırsanız, bu potansiyel yararlı özelliği kaybedersiniz. ServiceControl'ü ServiceInstall'dan bağımsız olarak kullanabileceğinizi unutmayın - bunlar birbirine bağlı değildir, dolayısıyla ServiceControl ile iyi oynayabiliyorsa bir servisi durdurmak için bir exe çalıştırmanız gerekmez.

Bu durumun yaygın bir nedeni, servisin aksamamasıdır. Bekle = evet, belgelere göre sadece 30 saniye sonsuza dek beklemez. Bu nedenle servis, kontrol mesajının durmasını söyleyen cevap vermesi gerekir. Hizmet "durduruldu" olduğunda, bu işlemin ortadan kalktığı anlamına gelmez, yalnızca artık bir hizmet olarak çalışmıyordur. Sürecin gerçekten sonlandırılması biraz zaman alırsa, Windows'un başka bir seçeneği yoktur, ancak kullanımda olan dosyaları gösterir. Bu şeyler hata ayıklaması için zordur çünkü zamanlama sorunları tipiktir, ancak eğer ben olsaydım, servis kapatma kodunu incelerdim.

Ayrıca bir yükseltme senaryosunda da durmaya ihtiyacınız olabileceğini unutmayın. InstallValidate (gelen yükseltmenizde) ServiceControl'de bir yükleme durağı görmüyorsa ve kullanımda olan dosyalar varsa, o kullanımda olan dosyaları alırsınız. InstallValidate, RemoveExistingÜrünlerin ne zaman çalışıp çalışmadığını görmek için ileriye bakmaz ve daha sonra bir ServiceControl durağı için başka bir MSI'ye bakar ve bu da dosyaların kullanılmasını engelleyebilir. durumda 2 için

+0

İKİ vakaları uygulamak gerekiyor. İlk durumda, 30 saniye maksimum bekleme süresini biliyorum. Servis 30 saniye içinde durur - ama öyle görünmüyor, denenmiyor/deneniyor (eiter no log entry). Sorum şu, ServiceControl'ün sıralamasını değiştirmekle ilgili değildi. İkinci durum için, servis (başka biri) bu yükleyici tarafından yüklenmez veya kurulmaz (ancak dosyalar!) - evet, bu kötü bir uygulama olabilir, ama aslında neler olup bittiği ve bunu zar zor değiştirebilirim. Bu yüzden, InstallValidate'den önce bazı özel eylemleri programlamam gerekir, böylece bir dosya kullanım durumu önlenir. – Karl

+0

ServiceControl'ün InstallValidate'den önce hizmeti durdurmadığını ve ServiceControl'ü hareket ettirmenizi önermediğimi söylediniz. İfadenin uygun olmadığını göstermeye çalıştım. InstallValidate, kullanım içi dosyaları olan bir hizmet bulursa ve hizmet durdurulmak üzere ServiceContrrol içinde ise, hizmet için kullanımda olan bir dosya olmaz. Tabii ki servis işlemi gitmediyse ya da başka bir şey devam ederse, hala kullanımda bir dosya alacaksınız. Ayrıntılı bir günlük almalı ve kullanım içi girişleri ve InstallValidate'nin hizmet hakkında ne söylediğini kontrol etmelisiniz. – PhilDW

+0

Net olmadığım için üzgünüz. Süreç, dosya kaynaklarını kullanan alt süreçler oluşturuyorsa, yükleyici bunları da tanıyor mu? Günlüğümdeki soruna atadığım tek iletidir: 'RESTART MANAGER: RmCritical ve status 1 türünde 120, adında 'javaw.exe' adı verilen uygulamanın, kullanımda [s] dosyasında tutulduğunu saptadı. Hizmetin hiç durmaya çalışıldığını söyleyen giriş yok. Olması gerekmiyor mu? – Karl

0

çözümdür: hayır FileInUse dialaog görünecektir Bu durumda

<DirectoryRef Id='INSTALLDIR'> 
    <Component Id='StopService' Guid='{0913D365-8EC0-424A-939E-0F04E99D2ACA}' KeyPath='yes'> 
    <ServiceControl Id='StopServiceControl' Name='ServiceName' Stop='uninstall' Wait='yes'/> 
    </Component> 
</DirectoryRef> 

.

+0

lütfen açıklayabilir misiniz Çözüm doğru hizmeti seçiyor? "İsim" ile mi? – Karl

+0

Evet, bu hafta isimle aynı sorunu yaşadım ve çözdüm. –

İlgili konular