2015-06-25 10 views
6

Ho riscontrato un problema durante un aggiornamento principale. Il programma di installazione include un servizio e su un aggiornamento ho ricevuto un popup che dice che è necessario un riavvio per completare il processo di installazione.WiX: interrompere il servizio prima di RemoveExistingProducts OPPURE eseguire CustomAction elevato per interrompere il processo prima RemoveExistingProducts

Per evitare questo comportamento, in realtà devo solo interrompere il servizio prima che venga eseguito RemoveExistingProducts (piuttosto InstallValidate).

Il MajorUpgrade viene inserito dopo InstallInitialize e il pacchetto ha InstallPrivileges="elevated".

Ho due casi:


Caso 1: Il servizio è installato per ServiceInstall via

<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> 

Il ServiceControl non si ferma il servizio prima InstallValidate si chiama. Anche quando dici Stop = "entrambi". Quindi appare il popup. Si noti che il servizio non è stato avviato dall'installer.

messaggi

ragionevoli che ho trovato (estratto):


Caso 2: Il servizio viene installato da un CustomAction (ci sono alcuni ragioni per non farlo via ServiceInstall). In questo caso devo chiamare un eseguibile per fermare il servizio ("myservice.exe --stop"). Per questo è complicato, poiché a causa di ICE63 non è consentito programmare un CustomAction prima che venga chiamato lo RemoveExistingProducts. Quindi, come posso raggiungere questo comunque?

messaggi Finora ho letto come:

un exe di avvio automatico non è un opzione, in quanto ho bisogno di produrre un semplice MSI.

ho trovato simile problema senza risposta qui: Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService

+0

Possibile duplicato del [servizio di interruzione Wix su disinstallazione/aggiornamento: impedire "riavvio popup" (situazione del file in uso)] (https://stackoverflow.com/questions/31787804/wix-stop-service-on- uninstall-upgrade-prevent-restart-popup-file-in-use-situ) – BartoszKP

risposta

2

Il sequenziamento del ServiceControl dopo InstallValidate è irrilevante. Se viene rilevata una situazione di file in uso per un servizio in InstallValidate ma il servizio si trova nella tabella di ServiceControl da arrestare al momento della disinstallazione, Windows abbastanza ragionevolmente rimanda qualsiasi situazione di file in uso per vedere cosa succede realmente. Se lo togli da ServiceControl perderai questa funzionalità potenzialmente utile. Si noti che è possibile utilizzare ServiceControl indipendentemente da ServiceInstall - non sono collegati insieme, quindi non è necessario eseguire un exe per interrompere un servizio se può giocare bene con ServiceControl.

Un motivo comune per questa situazione è semplicemente che il servizio si comporta male. Wait = yes non aspetterà per sempre, solo 30 secondi secondo la documentazione. Quindi il servizio deve rispondere al messaggio di controllo che dice di fermarsi. Anche quando il servizio è "fermo" ciò non significa che il processo sia andato via, ma solo che non è più in esecuzione come servizio. Se ci vuole un po 'per terminare il processo, Windows non ha altra alternativa che mostrare i file in uso. Queste cose sono complicate da eseguire il debug perché i problemi di temporizzazione sono in genere, ma se fossi in me verificherei il codice di arresto del servizio.

Nota anche che potrebbe essere necessario interrompere = entrambi in uno scenario di aggiornamento. Se InstallValidate (nell'aggiornamento in entrata) non vede un arresto dell'installazione in ServiceControl e ci sono file in uso, si otterrà il problema dei file in uso. InstallValidate non guarda in avanti per vedere quando RemoveExistingProducts potrebbe essere eseguito e quindi andare a cercare in un altro MSI per un arresto di ServiceControl che potrebbe impedire i file in uso.

+0

In bisogno di implementare ENTRAMBI i casi. Per il primo caso, conosco i 30 secondi di attesa massima. Il servizio si interrompe entro 30 secondi, ma a quanto pare, questo non sta accadendo/provato (eiter nessuna voce nel registro). La mia domanda non riguardava la modifica della sequenza di ServiceControl. Per il secondo caso, il servizio (un altro) non è installato o prodotto da questo programma di installazione (ma i file sono!) - sì, potrebbe essere una cattiva pratica, ma in realtà è quello che sta succedendo e posso a malapena cambiare questo. Quindi, ho bisogno di pianificare alcune azioni personalizzate prima di InstallValidate in modo da prevenire una situazione di file in uso. – Karl

+0

Hai affermato che ServiceControl non interrompe il servizio prima di InstallValidate e non ho suggerito di spostare ServiceControl. Ho cercato di indicare che la tua affermazione non è pertinente. Se InstallValidate trova un servizio con file in uso e il servizio è in ServiceContrrol da arrestare, non eseguirà un file in uso per il servizio. Naturalmente se il processo del servizio non è andato via, o qualcos'altro sta succedendo, si otterrà comunque un file in uso più tardi. Dovresti prendere un registro dettagliato e controllare le voci in uso e cosa dice InstallValidate sul servizio. – PhilDW

+0

Scusa quando non ero chiaro. Se il processo sta creando processi figli che utilizzano risorse file, l'installatore riconosce anche questi? L'unico messaggio nel registro che vorrei assegnare al mio problema è: 'RESTART MANAGER: Rilevato che l'applicazione con id 120, nome descrittivo 'javaw.exe', di tipo RmCritical e stato 1 contiene il file [s] in uso. è una voce che dice che il servizio è stato tentato di fermarsi del tutto. Non dovrebbe essere? – Karl

0

La soluzione per il caso 2 è:

<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> 

In tal caso apparirà non FileInUse dialaog.

+0

potresti spiegare, come il tuo la soluzione sta selezionando il servizio corretto? via "Nome"? – Karl

+0

Sì dal nome, questa settimana ho avuto lo stesso problema e lo ha risolto. –

Problemi correlati