远程nodejs服务器部署永远

我试图通过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的进程有所不同。

以下是ps-ef | grep node 当我在远程计算机上直接运行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 

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

Op aa333 在评论中证实:

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

这允许节点命令永远运行通过SSH会话。


更一般地说,对于一个钩子,我总是build议:

在你的git pull之前添加:

 unset GIT_DIR 

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

例如见:

  • “ 变得”致命的:不是一个混帐存储库:'。'“当使用后更新钩执行'git拉'在另一个回购 ”
  • “ Git – 后接收钩与git拉”无法find一个有效的git目录“ ”

就像在第二个环节中一样,我可以肯定地做一个:

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

或者, 因为git 1.8.5 :

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