首页 文章

如何运行Node.js作为后台进程,永远不会死?

提问于
浏览
455

我通过putty SSH连接到linux服务器 . 我尝试将其作为后台进程运行,如下所示:

$ node server.js &

但是,在2.5小时后终端变为非活动状态并且过程终止 . 无论如何,即使终端断开连接,我仍然能保持活动状态吗?


Edit 1

实际上,我尝试了 nohup ,但只要关闭Putty SSH终端或拔掉我的互联网,服务器进程就会立即停止 .

在Putty有什么我需要做的吗?


Edit 2 (on Feb, 2012)

有一个 node.js 模块,forever . 它将运行node.js服务器作为守护程序服务 .

14 回答

  • 134

    Simple solution (如果你不想回到这个过程,只是希望它继续运行):

    nohup node server.js &
    

    Powerful solution (允许您重新连接到流程,如果它是交互式的):

    screen
    

    然后,您可以按Ctrl a d分离,然后通过运行 screen -r 附加回来

    还要考虑更新的屏幕替代方案tmux .

  • 4

    nohup node server.js > /dev/null 2>&1 &

    • nohup 表示:即使stty被切断,也不要终止此过程 .

    • > /dev/null 表示:stdout转到/ dev / null(这是一个不记录任何输出的虚拟设备) .

    • 2>&1 表示:stderr也会转到stdout(已经重定向到 /dev/null ) . 您可以用文件路径替换&1以保留错误日志,例如: 2>/tmp/myLog

    • & 结尾意味着:将此命令作为后台任务运行 .

  • 0

    你真的应该尝试使用 screen . 它比仅仅做 nohup long_running & 要复杂一点,但是一旦你再也不回来了解屏幕 .

    首先开始您的屏幕会话:

    user@host:~$ screen
    

    运行你想要的任何东西

    wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso
    

    按ctrl A然后按d . 完成 . 你的会话继续在后台进行 .

    您可以按 screen -ls 列出所有会话,并通过 screen -r 20673.pts-0.srv 命令附加到某些会话,其中0673.pts-0.srv是条目列表 .

  • 110

    这是一个老问题,但在Google上排名很高 . 我几乎无法相信最高投票的答案,因为在屏幕会话中运行node.js进程,使用 & 或甚至带有 nohup 标志 - 所有这些 - 都只是解决方法 .

    特别是screen / tmux解决方案,它应该被认为是一个 amateur 解决方案 . Screen和Tmux并不意味着保持进程运行,而是用于多路复用终端会话 . 它希望您的进程附加到终端会话 . 这太脆弱了 . To keep things running you need to daemonize the process!

    有很多好的工具可以做到这一点 .

    PM2http://pm2.keymetrics.io/

    # basic usage
    $ npm install pm2 -g
    $ pm2 start server.js
    
    # you can even define how many processes you want in cluster mode:
    $ pm2 start server.js -i 4
    
    # you can start various processes, with complex startup settings
    # using an ecosystem.json file (with env variables, custom args, etc):
    $ pm2 start ecosystem.json
    

    我看到支持PM2的一个很大的优势是它可以生成系统启动脚本,使进程在重启之间保持不变:

    $ pm2 startup [platform]
    

    platform 可以 ubuntu|centos|redhat|gentoo|systemd|darwin|amazon .

    forever.jshttps://github.com/foreverjs/forever

    # basic usage
    $ npm install forever -g
    $ forever start app.js
    
    # you can run from a json configuration as well, for
    # more complex environments or multi-apps
    $ forever start development.json
    

    Init scripts

    我不是这个主题的专家,这个答案太长了,但基本上它们都是简单的shell脚本,由OS事件触发 . 你可以阅读更多关于这个here

    Docker

    只需使用 -d 选项在Docker容器中运行您的服务器,并且,瞧,您有一个守护进程的node.js服务器!

    这是一个示例Dockerfile(来自node.js official guide):

    FROM node:argon
    
    # Create app directory
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    # Install app dependencies
    COPY package.json /usr/src/app/
    RUN npm install
    
    # Bundle app source
    COPY . /usr/src/app
    
    EXPOSE 8080
    CMD [ "npm", "start" ]
    

    然后构建您的图像并运行您的容器:

    $ docker build -t <your username>/node-web-app .
    $ docker run -p 49160:8080 -d <your username>/node-web-app
    

    希望这有助于有人登陆此页面 . 始终使用适当的工具进行工作 . 它可以为您节省很多麻烦和数小时!

  • 6

    另一个解决方案否定了这份工作

    $ nohup node server.js &
    [1] 1711
    $ disown -h %1
    
  • 5

    nohup 将允许程序在终端终止后继续 . 我实际上有 nohup 阻止SSH会话正确终止的情况,所以你也应该重定向输入:

    $ nohup node server.js </dev/null &
    

    根据 nohup 的配置方式,您可能还需要将标准输出和标准错误重定向到文件 .

  • 2

    我在我的shell rc文件中有这个功能,基于@ Yoichi的回答:

    nohup-template () {
        [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
        nohup "$1" > /dev/null 2>&1 &
    }
    

    你可以这样使用它:

    nohup-template "command you would execute here"
    
  • 22
    $ disown node server.js &
    

    它将从活动任务列表中删除命令并将命令发送到后台

  • 1076

    Nohup和屏幕为后台运行Node.js提供了很好的解决方案 . Node.js进程管理器(PM2)是一个方便的部署工具 . 在您的系统上全局安装npm:

    npm install pm2 -g

    运行Node.js应用程序作为守护程序:

    pm2 start app.js

    您可以选择将其链接到Keymetrics.io由Unitech制作的监控SAAS .

  • 2

    你读过nohup命令吗?

  • 5

    使用sysv init在debian上作为系统服务运行命令:

    复制骨架脚本并根据您的需要进行调整,可能您需要做的就是设置一些变量 . 如果某些内容不符合您的需要,您的脚本将继承 /lib/init/init-d-script 中的精确默认值 - 在脚本中覆盖它 . 如果出现问题,您可以在源 /lib/init/init-d-script 中查看详细信息 . 强制性变量是 DAEMONNAME . 脚本将使用 start-stop-daemon 来运行您的命令,在 START_ARGS 中您可以定义要使用的 start-stop-daemon 的其他参数 .

    cp /etc/init.d/skeleton /etc/init.d/myservice
    chmod +x /etc/init.d/myservice
    nano /etc/init.d/myservice
    
    /etc/init.d/myservice start
    /etc/init.d/myservice stop
    

    这就是我为维基媒体运行一些python的方法维基:

    ...
    DESC="mediawiki articles converter"
    DAEMON='/home/mss/pp/bin/nslave'
    DAEMON_ARGS='--cachedir /home/mss/cache/'
    NAME='nslave'
    PIDFILE='/var/run/nslave.pid'
    START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'
    
    export PATH="/home/mss/pp/bin:$PATH"
    
    do_stop_cmd() {
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
            $STOP_ARGS \
            ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        rm -f $PIDFILE
        return $RETVAL
    }
    

    除了设置变量,我必须覆盖 do_stop_cmd 因为python替换了可执行文件,所以服务没有正确停止 .

  • 13

    除了以上很酷的解决方案,我还提到了supervisord和monit工具,它们允许启动进程,监视它的存在并在它死亡时启动它 . 使用'monit',您还可以运行一些活动检查,例如检查进程是否响应http请求

  • 2

    对于Ubuntu我用这个:

    (exec PROG_SH&> / dev / null&)

    问候

  • 491

    试试这个简单的解决方案

    cmd并退出

相关问题