Есть виндовый сервис который обновляет продукт. В сервис встроен интерпретатор LUA. Процедура обновления продукта написана на LUA. Обновление состоит из двух этапов: до и после перезагрузки. Скрипту необходимо дать знать какой сейчас этап.(импортировать какие-нибудь переменные в окружение скрипта не проблема) Всё было бы просто, если бы после прохождения первого этапа мы бы сразу перезагружались. Я тогда добавил бы ключ к запуску сервиса и после перезагрузки при старте сервиса его убрал бы.
А в моём не идеальном мире, сервис может ещё сто раз кто-нибудь запустить прежде чем пользователь перезагрузит компьютер. Определить, что мы ожидаем перезагрузки и не следует выполнять скрипт, не проблема. Проблема определить, что перезагрузка прошла и именно сейчас сервис был запущен системой для выполнения второго этапа обновления. Как определить что с момента последнего запуска сервиса произошла перезагрузка?
Ну или вообще как определить что с момента последнего запуска программы произошла перезагрузка
Здравствуйте, GarryIV, Вы писали:
GIV>Здравствуйте, TarasKo, Вы писали:
TK>>Есть виндовый сервис который обновляет продукт. В сервис встроен интерпретатор LUA. Процедура обновления продукта написана на LUA. Обновление состоит из двух этапов: до и после перезагрузки. Скрипту необходимо дать знать какой сейчас этап.(импортировать какие-нибудь переменные в окружение скрипта не проблема) Всё было бы просто, если бы после прохождения первого этапа мы бы сразу перезагружались. Я тогда добавил бы ключ к запуску сервиса и после перезагрузки при старте сервиса его убрал бы.
TK>>А в моём не идеальном мире, сервис может ещё сто раз кто-нибудь запустить прежде чем пользователь перезагрузит компьютер. Определить, что мы ожидаем перезагрузки и не следует выполнять скрипт, не проблема. Проблема определить, что перезагрузка прошла и именно сейчас сервис был запущен системой для выполнения второго этапа обновления. Как определить что с момента последнего запуска сервиса произошла перезагрузка?
TK>>Ну или вообще как определить что с момента последнего запуска программы произошла перезагрузка
GIV>А если писать в RunOnce нечто и оттуда дергать сервис на предмет — вот мол перезагрузка прошла, продолжай.
Не пойдёт, потому что у сервиса обновления RunMode = automatic и он автоматический стартует при старте системы. После того как он выполнит свою работу, он уже запускает сервис продукта, ну и вообще стартует сам продукт. Если прописать чего-нибудь в RunOnce, то что запуститься первым? Сервис или то что в RunOnce. Если то что в RunOnce гарантировано стартанёт первым, то это вариант. Однако, сдаётся мне, что никаких таких гарантий нет
![](/Forum/Images/smile.gif)
.
Можно конечно сделать RunMode = manual и всегда добавлять команду на запуск сервиса с каким-нибудь особым ключём в RunOnce. Но тогда надо всегда добавлять эту команду в RunOnce, даже если ничего не обновлялось, что мне кажется слегка кривоватым. Это нужно что бы стартовать продукт.
Да должен быть какой-то легальный способ в Windows определить, что с момента последнего старта программы произошла перезагрузка
Здравствуйте, TarasKo, Вы писали:
TK>Здравствуйте, GarryIV, Вы писали:
GIV>>Здравствуйте, TarasKo, Вы писали:
TK>>>Есть виндовый сервис который обновляет продукт. В сервис встроен интерпретатор LUA. Процедура обновления продукта написана на LUA. Обновление состоит из двух этапов: до и после перезагрузки. Скрипту необходимо дать знать какой сейчас этап.(импортировать какие-нибудь переменные в окружение скрипта не проблема) Всё было бы просто, если бы после прохождения первого этапа мы бы сразу перезагружались. Я тогда добавил бы ключ к запуску сервиса и после перезагрузки при старте сервиса его убрал бы.
TK>>>А в моём не идеальном мире, сервис может ещё сто раз кто-нибудь запустить прежде чем пользователь перезагрузит компьютер. Определить, что мы ожидаем перезагрузки и не следует выполнять скрипт, не проблема. Проблема определить, что перезагрузка прошла и именно сейчас сервис был запущен системой для выполнения второго этапа обновления. Как определить что с момента последнего запуска сервиса произошла перезагрузка?
TK>>>Ну или вообще как определить что с момента последнего запуска программы произошла перезагрузка
GIV>>А если писать в RunOnce нечто и оттуда дергать сервис на предмет — вот мол перезагрузка прошла, продолжай.
TK>Не пойдёт, потому что у сервиса обновления RunMode = automatic и он автоматический стартует при старте системы. После того как он выполнит свою работу, он уже запускает сервис продукта, ну и вообще стартует сам продукт. Если прописать чего-нибудь в RunOnce, то что запуститься первым? Сервис или то что в RunOnce. Если то что в RunOnce гарантировано стартанёт первым, то это вариант. Однако, сдаётся мне, что никаких таких гарантий нет
.
TK>Можно конечно сделать RunMode = manual и всегда добавлять команду на запуск сервиса с каким-нибудь особым ключём в RunOnce. Но тогда надо всегда добавлять эту команду в RunOnce, даже если ничего не обновлялось, что мне кажется слегка кривоватым. Это нужно что бы стартовать продукт.
TK>Да должен быть какой-то легальный способ в Windows определить, что с момента последнего старта программы произошла перезагрузка
А кстати, а под какой учётной записью выполняется программа запущенная из RunOnce?
Здравствуйте, TarasKo, Вы писали:
1) Можно просто подвесить при первом запуске после перезагрузки процесс-маркер. Если процесса нет — была перезагрузка.
2) Можно создать файлик, а потом удалить его с флажком, что удалять нужно после перезагрузки. Файлика нет — была перезагрузка.
3) Проанализировать event log на предмет нахождения записи о старте системы. Дата больше предыдущей зафиксированной — была перезагрузка.
Можно еще порыться в WMI на предмет аптайма или времени старта системы.
... << RSDN@Home 1.2.0 alpha rev. 688>>