如何将node.js应用程序作为后台服务运行?

多年来,由于这篇文章引起了很多关注,因此我在文章的底部列出了每个平台的最佳解决方案。


原始帖子

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

我也尝试过将进程置于后台,但是一旦关闭终端,进程也会被终止。

那么,当我关闭本地计算机时如何使它运行?


最佳解决方案

路易Harry2020/03/16 22:21:43

这个答案对于聚会来说还很晚,但是我发现最好的解决方案是编写同时使用screen -dmSnohup命令的shell脚本

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

我还在>> logfile末尾添加了一点,以便可以轻松保存node console.log()语句。

Why did I use a shell script? Well I also added in an if statement that checked to see if the node myserver.js process was already running.

That way I was able to create a single command line option that both lets me keep the server going and also restart it when I have made changes, which is very helpful for development.

前端LEY米亚2020/03/16 22:21:43

由于我在提供的答案列表中缺少此选项,因此我想在2020年之前添加一个合格的选项:docker或任何等效的 容器平台。除了确保您的应用程序在稳定的环境中运行之外,还具有其他安全优势以及改进的可移植性。

Docker支持Windows,macOS和大多数/主要的Linux发行版。在受支持的平台上安装docker非常简单明了,并有据可查。设置Node.js应用程序非常简单,只需将其放入容器中并运行该容器,同时确保在关闭后重新启动它即可。

创建容器映像

假设您的应用程序在该服务器上的/ home / me / my-app中可用,在文件夹/ home / me / my-app中创建一个文本文件Dockerfile其内容类似于以下内容:

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

使用以下命令创建图像:

docker build -t myapp-as-a-service /home/me

注意:最后一个参数是选择包含该Dockerfile的文件夹,而不是Dockerfile本身。您可以使用选项-f选择其他选项

启动容器

使用以下命令启动容器:

docker run -d --restart always -p 80:3000 myapp-as-a-service

此命令假定您的应用程序正在侦听端口3000,并且希望将其暴露在主机的端口80上。

当然,这是一个非常有限的示例,但这是一个很好的起点。

古一番长小小2020/03/16 22:21:43

PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器。它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务。 https://github.com/Unitech/pm2

十三村村蛋蛋2020/03/16 22:21:43

我很惊讶没有人提到古弗诺

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

在此处输入图片说明

编辑:但是,我不确定它是否可以在Windows上运行。我只在Linux上使用过它。

前端路易2020/03/16 22:21:43

我将tmux用于远程主机上的多窗口/窗格开发环境。分离并保持进程在后台运行非常简单。看看tmux

小小小宇宙2020/03/16 22:21:42

有没有人注意到“ 2>&1”位置的一个小错误?

2>&1 >> file

应该

>> file 2>&1
小卤蛋卡卡西2020/03/16 22:21:42

看看神游!除了启动许多工作程序外,您还可以妖魔化您的节点进程!

http://github.com/pgte/fugue

神无LEYMandy2020/03/16 22:21:42

为了完善建议的各种选项,这里还有一个:daemonGNU / Linux中命令,您可以在这里阅读:http : //libslack.org/daemon/manpages/daemon.1.html(如果在上面的评论之一中已经提到过,则表示歉意)。

十三GO2020/03/16 22:21:42

2017年6月更新:
Linux解决方案:(红色帽子)。以前的评论对我不起作用。这在Amazon Web Service-Red Hat 7上对我有用。希望对那里的人有用。

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add
LEY逆天2020/03/16 22:21:42

使用nssm作为Windows的最佳解决方案,只需下载nssm,将cmd打开到nssm目录并键入

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

这将安装一个新的Windows服务,该服务将在services.msc列出,您可以从中启动或停止该服务,该服务将自动启动,并且可以配置为在失败时重新启动。

猪猪Harry泡芙2020/03/16 22:21:42

可接受的答案可能是最佳的生产答案,但是对于从事开发工作的快速黑客来说,我发现了这一点:

nodejs scriptname.js & 这没有用,因为nodejs似乎吞噬了&,因此事情没让我继续使用终端而没有scriptname.js死去。

但是我放入nodejs scriptname.js一个.sh文件,并且可以 nohup sh startscriptname.sh &工作了。

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

村村蛋蛋2020/03/16 22:21:42

我使用Supervisor进行开发。它只是工作。每当您对.js文件进行更改时,Supervisor都会在加载这些更改后自动重新启动您的应用程序。

这是其Github页面的链接

安装:

sudo npm安装主管-g

您可以使用-e轻松使其监视其他扩展。我经常使用的另一个命令是-i忽略某些文件夹。

您甚至可以在注销后使用nohup和超级用户使节点应用程序在后台运行。

sudo nohup主管myapp.js&

A阿飞前端2020/03/16 22:21:42

如果您只想不间断地运行脚本,直到脚本完成,您可以使用nohup此处答案中已经提到的方法。但是,所有答案都没有提供完整的命令,也记录了stdinstdout

nohup node index.js >> app.log 2>&1 &
  • >>方法附加到app.log
  • 2>&1确保错误也发送到stdout并添加到了app.log
  • 结尾&确保您当前的终端与命令断开连接,以便您可以继续工作。

如果要运行节点服务器(或应在服务器重新启动时启动的节点),请使用systemd / systemctl

镜风Davaid2020/03/16 22:21:42

如果您使用的是nohup,请尝试运行此命令-

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

您也可以永远使用它来启动服务器

forever start -c "npm start" ./ 

PM2还支持 npm start

pm2 start npm -- start
村村十三逆天2020/03/16 22:21:42

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

建立一个这样的plist,然后将其放入名称为/ Library / LaunchDaemons的文件中top-level-domain.your-domain.application.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

Near小哥Green2020/03/16 22:21:42

这可能不是被接受的方法,但是我使用屏幕来实现,尤其是在开发过程中,因为我可以将其备份并在必要时对其进行愚弄。

screen
node myserver.js
>>CTRL-A then hit D

屏幕将脱离,并在您注销后仍然存在。然后,您可以通过屏幕-r将其取回。点击屏幕手册获取更多详细信息。您可以命名屏幕,也可以根据需要命名。

乐逆天2020/03/16 22:21:42

更新:我已更新为包括pm2中的最新内容:

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

https://github.com/unitech/pm2

http://pm2.io

  • 它具有一个非常有用的监视功能->漂亮的“ gui”,用于使用pm2 monit或列出的多个进程进行命令行监视pm2 list
  • 有组织的日志管理-> pm2 logs
  • 其他的东西:
    • 行为配置
    • 源地图支持
    • 兼容PaaS
    • 观看并重新加载
    • 模块系统
    • 最大内存重载
    • 集群模式
    • 热装
    • 开发流程
    • 启动脚本
    • 自动完成
    • 部署工作流程
    • 关键指标监控
    • API
三分糖就好2020/03/16 22:21:42

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

Itachi2020/03/16 22:21:42

更新 -正如以下答案之一所述,PM2永远都缺少一些非常好的功能。考虑使用它。

原始答案

使用nohup

nohup node server.js &

编辑我想补充一下,接受的答案确实是正确的方法。我在需要保持正常运行的实例上永远使用。我喜欢这样做npm install -g forever,它在节点路径中,然后执行forever start server.js