【问题标题】:Remote nodejs server deployment with forever永远的远程nodejs服务器部署
【发布时间】:2014-09-02 18:52:45
【问题描述】:

我正在尝试通过 post-commit 挂钩在远程机器上部署节点 js 服务器,该挂钩将调用远程机器上执行实际部署的脚本。

我面临的问题是,如果我在机器上运行远程脚本,它可以正常工作,但是当我尝试通过 ssh 命令执行相同的脚本时,服务器无法启动。

这就是我的提交后挂钩的样子:

#!/bin/bash

#Connect to AWS machine and run deploy script
ssh -i ~/Documents/aa-kp-inst1.pem ubuntu@<remote-ip> "sh /home/app/deploy.sh"

#Done
exit 0

非常简单。这就是 deploy.sh 的样子:

#!/bin/bash

#Navigate to server directory
cd /home/app/personal_website/server

#Stop currently running server(s)
forever stop -s 0 >> forever.log

#Pull latest code
unset GIT_DIR
git -C /home/app/personal_website/server pull --quiet

#Restart server
forever start -a -l forever.log -o out.log -e err.log server.js

#End
exit 0

我发现直接运行 deploy.sh 和通过 ssh 运行启动的进程有所不同。

这是我直接在远程机器上运行 deploy.sh 时 ps-ef | grep node 的样子:

ubuntu   14058     1  3 04:26 ?        00:00:00 /usr/bin/nodejs      /usr/lib/node_modules/forever/bin/monitor server.js
ubuntu   14064 14058  2 04:26 ?        00:00:00 /usr/bin/nodejs /home/app/personal_website/server/server.js
ubuntu   14071 10791  0 04:27 pts/0    00:00:00 grep --color=auto node

这是我从 ssh 运行时得到的结果:

ubuntu   13435     1 14 04:19 ?        00:00:00 /usr/bin/nodejs /usr/lib/node_modules/forever/bin/monitor server.js
ubuntu   13444 10791  0 04:19 pts/0    00:00:00 grep --color=auto node

您知道是什么原因造成的吗?为什么从 ssh 运行时只有监控进程启动?

如评论中所问: env直接来自机器:

XDG_SESSION_ID=31
TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=97.83.204.67 58752 22
SSH_TTY=/dev/pts/2
USER=ubuntu
MAIL=/var/mail/ubuntu
PATH=/usr/local/heroku/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=/home
LANG=en_US.UTF-8
NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
SHLVL=1
HOME=/home/ubuntu
LOGNAME=ubuntu
SSH_CONNECTION=97.83.204.67 58752 172.31.7.96 22
LESSOPEN=| /usr/bin/lesspipe %s
XDG_RUNTIME_DIR=/run/user/1000
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv
OLDPWD=/home/exps

env 来自 ssh:

XDG_SESSION_ID=32
SHELL=/bin/bash
SSH_CLIENT=97.83.204.67 58966 22
USER=ubuntu
MAIL=/var/mail/ubuntu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=/home/ubuntu
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/ubuntu
LOGNAME=ubuntu
SSH_CONNECTION=97.83.204.67 58966 172.31.7.96 22
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/printenv

【问题讨论】:

    标签: node.js git bash ssh forever


    【解决方案1】:

    在这种情况下,本地调用和通过 ssh 调用的环境变量略有不同。

    Op aa333 确认in the comments

    在运行脚本的其余部分之前必须导出 NODE_PATH

    这允许node command forever 运行 ssh 会话。


    更一般地说,对于一个钩子,我总是推荐:

    在你的git pull前添加:

    unset GIT_DIR
    

    如果你不取消设置GIT_DIR,那么当在一个钩子中执行时,它仍然会像在你推送的git repo中一样运行(而不是你更改目录的那个)。

    例如:

    就像在第二个链接中一样,我肯定会这样做:

    git --git-dir=/home/app/personal_website/server/.git --work-tree=/home/app/personal_website/server pull --quiet
    

    或者,since git 1.8.5

    git -C /home/app/personal_website/server pull --quiet
    

    【讨论】:

    • 我做了你建议的修改。但这没有帮助。从 ssh 运行时服务器仍然无法启动,但如果脚本直接在远程计算机上运行,​​则运行良好。 :(
    • @aa333 然后放一个回声,以检查是否至少调用了钩子。
    • 是的,钩子被调用了。服务器停止但没有按应有的方式重新启动,如果我将回显放到文件中,它会按预期工作。
    • @aa333 如果您在钩子脚本中根本不执行git pull,它会重新开始吗?
    • 刚刚试过。正如我所怀疑的那样,有或没有 git pull 对行为没有影响。我相信这与永远有关,而不是与 git 有关,因为在两种不同情况下开始的流程不同。我把它们放在了问题中,ps-ef | grep 节点输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2019-05-30
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2019-09-04
    相关资源
    最近更新 更多