Я построил Msi, используя InstallShield.
Msi для одной службы Windows. Сервисное событие установщика настроено на ожидание завершения события для
[Install Start, Install Stop, Install Delete, Uninstall Stop, Uninstall Delete]
Однако во время обновления (REINSTALL=ALL REINSTALLMODE=vomus
) я получаю запрос на перезагрузку в конце одной из тестовых виртуальных машин с низким энергопотреблением.
Так что я пошел дальше и включил подробное ведение журнала, чтобы выяснить, что происходит.
Некоторые из записей журнала ключей:
MSI (s) (8C:E0) [15:20:59:264]: RESTART MANAGER: Detected that the service {my service} will be stopped due to a service control action authored in the package before the files are updated. So, we will not attempt to stop this service using Restart Manager
MSI (s) (8C:E0) [15:20:59:264]: Note: 1: 2727 2:
Вид ожидаемого, так как служба работает, и все должно быть разблокировано после остановки службы
MSI (s) (8C:E0) [15:21:00:483]: Doing action: StopServices
Action 15:21:00: StopServices. Stopping services
Action start 15:21:00: StopServices.
StopServices: Service: Stopping services
Action ended 15:21:00: StopServices. Return value 1.
MSI (s) (8C:E0) [15:21:00:483]: Doing action: DeleteServices
Action 15:21:00: DeleteServices. Deleting services
Action start 15:21:00: DeleteServices.
DeleteServices: Service: Deleting services
Action ended 15:21:00: DeleteServices. Return value 1.
Служба остановлена и удалена в 15:21:00 (отметка времени указывает на то, что служба была остановлена в течение 1 с. Однако для полной остановки медленной виртуальной машины требуется 10 с, когда она выполняется через консоль управления службами)
MSI (s) (8C:E0) [15:21:02:232]: Executing op: FileCopy(SourceName={removed},SourceCabKey={removed},DestName={removed},Attributes=16384,FileSize=17488,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,Version=3.6.12.442,Language=0,InstallMode=126091264,,,,,,,)
MSI (s) (8C:E0) [15:21:02:232]: File: C:\Program Files (x86)\{my exe}; Overwrite; Won't patch; Existing file is a lower version
MSI (s) (8C:E0) [15:21:02:232]: Source for file '{removed}' is compressed
InstallFiles: File: {my exe}, Directory: C:\Program Files (x86)\{removed}, Size: 17488
MSI (s) (8C:E0) [15:21:02:232]: Re-applying security from existing file.
Info 1603. The file C:\Program Files (x86)\{my exe} is being held in use. Close that application and retry.
MSI (s) (8C:E0) [15:21:07:700]: Verifying accessibility of file: {my exe}
MSI (s) (8C:E0) [15:21:07:700]: Note: 1: 2318 2:
MSI (s) (8C:E0) [15:21:07:700]: Note: 1: 2318 2:
Операция копирования файла завершилась неудачей в 15:21:07, так как запущен сервисный процесс.
Поэтому я решил, что я попытаюсь остановить службу заранее, чтобы убедиться, что она полностью остановлена, прежде чем она достигнет операции копирования файла
Я добавил пользовательское событие перед InstallValidate
действием, которое вызывает
sc stop {service name}
И заставить его работать синхронно, но игнорирует код выхода
MSI (s) (0C:40) [15:30:53:066]: Doing action: AttemptStopService
Action 15:30:53: AttemptStopService.
Action start 15:30:53: AttemptStopService.
Action ended 15:30:53: AttemptStopService. Return value 1.
MSI (s) (0C:40) [15:30:53:113]: Doing action: InstallValidate
Action 15:30:53: InstallValidate. Validating install
Action start 15:30:53: InstallValidate.
однако это привело к тому, что «программа установки должна обновить файлы или службы, которые не могут быть обновлены во время работы системы. Если вы решите продолжить, потребуется перезагрузка ....». Когда отображается всплывающее окно, я проверил диспетчер задач и процесс ушел, служба остановлена.
Опять же, это своего рода подразумевает, что sc.exe не ожидает полного завершения процесса, прежде чем вернуться к вызывающей стороне.
Я что-то пропустил или это по замыслу? И могу ли я что-либо сделать на стороне установщика или на стороне service.exe, чтобы предотвратить это?
Обновление
Я добавил другое настраиваемое действие, которое вызовет окно cmd, в котором будет показан процесс, который в данный момент выполняется, связанный с моей службой, чтобы узнать, действительно ли это действие не ожидало остановки процесса.
cmd.exe /k tasklist /FI "Services eq my service name"
Действие помещается прямо перед RemoveFiles (что немного перед InstallFiles) и вот новый журнал
MSI (s) (A8:F8) [10:56:42:725]: Doing action: StopServices
Action 10:56:42: StopServices. Stopping services
Action start 10:56:42: StopServices.
Action ended 10:56:42: StopServices. Return value 1.
MSI (s) (A8:F8) [10:56:42:725]: Doing action: DeleteServices
Action 10:56:42: DeleteServices. Deleting services
Action start 10:56:42: DeleteServices.
Action ended 10:56:42: DeleteServices. Return value 1.
...
MSI (s) (A8:F8) [10:56:42:757]: Doing action: Test
Action 10:56:42: Test.
Action start 10:56:42: Test.
CustomAction Test returned actual error code -1073741510 but will be translated to success due to continue marking
В окне CMD я ясно вижу, что процесс все еще выполняется, хотя предыдущее действие остановки службы должно было остановить и удалить его.
Также дал ему более 1 минуты в окне CMD, и служба все еще работает, процесс все еще жив. так что в основном действие stop service вообще не выполняет свою работу.