Научите, как сервис под винду писать.

Yzzi

Ни разу не делал, научите.
Нужно соорудить специализированный сервер, раздающий файлы. Сервер должен запускаться автоматически после загрузки системы. Так понимаю, что надо его делать сервисом и инсталлировать. Было бы еше чудно понимать, что сервер подвис и его перезапускать. Как это делать, тож не особо представляю (Отдельное приложение, которое регулярно на него запросики отсылает?)
Разрабатывается эта радость под xp и server 2003. Пишу на Borland c++. Там есть тип проектов Service и Service Application. Они годятся? Как такие задачи вообще культурно решаться должны?

okis

А что за специализированный сервер? Судя по тому, что подключение к нему будет осуществляться, скорее всего, специализированным ПО, можно сделать сервер стандартным и правильно его настроить. Если же особенности вашего ПО не позволяют уложиться в возможности модуля apache / другие возможности готовых серверов, то нужно представить архитектуру системы как таковую, т.е. какого рода будут запросы, как они будут обрабатываться, какая будет нагрузка, ну и т.п. И исходя из этого думать, как это дело строить.
Сервисы под Borland не писал, но, судя по всему, сервис должен адекватно реагировать на всякие запросы системы (типа shutdown/restart). Поведение и формат запросов описаны в MSDN.

Yzzi

Специализированный здесь означает "свой, написанный на си++". Пожелание заказчиков. По функциональности он должен уметь не много — опознавать, кто подключается, по запросу выдавать файлы, вести журнал активности, реагировать на команды консоли.
Читаю пока потихоньку...

okis

Так реализуй подмножество протокола http, для этого, наверное, есть стандартные компоненты. В Delphi же через Indy делалось взаимодействие с сетью, туда и надо смотреть. Остальное — задачи технические.

Yzzi

С этим согласен, на Indy уже нацелился. Но это компонент в проекте. А проект бывает либо приложением, либо сервисом. Насколько я понимаю, обычное приложение нельзя инсталлировать. Вот потому с сервисами начал разбираться.

356ft85

Не в ту сторону копаешь.
Серверу совершенно не обязательно быть сервисом. И вовсе не зачем его инсталлировать.
ПО логике задача сервера с точки зрения ОС проста - прописаться в автозагрузку и висеть всё время в системе запущенным, пока включен комп.
Разве нет?
Тем более что ты пишешь на Борланд С++.
Прописаться в авто загрузку - там 5 строчек. ну мб еще копирнуть себя в системную папку, если запущен не из неё - тоже строчек 5. итого вся функциональность свзяанная с постоянным присутствием в системе решается в 10 строчек. Зачем тебе Service вообще не понятно

klyv

руки поотрывать тем, кто на это делает ставку, языки повырывать тем, кто это советует.

sinet

Можно пойти дальше. Заставить пользователя не только логиниться, но еще и саму программы вручную запускать. Вообще ничего делать не надо. :p
Автозагрузка не даст гаратнии запуска после загрузки системы.

Serab

Автозагрузка не даст гаратнии запуска после загрузки системы.
Еще надо учесть, что из под юзера в современных системах многое делать не получится. А вот сервисы запускаются с нормальными правами. Например, выделение физической памяти, это если так, навскидку, довольно полезная штуковина, если хочешь ускорить время отклика. Хотя от файлового сервера это, может быть, и не требуется особо.

Andbar

Под вашу задачу точно варианта апач+пхп/перл+БД+скриптик не хватит? Ведь настройка вышеперечисленного ПО + написание скриптика и верстка нескольких шаблонов страниц - гораздо более простая задача, нежели написание целого выделенного сервиса, пусть даже с использованием компонент. Да и скрипт можно в любой момент подправить без приостановки апача, что не получится с Win32-сервисом.

Yzzi

