我正在尝试通过提交后 Hook 在远程计算机上部署 Node js 服务器,该钩子(Hook)将调用远程计算机上执行实际部署的脚本。
我面临的问题是,如果我在计算机上运行远程脚本,它可以正常工作,但是当我尝试通过 ssh 命令执行相同的脚本时,服务器无法启动。
这就是我的提交后钩子(Hook)的样子:
#!/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时一样:
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 的调用之间的环境变量略有不同。
Had to export
NODE_PATH
before running the rest of the script.
这允许 node command forever运行 ssh session 。
更一般地说,对于钩子(Hook),我总是建议:
在 git pull
之前添加:
unset GIT_DIR
如果你没有取消设置GIT_DIR
,那么,当在钩子(Hook)中执行时,它仍然会像你推送的 git 存储库中一样运行(而不是你将目录更改为的存储库) )。
例如:
- "getting “fatal: not a git repository: '.'” when using post-update hook to execute 'git pull' on another repo "
- "Git - post-receive hook with git pull “Failed to find a valid git directory” "
正如在第二个链接中一样,我肯定会这样做:
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
关于node.js - 远程nodejs服务器部署永远,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24709717/