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

前端 未结 26 1049
隐瞒了意图╮
隐瞒了意图╮ 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:09

    If you simply want to run the script uninterrupted until it completes you can use nohup as already mentioned in the answers here. However, none of the answers provide a full command that also logs stdin and stdout.

    nohup node index.js >> app.log 2>&1 &
    
    • The >> means append to app.log.
    • 2>&1 makes sure that errors are also send to stdout and added to the app.log.
    • The ending & makes sure your current terminal is disconnected from command so you can continue working.

    If you want to run a node server (or something that should start back up when the server restarts) you should use systemd / systemctl.

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

    I am simply using the daemon npm module:

    var daemon = require('daemon');
    
    daemon.daemonize({
        stdout: './log.log'
      , stderr: './log.error.log'
      }
    , './node.pid'
    , function (err, pid) {
      if (err) {
        console.log('Error starting daemon: \n', err);
        return process.exit(-1);
      }
      console.log('Daemonized successfully with pid: ' + pid);
    
      // Your Application Code goes here
    });
    

    Lately I'm also using mon(1) from TJ Holowaychuk to start and manage simple node apps.

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

    June 2017 Update:
    Solution for Linux: (Red hat). Previous comments doesn't work for me. This works for me on Amazon Web Service - Red Hat 7. Hope this works for somebody out there.

    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
    
    0 讨论(0)
  • 2020-11-22 06:10

    The accepted answer is probably the best production answer, but for a quick hack doing dev work, I found this:

    nodejs scriptname.js & didn't work, because nodejs seemed to gobble up the &, and so the thing didn't let me keep using the terminal without scriptname.js dying.

    But I put nodejs scriptname.js in a .sh file, and nohup sh startscriptname.sh & worked.

    Definitely not a production thing, but it solves the "I need to keep using my terminal and don't want to start 5 different terminals" problem.

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

    You can use Forever, A simple CLI tool for ensuring that a given node script runs continuously (i.e. forever): https://www.npmjs.org/package/forever

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

    UPDATE - As mentioned in one of the answers below, PM2 has some really nice functionality missing from forever. Consider using it.

    Original Answer

    Use nohup:

    nohup node server.js &
    

    EDIT I wanted to add that the accepted answer is really the way to go. I'm using forever on instances that need to stay up. I like to do npm install -g forever so it's in the node path and then just do forever start server.js

    0 讨论(0)
提交回复
热议问题