如何以后台运行进程,永不死亡?

我通过腻子SSH连接到Linux服务器。 我试图将其作为后台进程运行,如下所示:

$ node server.js & 

但是,在2.5小时之后,terminal变为不活动,并且过程中死亡。 无论如何,即使terminal断开连接,我仍然可以保持这个过程。


编辑1

实际上,我尝试了一下,但是一旦closures腻子SSHterminal或拔掉了我的networking,服务器进程就立即停止。

腻子有什么我必须做的吗?


编辑2(2012年2月)

有一个node.js模块, 永远 。 它将运行node.js服务器作为后台服务。

简单的解决scheme (如果您不想回到过程中,只想让它继续运行):

 nohup node server.js & 

强大的解决scheme (如果它是交互式的,允许您重新连接到进程):

 screen 

也考虑更新的屏幕,tmux替代。

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

  1. nohup表示: 即使stty被切断,也不要终止这个过程。
  2. > /dev/null表示: stdout转到/ dev / null(这是一个不logging任何输出的虚拟设备)。
  3. 2>&1表示: stderr也会转到stdout(已经被redirect到/dev/null )。 您可以用文件pathreplace&1以保留错误日志,例如: 2>/tmp/myLog
  4. &最后意味着: 运行这个命令作为后台任务。

你真的应该尝试使用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命令附加到某些screen -r 20673.pts-0.srv ,其中0673.pts-0.srv是条目列表。

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

特别是屏幕/ tmux解决scheme,这应该真的被认为是一个业余解决scheme。 屏幕和Tmux不是为了保持进程运行,而是为了复用terminal会话。 没问题,当你在你的服务器上运行一个脚本,并想断开连接。 但是对于一个node.js服务器,你不希望你的进程被连接到terminal会话。 这太脆弱了。 为了保持运行,你需要守护进程!

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

PM2 : http : //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.js : https : //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 

初始化脚本

我没有详细介绍如何编写一个初始化脚本,因为我不是这个主题的专家,这个答案太长了,但基本上它们是由OS事件触发的简单的shell脚本。 你可以在这里阅读更多

Docker

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

这里是一个示例Dockerfile(来自node.js 官方指南 ):

 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" ] 

然后build立你的形象,并运行你的容器:

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

希望这有助于有人登陆这个页面。 始终使用适当的工具来完成这项工作。 它会为你节省很多头痛和超过几个小时!

另一个解决scheme失去了工作

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

即使terminal死机, nohup也将允许程序继续。 实际上,我已经有了nohup阻止SSH会话正确终止的情况,所以你也应该redirectinput:

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

根据如何configurationnohup ,您可能还需要将标准输出和标准错误redirect到文件。

我在我的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" 
 $ disown node server.js & 

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

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

npm install pm2 -g

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

pm2 start app.js

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

你读过关于nohup的命令吗?

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

复制骨架脚本并根据需要调整它,可能所有你需要做的就是设置一些variables。 你的脚本会从/lib/init/init-d-scriptinheritance良好的默认值,如果某些东西不符合你的需要,可以在你的脚本中覆盖它。 如果出现问题,可以在source /lib/init/init-d-script看到详细信息。 强制性的variables是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 

那就是我为wikimedia wiki运行一些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 } 

除了设置variables,我不得不覆盖do_stop_cmd因为python替代了可执行文件,所以服务没有正常停止。