2014-09-30 4 views
1

У меня есть следующий файл в оконном пакете, который я хочу выполнить при запуске, поэтому я создал службу, используя NSSM.NSSM не запускает простой сервис

start /min cmd /k 
mongod --dbpath "D:\weather_station\weather_data" --repair 
mongod --dbpath "D:\weather_station\weather_data" 

Я делаю это, чтобы запустить сервер mongodb для моего приложения nodejs.

я получаю ошибку:

Unexpected status SERVICE_PAUSED in response to START control 

и файлы для перенаправления ввода/O (NSSM журналов), я получаю «„mongod“не распознаются как внутренняя или внешней команда, исполняемая программа или пакетными файл."

Теперь этот сценарий работает нормально, если я выполняю его непосредственно из окон, а mongod установлен и работает нормально.

Я не знаю, почему nssm не откроет новую командную строку и не выполнит эту службу.

Это лучший способ запустить сервер mongodb в качестве службы Windows?

ответ

1

Первая линия с start /min cmd /k совершенно бесполезна в моей точке зрения. Убери это.

Пакетный файл выполняется приложением, определенным в переменной окружения ComSpec. ComSpec обычно имеет значение C:\Windows\System32\cmd.exe. Команда start является (в настоящее время) внутренней командой cmd.exe, чтобы запустить приложение как отдельный процесс.

Вы используете start, чтобы запустить еще один cmd.exe с возможностью открытия открытого окна с минимальным доступом даже после того, как все приложения, запущенные этим процессом, завершились. Таким образом, все, что вы получаете с первой строкой, - это новое окно с минимизированной командной строкой, которое ничего не делает, кроме ожидания ввода пользователя.

cmd.exe, используемый для выполнения команд в командном файле, продолжает разбор второй строки команд, начинающейся с mongod.

mongod не является внутренней командой cmd.exe. Поэтому mongod интерпретируется cmd.exe как имя исполняемого файла.

Но это имя файла исполняемого файла не имеет расширения файла и без пути. Поэтому cmd.exe должен выполнить поиск исполняемого файла.

Переменная окружения PATHEXT содержит список расширений файлов, разделенных точками с запятой для исполняемых файлов. Этот список используется в настоящее время, чтобы найти mongod.com или mongod.exe или mongod.bat или mongod.cmd, ...

Так что мой первый совет для вас: Укажите mongod с расширением файла, т.е. mongod.exe

Как нет пути к файла, cmd.exe сначала ищет в текущем рабочем каталоге mongod.com или mongod.exe или ... и далее во всех каталогах, указанных в переменной окружения PATH, разделенных точками с запятой.

PATH содержит список каталогов. Но есть не только один PATH. Существует система PATH и PATH для текущей учетной записи пользователя, как это видно в advanced system settings in Windows control panel после нажатия кнопки, чтобы открыть диалоговое окно для просмотра и изменения переменных среды.

ПУТЬ используется всеми приложениями представляет собой сочетание системы ПУТЬ и используется учетная запись пользователя ПУТЬ.

Вы получите сообщение об ошибке

'mongod' is not recognized as an internal or external command, operable program or batch file 

как каталог, содержащий mongod.exe либо перечислены в пользователя PATH учетной записи пользователя, или может быть найден в текущем рабочем каталоге на запуск пакетного файла вручную вами , Но mongod.exe не указывается в системе PATH или PATH учетной записи, используемой для запуска этого командного файла в качестве сервиса. И рабочий каталог при выполнении командного файла как службы также является другим, обычно C:\Windows\System32, чтобы получить рабочие пакетные файлы, если в пакетном файле указаны только стандартные приложения Windows без расширения файла и пути к файлу.

Таким образом, решение довольно просто:

Укажите mongod.exe полный путь и в двойные кавычки, если путь содержит один или несколько пробелов.

"C:\Program Files (x86)\whatever\mongod.exe" --dbpath "D:\weather_station\weather_data" --repair 
"C:\Program Files (x86)\whatever\mongod.exe" --dbpath "D:\weather_station\weather_data" 

Если mongod является консольным приложением, а не GUI приложение, а сам mongod также не запускает отдельный процесс, а затем прекращается непосредственно перед этим отдельный процесс завершен, вы больше ничего не нужно. Пакетный файл с этими двумя строками - это все, что вам нужно.

В противном случае вы, возможно, потребуется:

start "Repair Data" /min /wait "C:\Program Files (x86)\whatever\mongod.exe" --dbpath "D:\weather_station\weather_data" --repair 
start "..." /min /wait "C:\Program Files (x86)\whatever\mongod.exe" --dbpath "D:\weather_station\weather_data" 

Для получения справки по команде start введите в окне командной строки help start или start /?.

Как новичок в написании пакетных файлов взгляните на статью Microsoft command shell overview.

Смежные вопросы