Ребят, спасибо!
Поясню, в чем горячка была.
Сервер, по большому счету уже был готов. Я его делал приложением обычным. Начальство в какой-то момент порешило, что лучше не рассчитывать на таланты инженеров заказчиков (например, в случае перестановки или чистки оси) и сделать все по минимуму зависящим от сторонних ручонок. В частности поэтому сервис. Ну, и вообще так кошернее — об этом писали до меня.
Почему Борланд? Исходники передаем. В ТЗ требование: "Писать, чтоб нашим программистам было в кайф. ПлюсЫ и проекты Борланд."
Сейчас принял такое решение:
- завел проектик типа Service Application в Борланде;
- на него кинул IdTCPServer;
- в его event OnExecute влил содержимое уже написанного сервера.
Потом, собственно, инсталляция того, что скомпилировалось.
, спасибо за пример :)
И за конкретную ссылку на МСДН тож благодарю. Еще не проверял, но посмотрю.
Еще вопрос такой возник. Посмотрел, как сервер InterBase работает. У него кроме сервера есть ещё Guardian. Он вроде как запускает сервер и может его перезапустить, если подвиснет. Как такое делается? И еще задумался, что было бы здорово уметь перезапустить сервис с удаленной машины, если он повиснет. Но ни черта не понимаю, как это проверять и реализовывать.
И вообще по мелочам куча всего всплывает. Может, кто книгу насоветует для ликбеза?

kruzer25

И еще задумался, что было бы здорово уметь перезапустить сервис с удаленной машины
Всё уже продумано до тебя, net help.

Andbar

Некоторые софтописатели пишут watch-dog, который постоянно контролирует состояние основного процесса и при его завершении запускает вновь. Но вообще можно при установке сервиса настроить поведение при первом, втором и последующем сбоях.

356ft85

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

Dimon89

Он вроде как запускает сервер и может его перезапустить, если тот повиснет. Как такое делается?
Я для своего сервера (не виндосервиса) такое организовывал через Shared Memory. Вообще, имхо, сильно зависит от симптомов падения сервера: накрывается процесс или просто перестаёт выполнять основные функции.

kruzer25

