node.js - 远程nodejs服务器部署永远

标签 node.js git bash ssh forever

我正在尝试通过提交后 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 的调用之间的环境变量略有不同。

Op aa333确认in the comments :

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 存储库中一样运行(而不是你将目录更改为的存储库) )。

例如:

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

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/

相关文章:

node.js - Node : Error in installing npm package

javascript - 沙盒中的 Node.js

bash - 如何覆盖 pushd 和 popd 对 dirs 的自动调用?

node.js - 为什么 "npm install"真的很慢?

node.js - 以 Firebase 用户身份使用 Node.js 访问 Firebase 存储

带有 --subdirectory-filter 的 git filter-branch 删除所有文件

git - 让 git 忽略重命名

ruby-on-rails - 推送到 Heroku 时无法从远程存储库读取(Rails 教程 5)

linux - $SHLVL 不增加 ( echo $SHLVL)

mysql - Bash - mysql 简单选择不起作用,返回 null