Сервис для обновления продуктов
От: TarasKo Голландия  
Дата: 16.07.07 15:10
Оценка:
Есть виндовый сервис который обновляет продукт. В сервис встроен интерпретатор LUA. Процедура обновления продукта написана на LUA. Обновление состоит из двух этапов: до и после перезагрузки. Скрипту необходимо дать знать какой сейчас этап.(импортировать какие-нибудь переменные в окружение скрипта не проблема) Всё было бы просто, если бы после прохождения первого этапа мы бы сразу перезагружались. Я тогда добавил бы ключ к запуску сервиса и после перезагрузки при старте сервиса его убрал бы.
А в моём не идеальном мире, сервис может ещё сто раз кто-нибудь запустить прежде чем пользователь перезагрузит компьютер. Определить, что мы ожидаем перезагрузки и не следует выполнять скрипт, не проблема. Проблема определить, что перезагрузка прошла и именно сейчас сервис был запущен системой для выполнения второго этапа обновления. Как определить что с момента последнего запуска сервиса произошла перезагрузка?

Ну или вообще как определить что с момента последнего запуска программы произошла перезагрузка
Re: Сервис для обновления продуктов
От: GarryIV  
Дата: 16.07.07 17:09
Оценка:
Здравствуйте, TarasKo, Вы писали:

TK>Есть виндовый сервис который обновляет продукт. В сервис встроен интерпретатор LUA. Процедура обновления продукта написана на LUA. Обновление состоит из двух этапов: до и после перезагрузки. Скрипту необходимо дать знать какой сейчас этап.(импортировать какие-нибудь переменные в окружение скрипта не проблема) Всё было бы просто, если бы после прохождения первого этапа мы бы сразу перезагружались. Я тогда добавил бы ключ к запуску сервиса и после перезагрузки при старте сервиса его убрал бы.

TK>А в моём не идеальном мире, сервис может ещё сто раз кто-нибудь запустить прежде чем пользователь перезагрузит компьютер. Определить, что мы ожидаем перезагрузки и не следует выполнять скрипт, не проблема. Проблема определить, что перезагрузка прошла и именно сейчас сервис был запущен системой для выполнения второго этапа обновления. Как определить что с момента последнего запуска сервиса произошла перезагрузка?

TK>Ну или вообще как определить что с момента последнего запуска программы произошла перезагрузка


А если писать в RunOnce нечто и оттуда дергать сервис на предмет — вот мол перезагрузка прошла, продолжай.
WBR, Igor Evgrafov
Re[2]: Сервис для обновления продуктов
От: TarasKo Голландия  
Дата: 17.07.07 09:02
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, TarasKo, Вы писали:


TK>>Есть виндовый сервис который обновляет продукт. В сервис встроен интерпретатор LUA. Процедура обновления продукта написана на LUA. Обновление состоит из двух этапов: до и после перезагрузки. Скрипту необходимо дать знать какой сейчас этап.(импортировать какие-нибудь переменные в окружение скрипта не проблема) Всё было бы просто, если бы после прохождения первого этапа мы бы сразу перезагружались. Я тогда добавил бы ключ к запуску сервиса и после перезагрузки при старте сервиса его убрал бы.

TK>>А в моём не идеальном мире, сервис может ещё сто раз кто-нибудь запустить прежде чем пользователь перезагрузит компьютер. Определить, что мы ожидаем перезагрузки и не следует выполнять скрипт, не проблема. Проблема определить, что перезагрузка прошла и именно сейчас сервис был запущен системой для выполнения второго этапа обновления. Как определить что с момента последнего запуска сервиса произошла перезагрузка?

TK>>Ну или вообще как определить что с момента последнего запуска программы произошла перезагрузка


GIV>А если писать в RunOnce нечто и оттуда дергать сервис на предмет — вот мол перезагрузка прошла, продолжай.


Не пойдёт, потому что у сервиса обновления RunMode = automatic и он автоматический стартует при старте системы. После того как он выполнит свою работу, он уже запускает сервис продукта, ну и вообще стартует сам продукт. Если прописать чего-нибудь в RunOnce, то что запуститься первым? Сервис или то что в RunOnce. Если то что в RunOnce гарантировано стартанёт первым, то это вариант. Однако, сдаётся мне, что никаких таких гарантий нет .

Можно конечно сделать RunMode = manual и всегда добавлять команду на запуск сервиса с каким-нибудь особым ключём в RunOnce. Но тогда надо всегда добавлять эту команду в RunOnce, даже если ничего не обновлялось, что мне кажется слегка кривоватым. Это нужно что бы стартовать продукт.

Да должен быть какой-то легальный способ в Windows определить, что с момента последнего старта программы произошла перезагрузка
Re[3]: Сервис для обновления продуктов
От: TarasKo Голландия  
Дата: 17.07.07 09:11
Оценка:
Здравствуйте, 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?
Re: Сервис для обновления продуктов
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.07.07 15:20
Оценка: +1
Здравствуйте, TarasKo, Вы писали:

1) Можно просто подвесить при первом запуске после перезагрузки процесс-маркер. Если процесса нет — была перезагрузка.
2) Можно создать файлик, а потом удалить его с флажком, что удалять нужно после перезагрузки. Файлика нет — была перезагрузка.
3) Проанализировать event log на предмет нахождения записи о старте системы. Дата больше предыдущей зафиксированной — была перезагрузка.
Можно еще порыться в WMI на предмет аптайма или времени старта системы.
... << RSDN@Home 1.2.0 alpha rev. 688>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.