Я для своего сервера (не виндосервиса) такое организовывал через Shared Memory.
Такое надо реализовывать не через shared memory, а через тестирование тех самых основных функций. Кладём в крон задачу проверки работоспособности сервиса, она, например, в случае веб-сервера - заходит на него, отправляет запрос, получает ответ (если получает сравнивает его с тем, что должно было быть; если что-то не так - перезапускает (это если мы хотим, чтобы такие вещи были на автомате).

Dasar

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

serega1604

>он потом будет мешаться при работе.
кому он будет мешать?

Dasar

кому он будет мешать?
тому кто управляет пользователями.
допустим - юзеры, вообще, в домене должны лежать, домен строится на основе орг.структуры, тогда получается что этого тестового юзера надо аж в орг.структуру прописать.

serega1604

вроде всякие домены/АД etc придумывались для того чтобы облегчить жизнь при создании пользователя, а у тебя получается что это лишняя надстройка, которая только мешает всем нормально жить и работать.

Dasar

вроде всякие домены/АД etc придумывались для того чтобы облегчить жизнь при создании пользователя
проблема не в домене.
проблема в желании - иметь пользователя, который на самом деле не пользователь.

serega1604

>иметь пользователя, который на самом деле не пользователь.
ну хз, у меня таких 38 (при общем числе записей в /etc/passwd 48) меня это нисколько не напрягает.

kruzer25

проблема в желании - иметь пользователя, который на самом деле не пользователь.
Да, действительно, очень нехорошее желание.

Dasar

Да, действительно, очень нехорошее желание.
это аккаунты, а не пользователи.
пользователя отличает от аккаунта: наличие фио, привязка к орг. структуре, выданные бизнес-роли и т.д.
ps
вот такая надпись мне бы не понравилась при заходе в "корпоративное хранилище":
документ "устав компании" был изменен пользователем IUSR.

serega1604

т.е. при помощи домена можно управлять пользователями, но не нельзя аккаунтами?

Fragaria

Было бы еше чудно понимать, что сервер подвис и его перезапускать.
Это особенность современного программирования - в архитектуре системы предусматривать watchdog?

Dasar

Это особенность современного программирования - в архитектуре системы предусматривать watchdog?
если планируется 24x7, то в обязательном порядке - в первую очередь.

Dasar

т.е. при помощи домена можно управлять пользователями, но не нельзя аккаунтами?
а чуть подумать?
речь шла о том, что тестирующему модулю нужен именно пользователь, а не аккаунт.

Fragaria

Пипец... Как можно отдавать в 24x7-продакшн приложение, которое требует присмотра за собой? Кто-нибудь видел watchdog за апачем например, или за mysql?

kruzer25

Как можно отдавать в 24x7-продакшн приложение, которое требует присмотра за собой? Кто-нибудь видел watchdog за апачем например, или за mysql?
Поэтому у нас есть специальный крон, который проверяет, что апач не упал, и в случае падения шлёт смски, чтобы кто-нибудь зашёл на сервер, руками посмотрел, в чём дело, и перезапустил апач, если нужно.
Такие смскиприходят не очень часто, но всё-таки приходят.

Dasar

можно отдавать в 24x7-продакшн приложение, которое требует присмотра за собой? Кто-нибудь видел watchdog за апачем например, или за mysql?
навскидку
 google: apache watchdog
 google: mysql watchdog
ps
watchdog часто делается на коленке: через пользователей + горячий телефон + дежурный админ, но это не самое лучшее решение

Dasar

Пипец... Как можно отдавать в 24x7-продакшн приложение, которое требует присмотра за собой? Кто-нибудь видел watchdog за апачем например, или за mysql?
а если по существу: жизнь сложная штука, и херотень(непредусмотренная ситуация) встречается всегда.
поэтому в обязательном порядке должен быть кто-то кто разбирается с этой непредвиденной ситуацией.
на watchdog как раз обычно и вешается разбирательство с непредвиденной ситуацией.
ps
и вообще - как-то странно утверждать, что программисты mysql/apache и т.д. могли предусмотреть вчера все то, что у тебя будет на твоем компьютере сегодня.

Fragaria

И что, часто бывает, чтоб падал именно апач? Или дело в чем-то ещё (диск забился, превышен лимит на подключения и тп)?
PS у нас тоже есть такая подсистема (Zabbix которая мониторит все сервисы продакшн-системы, логи и прочее, и шлёт смски. И даже есть специальный отдел Monitoring, который круглосуточно вручную проверяет работоспособность сервисов. Но никому и в голову не приходит делать перезапуск системы в случае падения автоматическим. Потому что это в обязательном порядке должно делаться вручную: сбор логов, анализ причины сбоя, если возможно - то устранение, затем написание баг-репорта и прочее.

Dasar

Но никому и в голову не приходит делать перезапуск системы в случае падения автоматическим.
Потому что это в обязательном порядке должно делаться вручную: сбор логов, анализ причины сбоя, если возможно - то устранение, затем написание баг-репорта и прочее.
а в это время АЭС идет вразнос? или чем там у вас система занимается?

Dasar

Но никому и в голову не приходит делать перезапуск системы в случае падения автоматическим. Потому что это в обязательном порядке должно делаться вручную: сбор логов, анализ причины сбоя, если возможно - то устранение, затем написание баг-репорта и прочее.
в моем понимании, так делается там - где все ориентировано ради удобства админов/разработчиков, и где нет ориентации на пользователя.
пользователю в первую очередь надо, чтобы сейчас все работало, а потом уже разбирательство - почему был сбой.

Fragaria

Ну все приведённые тобой примеры из гугла - как раз watchdog на коленке (то есть сторонние проекты).
и вообще - как-то странно утверждать, что программисты mysql/apache и т.д. могли предусмотреть вчера все то, что у тебя будет на твоем компьютере сегодня
Понятно, что нет. Всякое случается. Но решать проблему падений методом встроенного watchdog, который просто перезапускает сервис - это по-моему явный пример плохого архитектурного дизайна. Тут гораздо лучше оставить способ оповестить о своём падении внешнюю программу (heartbeat, keepalive-log etc) и позволить администратору программного решения внести твой сервис в общую мониторинговую систему, чем самому заниматься самодеятельностью.

Dasar

Но решать проблему падений методом встроенного watchdog, который просто перезапускает сервис - это по-моему явный пример плохого архитектурного дизайна
если речь идет про windows-сервисы, то примитивный watchdog - видя, что происходит херня, должен просто ронять/прибивать сервис.
а вот что происходит дальше (перезапуск, оповещение кого-либо и т.д. уже делается через стандартные средства

Dasar

Ну все приведённые тобой примеры из гугла - как раз watchdog на коленке (то есть сторонние проекты).
но я о том, что если google полон страниц о mysql/apache watchdog, то, наверное, не все так хорошо, как ты описываешь.
и даже mysql/apache требуется внешний watchdog, который следит за их работоспособностью.
Как можно отдавать в 24x7-продакшн приложение, которое требует присмотра за собой? Кто-нибудь видел watchdog за апачем например, или за mysql?

Fragaria

а в это время АЭС идет вразнос? или чем там у вас система занимается?
Конечно нет, в это время работает резервная подсистема (во всяком случае у нас, не уверен за АЭС).
Потому что перезапускать систему, которая только что упала, не разобравшись, почему она упала, в некоторых случаях может быть гораздо опаснее, чем не запускать её вовсе, особенно если причина падения - системный сбой. Например, нарушена целостность области кода в результате переполнения буфера. В этот раз программа просто упала, и сработала резервная система, АЭС в порядке. А в следующий начнёт работать с искаженной логикой, и об этом никто не узнает, пока АЭС не ебнет к чертям.

Fragaria

а вот что происходит дальше (перезапуск, оповещение кого-либо и т.д. уже делается через стандартные средства
В таком виде согласен. Просто топикстартер описал именно решение "упало - перезапустим", против которого я и не согласен.

kruzer25

Но никому и в голову не приходит делать перезапуск системы в случае падения автоматическим
Естественно. Я там и написал - "если нужна именно автоматическая перезагрузка".
Ты тут говоришь про апач и mysql - а что, думаешь, эта поделка топикстартера сравнима с ними по отлаженности?

kruzer25

а в это время АЭС идет вразнос
А если перезапустить сервис - то не пойдёт?

serega1604

>речь шла о том, что тестирующему модулю нужен именно пользователь, а не аккаунт.
про пользователя вроде сказал первым ты.
не знаю как в венде, а в нормальных системах с поставленной задачей справится и аккаунт.

Dasar

Конечно нет, в это время работает резервная подсистема (во всяком случае у нас, не уверен за АЭС).
а если резервная тоже накрывается? то что дальше?

Dasar

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

Dasar

А если перезапустить сервис - то не пойдёт?
может и пойдет, а может и не пойдет.
но если по ошибке наварачивается основная система, то все становятся слепы и глухи.

Dasar

А в следующий начнёт работать с искаженной логикой, и об этом никто не узнает, пока АЭС не ебнет к чертям.
а вот это уже плохая архитектура, которая провоцирует работу с искаженной логикой.

Dasar

Например, нарушена целостность области кода в результате переполнения буфера. В этот раз программа просто упала, и сработала резервная система
мне пока непонятно, какой человек и с какой квалификацией будет 1 января в 2:00 разбираться с этой проблемой на АЭС в урюпинске?

kruzer25

мне пока непонятно, какой человек и с какой квалификацией будет 1 января в 2:00 разбираться с этой проблемой на АЭС в урюпинске?
Системный администратор. В 2:00 ему позвонили и сказали об ахтунге, к 2:05 он опохмелился и разбирается с проблемой.

Dasar

Системный администратор. В 2:00 ему позвонили и сказали об ахтунге, к 2:05 он опохмелился и разбирается с проблемой.
каким образом и как он будет разбираться почему ушел в отказ модуль "сделать чтобы АЭС работала.exe"?
я правильно понимаю, что он пару минут в него повтыкает, а потом его просто перезапустит?

sinet

Скорее управление переключится на резервную систему, а он станет разбираться.
Тупо перезапустить/переключить управление вполне осилит и тот кто позвонил ему.

kruzer25

Происшествия делятся на два вида - те, которые уже известны, с которыми известно, что делать - и все остальные. Соответственно, если мы видим, что что-то работает не так - мы можем автоматически проверить, не произошла ли ошибка первого рода, и, если произошла, обработать её самостоятельно; а если стряслась какая-то неизвестная жопа - то перезапускать сервер ни в коем случае нельзя, тут требуется ручная обработка, чтобы понять, что случилось, и что с этим делать.
Да, возможно, в некоторых случаях ничего нигде исправлять не нужно будет, и достаточно будет просто перезапустить модуль. Но не во всех.

sergeikozyr

Кто-нибудь видел watchdog за апачем например, или за mysql?
в яндексе делают

Yzzi

С этим тоже голову ломаю. Пока что допустил, что мой сервис предельно простой и его сбои позволяют спокойно перезапускаться. Потом "когда-нибудь" буду разбираться, какие бывают причины подвисания. Сейчас себе представляю себе это только так:
- тот модулек, который запускает и следит за работой сервера, разбирает от него эксепшены;
- глазами смотреть журнал событий, если неприятности часты.
Если все херня и слона едят не так, научите. Спасибо скажу.
Еще вопрос прозаичный. Как решается такой философский нюанс: программка, которая должна следить за сервисом (процессом, другой программой дожна быть надежнее, чем сам сервис. Т.е. почему не бывает надсмотрщика за надсмотрщиком?
В таком виде согласен. Просто топикстартер описал именно решение "упало - перезапустим", против которого я и не согласен.

kruzer25

тот модулек, который запускает и следит за работой сервера, разбирает от него эксепшены;
- глазами смотреть журнал событий, если неприятности часты.
Если все херня и слона едят не так, научите.
Глазами смотреть журнал событий, если произошла не та ошибка, с которой мы уже умеем что-то делать автоматически.
Как решается такой философский нюанс: программка, которая должна следить за сервисом (процессом, другой программой дожна быть надежнее, чем сам сервис.
Чем программа проще - тем меньше в ней ошибок. Если твой сторож слишком сложный - пишешь ещё одного, который будет следить за этим, и в случае его падения сразу сообщать администратору.

klyv

Как решается такой философский нюанс: программка, которая должна следить за сервисом (процессом, другой программой дожна быть надежнее, чем сам сервис. Т.е. почему не бывает надсмотрщика за надсмотрщиком?
в MS SQL есть MS SQL Agent, который за ним следит. а MS SQL следит за Agent'ом.

Yzzi

Усё встало!
Охрененно кайфно, когда в первый раз что-то делаешь.
Пользуясь случаем, всем передаю спасибы.
watchdog'ов не писал, бо ещё не разбирался. Рабочесть сервера решена аккуратной проверкой кода и тестированием.

kruzer25

Рабочесть сервера решена аккуратной проверкой кода и тестированием.
Тебе сколько лет?
Гарантировать рабочесть более-менее сложного сервера в реальной жизни, с реальными непредсказуемыми данными на входе - нельзя.

Andbar

Рабочесть сервера решена аккуратной проверкой кода и тестированием.
Код библиотек стройки тоже вычитывали? :grin:

Yzzi

Ладно вам стебаться.
Надсмотрщик тоже делаю.

yroslavasako

верните программирование от инженеров - учёным математикам, глядишь и надёжные сервера появятся

kruzer25

Ага - очень надёжный сервер, очень надёжно считающий 2*2.

serega1604

интересно, и что эти полтора математика на-программируют?

yroslavasako

http сервер минималистичный. Я вот смотрел lapack - вещь достаточно сложная, но надёжная и быстрая

serega1604

что этот минималистичный сервер должен уметь, на твой взгляд?
и какую ты видишь связь между реализацией сотню лет извезтных математических алгоритмов и программированием?

yroslavasako

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

kruzer25

что этот минималистичный сервер должен уметь, на твой взгляд?
Надёжно и быстро считать синус x и сортировать массивы.
Оставить комментарий
Имя или ник:
Комментарий: