How do I run a node.js app as a background service?

前端 未结 26 1050
隐瞒了意图╮
隐瞒了意图╮ 2020-11-22 05:28

Since this post has gotten a lot of attention over the years, I\'ve listed the top solutions per platform at the bottom of this post.


Original post

相关标签:
26条回答
  • 2020-11-22 06:13

    Copying my own answer from How do I run a Node.js application as its own process?

    2015 answer: nearly every Linux distro comes with systemd, which means forever, monit, PM2, etc are no longer necessary - your OS already handles these tasks.

    Make a myapp.service file (replacing 'myapp' with your app's name, obviously):

    [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
    

    Note if you're new to Unix: /var/www/myapp/app.js should have #!/usr/bin/env node on the very first line.

    Copy your service file into the /etc/systemd/system.

    Start it with systemctl start myapp.

    Enable it to run on boot with systemctl enable myapp.

    See logs with journalctl -u myapp

    This is taken from How we deploy node apps on Linux, 2018 edition, which also includes commands to generate an AWS/DigitalOcean/Azure CloudConfig to build Linux/node servers (including the .service file).

    0 讨论(0)
  • 2020-11-22 06:14

    UPDATE: i updated to include the latest from pm2:

    for many use cases, using a systemd service is the simplest and most appropriate way to manage a node process. for those that are running numerous node processes or independently-running node microservices in a single environment, pm2 is a more full featured tool.

    https://github.com/unitech/pm2

    http://pm2.io

    • it has a really useful monitoring feature -> pretty 'gui' for command line monitoring of multiple processes with pm2 monit or process list with pm2 list
    • organized Log management -> pm2 logs
    • other stuff:
      • Behavior configuration
      • Source map support
      • PaaS Compatible
      • Watch & Reload
      • Module System
      • Max memory reload
      • Cluster Mode
      • Hot reload
      • Development workflow
      • Startup Scripts
      • Auto completion
      • Deployment workflow
      • Keymetrics monitoring
      • API
    0 讨论(0)
  • 2020-11-22 06:15

    PM2 is a production process manager for Node.js applications with a built-in load balancer. It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks. https://github.com/Unitech/pm2

    0 讨论(0)
  • 2020-11-22 06:16

    If you are running OSX, then the easiest way to produce a true system process is to use launchd to launch it.

    Build a plist like this, and put it into the /Library/LaunchDaemons with the name top-level-domain.your-domain.application.plist (you need to be root when placing it):

    <?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>
    

    When done, issue this (as root):

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

    and you are running.

    And you will still be running after a restart.

    For other options in the plist look at the man page here: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

    0 讨论(0)
  • 2020-11-22 06:16

    I use tmux for a multiple window/pane development environment on remote hosts. It's really simple to detach and keep the process running in the background. Have a look at tmux

    0 讨论(0)
  • 2020-11-22 06:20

    For people using newer versions of the daemon npm module - you need to pass file descriptors instead of strings:

    var fs = require('fs');
    var stdoutFd = fs.openSync('output.log', 'a');
    var stderrFd = fs.openSync('errors.log', 'a');
    require('daemon')({
        stdout: stdoutFd, 
        stderr: stderrFd
    });
    
    0 讨论(0)
提交回复
热议问题