Подсказка из модуля PowerShell RestartManager
Модуль PowerShell RestartManager (особая благодарность Хит Стюарт ) обеспечивает простой интерфейс PowerShell для менеджера перезапуска. Мои команды следующие:
Set-Location <path to Cygwin root directory>
Start-RestartManagerSession
Get-ChildItem . -File -Include *.exe,*.dll -Recurse | RegisterRestartManagerResource
Get-RestartManagerProcess
Stop-RestartManagerProcess
Эти команды выводят следующий вывод:
Id : <process ID>
StartTime : <process start time>
Description : <executable started by cygrunsrv>
ServiceName :
ApplicationType : Console
ApplicationStatus : Running
IsRestartable : False
RebootReason : SessionMismatch
Id : <cygrunsrv process id>
StartTime : <cygrunsrv process start time>
Description : <description of service>
ServiceName : <service name>
ApplicationType : Service
ApplicationStatus : Running
IsRestartable : True
RebootReason : SessionMismatch
По какой-то причине Менеджер перезапуска видит процесс службы cygrunsrv.exe
как перезапускаемый, но исполняемый он появляется как не перезапускаемый. (Мне все еще интересно, почему это происходит в первую очередь.)
Несовершенная попытка обходного пути
Основываясь на этом наблюдаемом поведении, я сначала предпринял следующий обходной путь:
В разделе [Setup]
сценария установки Inno установите следующее:
CloseApplications=yes
CloseApplicationsFilter=*.chm,*.pdf
RestartApplications=yes
Директива CloseApplicationsFilter
указывает, какие файлы регистрируются в диспетчере перезапуска. Обратите внимание, что я не указываю *.exe
или *.dll
здесь; Я хочу вручную указать только определенные .exe
файлы в разделе [Code]
.
Вызовите функцию Inno Setup RegisterExtraCloseApplicationsResource
один раз для каждого .exe
файл в настройке, который НЕ будет порожден cygrunsrv
, и поместите их в процедуру события RegisterExtraCloseApplicationsResources
. Пример:
[Code]
Procedure RegisterExtraCloseApplicationsResources();
Begin
RegisterExtraCloseApplicationsResource(False, ExpandConstant('{app}\bin\cygrunsrv.exe'));
End;
Важно не регистрировать исполняемый файл, созданный с помощью cygrunsrv.exe
или любой из файлов DLL Cygwin, так как это не позволит перезапустить Диспетчер перезапуска в Inno Setup. .
Это решение далеко от совершенства, поскольку исполняемые файлы, обычно запускаемые с cygrunsrv
, если запускаются отдельно, не обнаруживаются Restart Manager (например, sshd.exe
). Например, новые сеансы S SH создаются в исполняемых файлах, которые не могут быть перезапущены с помощью диспетчера перезапуска.
Лучшее решение
Я решил, что лучшим решением будет обнаружение любых запущенных исполняемых файлов из кода и запросить пользователя, кроме функций Restart Manager (которые, проще говоря, не работают для сервисов Cygwin).