Служба Windows, установленная с Procrun, работает в режиме /TS, но не запускается как служба Windows, говоря, что она "началась, а затем остановилась",
Я установил стандартный исполняемый файл jar в качестве службы Windows, выполнив следующую команду:
> prunsrv.exe //IS//"My Service" --Install="C:\path-to-prunsrv.exe" --Jvm=auto \
--Startup=auto --StartMode=jvm --Classpath="C:\path-to-MyService.jar" \
--StartClass=com.mydomain.MyService
Теперь я могу запустить свою программу в консольном режиме, выполнив следующую команду (я использую Java 1.6):
> prunsrv.exe //TS//"My Service"
Когда я пытаюсь запустить службу через стандартный интерфейс служб Windows, я получаю следующее сообщение об ошибке:
Служба MyService на локальном компьютере началась, а затем остановлена. Некоторые службы автоматически останавливаются, если они не используются другими службами или программами.
В моем файле журнала приложений нет вывода, когда я пытаюсь запустить службу таким образом. В журнале событий Windows также нет выхода (Windows 7 64-bit). Что я могу сделать, чтобы попытаться выяснить, почему эта служба не будет работать?
Ответы
Ответ 1
Не используйте пробелы в имени службы!
После многих часов тестирования и вытягивания Tomcat и дублирования его процесса начальной загрузки исправление для моей проблемы закончилось тем, что Apache Commons Daemon (Procrun) не работает должным образом, когда есть пустое пространство в имени службы Windows.
Похоже, что он правильно устанавливает и регистрирует службу с Windows, когда в имени службы есть пробелы. Записи реестра Windows даже выглядят правильными. Услуга даже работает в режиме отладки (ака TS или консоли) просто отлично. Однако при запуске в качестве фактического сервиса, запускаемого Windows, он выходит из строя, если служба была установлена с белым пространством в имени службы.
Я уверен, что у Procrun был некоторый тип выхода журнала, когда он терпит неудачу! Хорошее протоколирование может сделать такие отладочные проблемы, как это.
Мне нужно было иметь несколько слов в имени моей службы, поэтому я назвал свою службу одним словом и изменил имя с параметром "DisplayName":
> prunsrv.exe //IS//MyService --Install="C:\path-to-prunsrv.exe" --Jvm=auto \
--Startup=auto --StartMode=jvm --Classpath="C:\path-to-MyService.jar" \
--StartClass=com.mydomain.MyService --DisplayName="My Service"
Ответ 2
Я хотел бы дать дополнительную информацию о том, что сказал '11101101b'. (Это мой первый пост, поэтому, пожалуйста, будьте нежны!)
Я смог правильно установить сервис с пробелами в имени службы, изменив часть своей команды //IS//MyService, вместо этого получим следующее: я подозреваю, что это он тоже сделал. (Прошу прощения, если я ошибаюсь.) Обратите внимание, что двойная кавычка открытия начинается в начале строки, а не в начале имени службы.
"//IS//Моя служба"
Как и в случае с ним, сервис был установлен правильно и выглядел корректно, но он не запускался. Я смог обойти это, изменив значение службы данных ImagePath в реестре так же, как и для команды //RS//Моя служба. Следовательно, значение реестра вместо этого имеет следующие значения:
"//RS//Моя служба"
Кажется, что все работает без проблем.
Ответ 3
Этот сервер запускается и останавливается из-за того, что задача завершена службой, поэтому она автоматически останавливается. если у вас есть логика работы внутри, это не остановится.
Ответ 4
У меня та же проблема... на моей локальной машине все нормально работает на сервере та же проблема => проблема была в том, что рабочий путь не был установлен.
Пусть кто-то его хрень... будет силой с тобой
![enter image description here]()