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


原来的帖子:

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

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

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


高级解决方案:

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


当前回答

更新:我更新了包括最新的pm2:

对于许多用例,使用systemd服务是管理节点进程的最简单和最合适的方法。对于那些在单个环境中运行大量节点进程或独立运行节点微服务的人来说,pm2是一个功能更全的工具。

https://github.com/unitech/pm2

http://pm2.io

它有一个非常有用的监控功能->漂亮的“gui”命令行监控多个进程与pm2监控或进程列表与pm2列表 organized日志管理-> pm2日志 其他的东西: 行为的配置 源映射支持 PaaS兼容 观看和装填 模块系统 最大内存重载 集群模式 热重载 开发工作流程 启动脚本 自动完成 部署工作流程 Keymetrics监控 API

其他回答

如果您正在运行OSX,那么生成真正的系统进程的最简单方法是使用launchd来启动它。

像这样构建一个plist,并以top-level-domain.your-domain.application的名称将它放到/Library/LaunchDaemons中。Plist(你需要在放置它的时候是root):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

完成后,发出这个(作为根):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

你在跑步。

重新启动后,您仍将运行。

关于plist中的其他选项,请查看这里的手册页:https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

如果你在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

你可以使用Forever,一个简单的CLI工具,确保给定的节点脚本持续运行(即永远): https://www.npmjs.org/package/forever

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

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

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

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

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

复制我自己的答案从我如何运行一个Node.js应用程序作为它自己的进程?

2015年的答案:几乎每个Linux发行版都带有systemd,这意味着forever、monit、PM2等不再需要——你的操作系统已经处理这些任务了。

制作一个myapp。服务文件(替换'myapp'与你的应用程序的名称,显然):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

如果你是Unix新手,请注意:/var/www/myapp/app.js应该有#!/usr/bin/env节点,并将可执行模式打开chmod +x app.js。

将服务文件复制到/etc/systemd/system. conf文件中。

用systemctl Start myapp启动它。

使用systemctl Enable myapp启用它在引导时运行。

使用journalctl -u myapp查看日志

这摘自我们如何在Linux上部署节点应用程序,2018年版,其中还包括生成AWS/DigitalOcean/Azure CloudConfig来构建Linux/节点服务器的命令(包括.service文件)。