Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > служба windows


Автор: jimbo 4.6.2010, 13:26
Привет всем!

Написав свою службу, можно ли заставить ее перезапускать саму себя?

Автор: SenkraD 4.6.2010, 13:34
jimbo,  можно поподробней?

P.S. Можеш постучатся в асю - чем смогу помогу -
у меня щас build длинный идёт и мне скучно smile

Добавлено через 4 минуты и 32 секунды
Если ты хочеш её перезапустить после креша, то
    - ставиш SEH обработчик
    - вызываеш свою прогу с нужным ключём (чтобы
      она перезапустилась, как сервис) или вызывеш
      преготовленный батник или вызывеш трерью прогу,
      которая вызвет тебя

Автор: jimbo 4.6.2010, 13:40
допустим, у нас есть программа консольная, которая каждую минуту пишет в файл текущее время. 

Чтобы не запускать ее постоянно на компе, хочется сделать из программы службу, чтобы она автоматом включалась при включении компьютера и при сбое перезапускалась.

Вот тут и вся хитрость. Случаются моменты, когда служба работает, но ничего не пишет в файл. Код приводить бессмысленно, потому что делает он не запись в файл. 

Вопрос больше из теории, можно ли сделать так, чтобы при возникновении некого события (допустим установка глобальной переменной типа bool в true) наша служба завершала свою работу и снова запускалась? Потому как я понял, при обычном завершении работы службы она уже не запускается, даже если стоит перезапускать всегда в настройках службы

Автор: SenkraD 4.6.2010, 13:41
Если просто перезапустится, то делаеш в проге какой-то именнованый
обьект ядра, далее вызываеш свой бинарь с нужными ключами, который
по обьекту ядра ждёт пока предыдущий интсанс завернётся и запускает
тебя вновь

Добавлено @ 13:45
Цитата(jimbo @  4.6.2010,  13:40 Найти цитируемый пост)
Вопрос больше из теории, можно ли сделать так, чтобы при возникновении некого события (допустим установка глобальной переменной типа bool в true) наша служба завершала свою работу и снова запускалась? Потому как я понял, при обычном завершении работы службы она уже не запускается, даже если стоит перезапускать всегда в настройках службы
    - тут либо как в добавлении к первому посту: поймал SEH и по удобной цепочке
    - либо писать GAURD который будет следить есть ли прога и если нет - подымать
      ( к примеру, Interbase так и делает, ещё у MS SQL SERVER такое есть)

Автор: jimbo 4.6.2010, 13:46
Цитата

Если ты хочеш её перезапустить после креша, то


Если поставить в настройках службы "перезапускать всегда", то после креша она разве не запустится?

Цитата

предыдущий интсанс завернётся 


но мне надо перезапуск произвести при рабочей службе. или может я тебя неправильно понял?

Добавлено через 1 минуту и 59 секунд
Цитата

или вызывеш
      преготовленный батник или вызывеш трерью прогу,
      которая вызвет тебя 


Мне пока только такой вариант идет в головуsmile Но что-то мне кажется, что это неправильно с точки зрения "перезапуска служб")) Может есть что-то более корректное, чем программа, которая контролит другую программу?

Автор: SenkraD 4.6.2010, 13:57
Цитата(jimbo @  4.6.2010,  13:46 Найти цитируемый пост)
но мне надо перезапуск произвести при рабочей службе. или может я тебя неправильно понял?
если я правильно понимаю перезапуск, то сначала нужно завершиться,
а потом запустится вновь и тогда мой сценарий сюда подходит.

Цитата(jimbo @  4.6.2010,  13:46 Найти цитируемый пост)
 Но что-то мне кажется, что это неправильно с точки зрения "перезапуска служб"))
на сколько мне изветно, а с службами я успел наработатся,
то сами сервисы и сервис манагер базовый такого делать не позволяют

Цитата(jimbo @  4.6.2010,  13:46 Найти цитируемый пост)
Может есть что-то более корректное, чем программа, которая контролит другую программу?
А чем плохой вариант? - Много серверных продуктов так и делают.
Также знаю, что в паре систем быстрой оплаты и пополнения счетов,
также взят этот подход (одну когда-то сам писал,  о других расказали)

Автор: 12usver12 5.6.2010, 23:15
пиши шеллкод, который будет перезапускать, инжектируй в проводник  smile 

Автор: xvr 6.6.2010, 10:11
Цитата(12usver12 @ 5.6.2010,  23:15)
пиши шеллкод, который будет перезапускать, инжектируй в проводник  smile

Вот уж антивирусы порадуются  smile 

PS. А поставить в настройках службы "перезапускать всегда" и просто завершить процесс точно не работает?
NB. При проверки надо иметь немного терпения - служба перезапускается не сразу  smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)