2015-06-25 13 views
6

Wystąpił problem z poważnym uaktualnieniem. Instalator zawiera usługę i podczas aktualizacji otrzymałem komunikat informujący, że do zakończenia procesu instalacji wymagane jest ponowne uruchomienie.WiX: zatrzymaj usługę przed RemoveExistingProducts LUB uruchom podwyższoną CustomAction, aby zatrzymać proces przed RemoveExistingProducts

Aby temu zapobiec, po prostu trzeba zatrzymać usługę przed wykonaniem RemoveExistingProducts (raczej InstallValidate).

Numer MajorUpgrade jest umieszczony po InstallInitialize, a pakiet ma InstallPrivileges="elevated".

Mam dwa przypadki:


Przypadek 1: Usługa jest zainstalowane przez ServiceInstall poprzez

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

ServiceControl nie zatrzymując usługę przed InstallValidate nazywa. Nawet gdy mówisz Stop = "oba". Pojawi się popup. Zwróć uwagę, że usługa nie została uruchomiona przez instalatora.

Rozsądne posty Znalazłem (fragment):


Przypadek 2: Usługa jest zainstalowany przez CustomAction (istnieją pewne powody, dla których nie można tego zrobić także poprzez ServiceInstall). W tym przypadku muszę wywołać plik wykonywalny, aby zatrzymać usługę ("myservice.exe - stop"). W tym celu jest to trudne, ponieważ ze względu na ICE63 nie można zaplanować CustomAction przed wywołaniem . Jak więc mogę to osiągnąć?

tej pory czytałem posty jak:

inicjującego exe nie jest opcją, ponieważ muszę produkować zwykły MSI.

znalazłem podobny problem bez odpowiedzi tutaj: Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService

+0

Prawdopodobny duplikat usługi Wix stop na odinstalowaniu/uaktualnieniu: zapobiega "ponownemu uruchomieniu popup" (sytuacja pliku w użyciu)] (https://stackoverflow.com/questions/31787804/wix-stop-service-on- uninstall-upgrade-prevent-prevent-restart-popup-file-in-use-situ) – BartoszKP

Odpowiedz

2

Sekwencjonowanie ServiceControl po InstallValidate ma znaczenia. Jeśli zostanie wykryta sytuacja użycia pliku w usłudze InstallValidate, ale usługa znajduje się w tabeli ServiceControl, która ma zostać zatrzymana podczas deinstalacji, wówczas system Windows w rozsądny sposób odracza wszelkie sytuacje dotyczące plików w celu sprawdzenia, co faktycznie się dzieje. Jeśli wyłączysz go z ServiceControl, utracisz tę potencjalnie użyteczną funkcję. Zauważ, że możesz używać ServiceControl niezależnie od ServiceInstall - nie są one ze sobą powiązane, więc nie musisz koniecznie uruchamiać exe, aby zatrzymać usługę, jeśli może ona dobrze współpracować z ServiceControl.

Powszechną przyczyną takiej sytuacji jest po prostu niepoprawne działanie usługi. Oczekiwanie = tak nie będzie czekać na zawsze, tylko 30 sekund zgodnie z dokumentacją. Tak więc usługa musi odpowiadać na komunikat kontrolny nakazujący jej zatrzymanie. Nawet jeśli usługa jest "zatrzymana", nie oznacza to, że proces zniknął, tylko że nie działa już jako usługa. Jeśli zajmie to trochę czasu, aby zakończyć proces, system Windows nie ma alternatywy, ale pokazuje pliki w użyciu. Te rzeczy są trudne do debugowania, ponieważ zazwyczaj występują problemy z timingiem, ale jeśli to ja, to sprawdzałem kod zamknięcia usługi.

Należy również pamiętać, że w scenariuszu aktualizacji może być konieczne zatrzymanie. Jeśli InstallValidate (w twojej przychodzącej aktualizacji) nie zobaczy zatrzymania instalacji w ServiceControl i są pliki w użyciu, wtedy dostaniesz ten problem w użyciu. InstallValidate nie patrzy przed siebie, aby zobaczyć, kiedy może działać RemoveExistingProducts, a następnie przejrzyj inny MSI dla zatrzymania ServiceControl, który może zapobiec używaniu plików.

+0

Potrzeba implementacji OBU skrzyń. W pierwszym przypadku wiem o maksymalnym czasie oczekiwania 30 sekund. Usługa przestaje działać w ciągu 30 sekund - ale wygląda na to, że się nie dzieje/wypróbowana (nie wpisuje loginu). Moje pytanie nie dotyczyło zmiany kolejności ServiceControl. W drugim przypadku usługa (inna) nie jest zainstalowana lub prodived przez tego instalatora (ale pliki są!) - tak, to może być zła praktyka, ale w rzeczywistości to się dzieje i ledwo mogę to zmienić. Tak więc muszę zaplanować niestandardową akcję przed instalacją InstallValidate, aby zapobiec sytuacji użycia pliku. – Karl

+0

Powiedziałeś, że ServiceControl nie zatrzymuje usługi przed InstallValidate, a ja nie sugerowałem przeniesienia ServiceControl. Próbowałem wskazać, że twoje oświadczenie nie jest trafne. Jeśli InstallValidate znajdzie usługę z plikami w użyciu i usługa zostanie zatrzymana w ServiceContrrol, to nie wykona plików w użyciu dla usługi. Oczywiście, jeśli proces serwisowy nie zniknie, lub coś innego się dzieje, nadal będziesz mieć pliki w użyciu PÓŹNIEJ. Powinieneś wziąć szczegółowy dziennik i sprawdzić wpisy w użyciu oraz informację o tym, co InstallValidate mówi o usłudze. – PhilDW

+0

Przepraszam, gdy nie byłam jasna. Jeśli proces tworzy procesy potomne, które używają zasobów plików, czy instalator również je rozpoznaje? Jedynym komunikatem w dzienniku, który mógłbym przypisać do mojego problemu, jest: 'RESTART MANAGER: Wykryto, że aplikacja o identyfikatorze 120, przyjaznej nazwie 'javaw.exe', typu RmCritical i statusie 1 używa pliku [s] w użyciu. nie ma wpisu mówiącego o tym, że usługa jest w ogóle próbowana. Czy nie powinno to być? – Karl

0

Rozwiązanie dla przypadku 2 jest:

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

W takim przypadku pojawi się żaden FileInUse dialaog.

+0

czy mógłbyś wyjaśnić, jak rozwiązaniem jest wybór właściwej usługi? przez "nazwę"? – Karl

+0

Tak jak na imię, w tym tygodniu miałem ten sam problem i go rozwiązałem. –

Powiązane problemy