我通过putty SSH连接到linux服务器。我尝试将其作为后台进程运行:
$ node server.js &
但是,2.5小时后终端变为非活动状态并且过程终止。无论如何,即使终端断开连接,我仍然可以保持进程有效吗?
修改1
实际上,我尝试了nohup
,但只要关闭Putty SSH终端或拔掉我的互联网,服务器进程就会立即停止。
在Putty有什么我需要做的吗?
编辑2(2012年2月)
有一个node.js
模块forever。它将运行node.js服务器作为守护程序服务。
答案 0 :(得分:1095)
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
&
表示:将此命令作为后台任务运行。 答案 1 :(得分:506)
简单的解决方案(如果您对恢复流程不感兴趣,只是希望它继续运行):
nohup node server.js &
强大的解决方案(允许您重新连接到流程,如果它是交互式的):
screen
然后您可以按Ctrl + a + d分离,然后通过运行screen -r
附加回来
还要考虑屏幕的新选择,tmux。
答案 2 :(得分:137)
你真的应该尝试使用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是条目列表。
答案 3 :(得分:118)
这是一个老问题,但在Google上排名很高。我几乎无法相信最高投票的答案,因为在屏幕会话中运行node.js进程,使用&
或甚至使用nohup
标志 - 所有这些 - 都只是的解决方法。
特别是screen / tmux解决方案,它应该被视为业余解决方案。 Screen和Tmux并不意味着保持进程运行,而是用于多路复用终端会话。当您在服务器上运行脚本并想要断开连接时,这很好。但是对于node.js服务器,您不希望将进程附加到终端会话。这太脆弱了。 为了让事情顺利进行,你需要对这个过程进行守护!
有很多好的工具可以做到。
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
初始化脚本:
我没有详细介绍如何编写init脚本,因为我不是这个主题的专家,这个答案太长了,但基本上它们都是简单的shell脚本,由OS触发事件。您可以阅读有关此here
的更多信息<强>泊坞强>:
只需在带有-d
选项的Docker容器中运行您的服务器,并且voilá,您有一个守护进程的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
希望这可以帮助有人登陆此页面。始终使用适当的工具进行工作。它可以为您节省很多麻烦和数小时的时间!
答案 4 :(得分:24)
另一种解决方案否定了这份工作
$ nohup node server.js &
[1] 1711
$ disown -h %1
答案 5 :(得分:14)
nohup
将允许程序在终端终止后继续。我实际上遇到nohup
阻止SSH会话正确终止的情况,所以你也应该重定向输入:
$ nohup node server.js </dev/null &
根据nohup
的配置方式,您可能还需要将标准输出和标准错误重定向到文件。
答案 6 :(得分:7)
我在我的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"
答案 7 :(得分:7)
Nohup和屏幕为后台运行Node.js提供了很好的解决方案。 Node.js进程管理器(PM2)是一个方便的部署工具。在您的系统上全局安装npm:
npm install pm2 -g
将Node.js应用程序作为守护程序运行:
pm2 start app.js
您可以选择将其链接到Keymetrics.io由Unitech制作的监控SAAS。
答案 8 :(得分:6)
$ disown node server.js &
它将从活动任务列表中删除命令并将命令发送到后台
答案 9 :(得分:5)
您是否阅读过nohup命令?
答案 10 :(得分:3)
使用sysv init在debian上运行命令作为系统服务:
复制骨架脚本并根据您的需要进行调整,可能您需要做的就是设置一些变量。如果某些内容不符合您的需要,您的脚本将继承/lib/init/init-d-script
的精确默认值 - 在脚本中覆盖它。如果出现问题,您可以在来源/lib/init/init-d-script
中查看详细信息。强制变量为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
这就是我为维基媒体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
}
除了设置变量外,我必须重写do_stop_cmd
因为python替换了可执行文件,所以服务没有正常停止。
答案 11 :(得分:3)
除了以上很酷的解决方案之外,我还提到了supervisord和monit工具,这些工具允许启动进程,监控它的存在并在它死亡时启动它。随着&mon;&#39; monit&#39;您还可以运行一些活动检查,例如检查进程是否响应http请求
答案 12 :(得分:3)
对于Ubuntu我使用:
(exec PROG_SH&amp;&gt; / dev / null&amp;)
问候
答案 13 :(得分:0)
试试这个简单的解决方案
cmd &amp;出口