Apache daemons procrun prunsrv Windows EXE-режим не работает
В течение нескольких лет мы использовали Procrun для превращения приложений Java в службы (и без проблем).
У нас также есть некоторые собственные исполняемые файлы Windows, работающие как службы. До сих пор мы использовали Инструментарий управления Windows (WMI) для их определения, но сейчас я пытаюсь использовать Procrun и для этих встроенных исполняемых файлов... К сожалению, я не могу запустить Службу (или, по крайней мере, остаться таковой) Бег).
Сервис кажется правильно созданным; Prunsrvlog / stdout / stderr не содержит ошибок; ключи реестра, как в Apache / procrun, так и в system/Services, похоже, созданы нормально; Я могу посмотреть на сервис, используя апплет Windows Services или монитор Prunmgr; но... Сервис никогда не показывается как запущенный. Когда я пытаюсь вручную запустить Сервис из Prunmgr, я получаю всплывающее окно "... пытается запустить" в течение нескольких секунд, но Сервис остается остановленным.
Когда я пытаюсь запустить его из апплета Win Services, я также получаю всплывающее окно: служба запускается и останавливается. Некоторые службы останавливаются автоматически, если они не используются ".
Я нашел большую часть решения сам:
Я каким-то образом испортил свою собственную тестовую программу, и она всегда взаимодействовала с контроллером служб Windows... При использовании Procrun ваша собственная программа не должна (де) регистрироваться в контроллере служб Windows, поскольку это обрабатывается самим Procrun. После исправления моего тестового сервиса, я мог запускать и останавливать его, используя сервисы Procrun.
... но осталось несколько вопросов:
- Я нашел несколько хитов, говорящих, что
serviceName
не должно содержать пробелов, но я также (мучительно) обнаружил, чтоdisplayName
не должен содержать пробелов при использовании Procrun для собственных исполняемых файлов. ЕслиdisplayName
содержит пробелы, страница "Свойства" в апплете Windows Services отказывается открываться. Я понятия не имею, что может быть причиной этого, и это не относится к использованию приложений Java. - Даже если вы установите службу автозапуска (например, через
set PR_STARTUP=auto
), "нативный" сервис не запускается, когда выinstall
это, и это нуждается в явной команде запуска (например,bin\TestService start
) (но "родная" служба будет автоматически запускаться при каждой перезагрузке)... это опять-таки не применяется при переносе Java-приложений... они автоматически запускаются при их установке.
И последний совет: при использовании set PR_xxx=
формат для определения параметров для службы, значения, содержащие пробелы, обычно не должны заключаться в кавычки... Это может быть само собой разумеется для некоторых более опытных людей, но я от этого немного пострадал:-(
Остальная часть этого длинного поста в основном для истории (или редкого заинтересованного человека)
Код для определения сервиса:
set MY_HOME=c:\program files (x86)\testProgs\
cd /d "%MY_HOME%"
set PR_INSTALL=c:\program files (x86)\testProgs\bin\TestService
set PR_DISPLAYNAME=TestProg_Shared_Memory_Service
set PR_DESCRIPTION=Shared Memory Server for Testing Purposes
set PR_STARTUP=auto
set PR_LOGPATH=c:\program files (x86)\testProgs\logs
set PR_STDOUTPUT=auto
set PR_STDERROR=auto
set PR_STARTMODE=exe
set PR_STARTPATH=c:\program files (x86)\testProgs
set PR_STARTIMAGE=c:\program files (x86)\testProgs\bin\TPShmSrvD.exe
set PR_STARTPARAMS=PORT=9088;PATH=c:\program files (x86)\testProgs
set PR_STOPMODE=exe
set PR_STOPIMAGE=%MY_HOME%bin\TPCommand.exe
set PR_STOPPARAMS=PORT=9088;STOP;SHMSRV
set PR_LOGLEVEL=DEBUG
bin\TestService install
И, как я обнаружил позже, не забудьте добавить:
bin\TestService start
Результаты в commons-daemon.log:
[2012-09-22 15:26:32] [debug] ( prunsrv.c:1644) Commons Daemon procrun log initialized
[2012-09-22 15:26:32] [info] ( prunsrv.c:1648) Commons Daemon procrun (1.0.10.0 32-bit) started
[2012-09-22 15:26:32] [debug] ( prunsrv.c:559 ) Installing service...
[2012-09-22 15:26:32] [info] ( prunsrv.c:595 ) Service TestService name TestProg_Shared_Memory_Service
[2012-09-22 15:26:32] [debug] ( prunsrv.c:611 ) Setting service description Shared Memory Server for Testing Purposes
[2012-09-22 15:26:32] [info] ( prunsrv.c:629 ) Service 'TestService' installed
[2012-09-22 15:26:32] [info] ( prunsrv.c:1729) Commons Daemon procrun finished
[2012-09-22 15:27:00] [debug] ( prunsrv.c:1644) Commons Daemon procrun log initialized
[2012-09-22 15:27:00] [info] ( prunsrv.c:1648) Commons Daemon procrun (1.0.10.0 32-bit) started
[2012-09-22 15:27:00] [info] ( prunsrv.c:1561) Running 'TestService' Service...
[2012-09-22 15:27:00] [debug] ( prunsrv.c:1345) Inside ServiceMain...
[2012-09-22 15:27:00] [info] ( prunsrv.c:1089) Starting service...
[2012-09-22 15:27:00] [info] ( prunsrv.c:1244) Service started in 15 ms.
[2012-09-22 15:27:00] [debug] ( prunsrv.c:1496) Waiting for worker to finish...
[2012-09-22 15:27:01] [debug] ( prunsrv.c:1501) Worker finished.
[2012-09-22 15:27:01] [debug] ( prunsrv.c:1524) Waiting for all threads to exit
[2012-09-22 15:27:01] [debug] ( prunsrv.c:1528) JVM destroyed.
[2012-09-22 15:27:01] [info] ( prunsrv.c:1563) Run service finished.
[2012-09-22 15:27:01] [info] ( prunsrv.c:1729) Commons Daemon procrun finished
TestService stdout/stderr оба содержат только одну строку с надписью "stdout/stderr initialized"
Ключи реестра в ProcRun:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\TestService]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\TestService\Parameters]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\TestService\Parameters\Log]
"Path"="c:\\program files (x86)\\testProgs\\logs"
"Level"="DEBUG"
"StdError"="auto"
"StdOutput"="auto"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\TestService\Parameters\Start]
"Image"="c:\\program files (x86)\\testProgs\\bin\\TPShmSrvD.exe"
"WorkingPath"="c:\\program files (x86)\\testProgs"
"Params"=hex(7):50,00,4f,00,52,00,54,00,3d,00,39,00,30,00,38,00,38,00,00,00,50,\
00,41,00,54,00,48,00,3d,00,63,00,3a,00,5c,00,70,00,72,00,6f,00,67,00,72,00,\
61,00,6d,00,20,00,66,00,69,00,6c,00,65,00,73,00,20,00,28,00,78,00,38,00,36,\
00,29,00,5c,00,74,00,65,00,73,00,74,00,50,00,72,00,6f,00,67,00,73,00,00,00,\
00,00
"Mode"="exe"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\TestService\Parameters\Stop]
"Image"="c:\\program files (x86)\\testProgs\\bin\\TPCommand.exe"
"Params"=hex(7):50,00,4f,00,52,00,54,00,3d,00,39,00,30,00,38,00,38,00,00,00,53,\
00,54,00,4f,00,50,00,00,00,53,00,48,00,4d,00,53,00,52,00,56,00,00,00,00,00
"Mode"="exe"
И под СИСТЕМА \ Услуги:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TestService]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):22,00,63,00,3a,00,5c,00,70,00,72,00,6f,00,67,00,72,00,61,00,\
6d,00,20,00,66,00,69,00,6c,00,65,00,73,00,20,00,28,00,78,00,38,00,36,00,29,\
00,5c,00,74,00,65,00,73,00,74,00,50,00,72,00,6f,00,67,00,73,00,5c,00,62,00,\
69,00,6e,00,5c,00,54,00,65,00,73,00,74,00,53,00,65,00,72,00,76,00,69,00,63,\
00,65,00,22,00,20,00,2f,00,2f,00,52,00,53,00,2f,00,2f,00,54,00,65,00,73,00,\
74,00,53,00,65,00,72,00,76,00,69,00,63,00,65,00,00,00
"DisplayName"="TestProg_Shared_Memory_Service"
"DependOnService"=hex(7):54,00,63,00,70,00,69,00,70,00,00,00,41,00,66,00,64,00,\
00,00,00,00
"WOW64"=dword:00000001
"ObjectName"="LocalSystem"
"Description"="Shared Memory Server for Testing Purposes"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TestService\Parameters]
Я перепробовал почти все, что мог придумать, но не смог запустить Службу:-(
Еще два замечания:
1. У меня изначально были пробелы в DisplayName. Пока я не заменил их подчеркиванием, я не смог открыть страницу свойств в апплете Windows Services!!!
2. Собственный exe-файл имеет код для регистрации в Windows Service Controller (в основном, для обеспечения чистого завершения при завершении работы Windows). Этот код выполняется, если имя исполняемого файла оканчивается на " d.exe " (без учета регистра). Я пытался использовать обе формы (т.е. TPShmSrvD.exe и TPShmSrv.exe) для StartImage, но безрезультатно...
Любая помощь будет оценена,
Юуль
1 ответ
Это может быть не окончательный ответ, но запустить команды ниже
c:\Temp>prunsrv.exe //IS//VIJAY
создать сервис имени VIJAY
c:\temp\prunmgr.exe //ES//VIJAY
запустить пользовательский интерфейс для редактирования сервиса VIJAY
Его легко редактировать параметры из пользовательского интерфейса