由于这篇文章在过去几年里受到了很多关注,所以我在文章的底部列出了每个平台的最佳解决方案。


原来的帖子:

我希望我的node.js服务器在后台运行,即:当我关闭我的终端时,我希望我的服务器继续运行。我在谷歌上搜索过这个,并提出了这个教程,但它并不像预期的那样工作。因此,我没有使用这个守护进程脚本,我认为我只是使用了输出重定向(2>&1 >>文件部分),但这也不退出-我在终端中得到一个空行,就像它在等待输出/错误一样。

我也尝试过把进程放在后台,但是只要我关闭终端,进程就会被杀死。

那么,当我关闭本地计算机时,如何让它继续运行呢?


高级解决方案:

Systemd (Linux) Launchd (Mac) node-windows (Windows) PM2 (node . js)


当前回答

我很惊讶居然没有人提到Guvnor

我一直在尝试,pm2,等等。但是,当谈到可靠的控制和基于网络的性能指标时,我发现Guvnor是迄今为止最好的。另外,它也是完全开源的。

编辑:但是,我不确定它是否在windows上工作。我只在linux上使用过。

其他回答

如果使用nohup -,请尝试执行该命令

nohup npm start 2>/dev/null 1>/dev/null&

你也可以使用永久来启动服务器

forever start -c "npm start" ./ 

PM2也支持npm启动

pm2 start npm -- start

我使用Supervisor进行开发。它就是有用。当你对.js文件进行更改时,管理器会自动重新启动你的应用程序,加载这些更改。

这是其Github页面的链接

安装:

Sudo NPM安装管理器

使用-e可以很容易地让它监视其他扩展名。我经常使用的另一个命令是-i来忽略某些文件夹。

您可以使用nohup和supervisor使您的节点应用程序即使在注销后也能在后台运行。

Sudo nohup supervisor myapp.js &

这个答案有点晚了,但是我发现最好的解决方案是编写一个同时使用screen -dmS和nohup命令的shell脚本。

screen -dmS newScreenName nohup node myserver.js >> logfile.log

我还在末尾添加了>>日志文件位,这样我就可以轻松地保存节点console.log()语句。

为什么我要使用shell脚本?我还添加了一个if语句,检查节点myserver.js进程是否已经在运行。

通过这种方式,我可以创建一个命令行选项,既可以让我保持服务器运行,也可以在我进行更改时重新启动服务器,这对开发非常有帮助。

如果你在linux服务器上运行nodejs,我认为这是最好的方法。

创建业务脚本,拷贝到/etc/init/nodejs.conf目录下

Start service: sudo service nodejs Start

Stop service: sudo service nodejs Stop

服务脚本

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script

公认的答案可能是最好的生产答案,但作为一个快速开发工作的hack,我发现了这个:

Nodejs的scriptname.js &没有工作,因为Nodejs似乎吞噬了&,所以在没有scriptname.js死亡的情况下,它不让我继续使用终端。

但是我把nodejs的scriptname.js放在。sh文件中,然后 Nohup sh startscriptname.sh &工作。

绝对不是一个生产的东西,但它解决了“我需要继续使用我的终端,不想启动5个不同的终端”的问题。