如何以后台运行进程,永不死亡?
我通过腻子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 &
-
nohup
表示: 即使stty被切断,也不要终止这个过程。 -
> /dev/null
表示: stdout转到/ dev / null(这是一个不logging任何输出的虚拟设备)。 -
2>&1
表示: stderr也会转到stdout(已经被redirect到/dev/null
)。 您可以用文件pathreplace&1以保留错误日志,例如:2>/tmp/myLog
-
&
最后意味着: 运行这个命令作为后台任务。
你真的应该尝试使用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-script
inheritance良好的默认值,如果某些东西不符合你的需要,可以在你的脚本中覆盖它。 如果出现问题,可以在source /lib/init/init-d-script
看到详细信息。 强制性的variables是DAEMON
和NAME
。 脚本将使用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替代了可执行文件,所以服务没有正常停止。