node.js - NSSM 未启动简单服务

标签 node.js mongodb batch-file windows-services

我在 Windows 批处理文件中有以下内容,我想在启动时执行该文件,因此我使用 NSSM 创建了一个服务。

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

我这样做是为了启动我的 Nodejs 应用程序的 mongodb 服务器。

我收到错误:

Unexpected status SERVICE_PAUSED in response to START control

在 I/O 重定向文件(nssm 日志)中,我得到“'mongod' 未被识别为内部或外部命令、可操作程序或批处理文件。”

现在,如果我直接从 Windows 执行该脚本,并且 mongod 已安装并且工作正常,则该脚本可以正常运行。

我不知道,为什么 nssm 不会打开新的命令提示符并执行此服务。

这是将 mongodb 服务器作为 Windows 服务启动的最佳方式吗?

最佳答案

在我看来,第一行 start/min cmd/k 完全没有用。删除它。

批处理文件由环境变量ComSpec中定义的应用程序执行。 ComSpec 通常的值为 C:\Windows\System32\cmd.exe。命令 start(现在)是 cmd.exe 的内部命令,用于将应用程序作为单独的进程启动。

您可以使用 start 启动另一个 cmd.exe,并且可以选择即使在此命令行进程启动的所有应用程序完成后仍保持最小化窗口打开。因此,第一行得到的只是一个新的最小化命令提示符窗口,除了等待用户输入之外什么也不做。

用于执行批处理文件中命令的

cmd.exe 立即继续解析以 mongod 开头的第二个命令行。

mongod 不是 cmd.exe 的内部命令。因此 mongodcmd.exe 解释为可执行文件的名称。

但是这个可执行文件的文件名没有文件扩展名,也没有路径。因此 cmd.exe 必须搜索可执行文件。

环境变量PATHEXT包含可执行文件用分号分隔的文件扩展名列表。此列表现在用于查找 mongod.commongod.exemongod.batmongod.cmd ,...

所以我给你的第一个建议是:指定带有文件扩展名的 mongod,即 mongod.exe

由于没有文件路径,cmd.exe 首先在当前工作目录中搜索 mongod.commongod.exe 或 . .. 以及环境变量 PATH 中指定的所有目录中的下一个,以分号分隔。

PATH 包含目录列表。但路径并不只有一个。有系统 PATH 和当前用户帐户的 PATH,如 Advanced system settings in Windows Control Panel 中所示。单击按钮后打开用于查看和更改环境变量的对话框。

所有应用程序使用的PATH是系统PATH和使用的用户帐户PATH的组合。

您收到错误消息

'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 startstart/?

作为编写批处理文件的初学者,请查看有关 Windows Commands 的 Microsoft 文章.

关于node.js - NSSM 未启动简单服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122675/

相关文章:

javascript - 使用Browserify编译NPM包

javascript - 将整个模块拉入当前范围 Node.js

mongodb - 如果不存在则插入,否则删除 MongoDB

mongodb - Golang Mongo 使用 bson.NewObjectID() 插入自生成的 _Id,导致意外的模式

windows - Bat 文件仅生成文件的 MD5 校验和

variables - 在批处理文件的文件路径目录中使用变量

node.js - 在写入结果可用之前是否应该注册 `drain` 事件

node.js - 使用 PassportJS 在 Session 中修改 user.username

linux - MongoDB:Windows 上不支持 unix 套接字

c# - 如何等到我的批处理文件完成