远程nodejs服务器部署永远

时间:2014-07-12 04:37:58

标签: node.js git bash ssh forever

我试图通过提交后挂钩在远程计算机上部署节点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
来自ssh的

env

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

1 个答案:

答案 0 :(得分:2)

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

Op aa333确认in the comments

  

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

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


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

git pull

之前添加
unset GIT_DIR

如果你没有取消设置GIT_DIR,那么,当在一个钩子中执行时,它仍将像你在你推送的git仓库中那样运行(而不是你将目录更改为的那个)。 / p>

参见例如:

与第二个链接一样,我确实会这样做:

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