Удаленное развертывание сервера nodejs навсегда

Я пытаюсь развернуть сервер node 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 непосредственно на удаленной машине:

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

person aa333    schedule 12.07.2014    source источник


Ответы (1)


В данном случае переменная окружения немного отличалась между локальным вызовом и вызовом через ssh.

Операция aa333 подтверждает в комментариях:

Пришлось экспортировать NODE_PATH перед запуском остальной части скрипта.

Это позволяет команде node навсегда выполняться через сеанс ssh.


В целом, для крючка я всегда рекомендую:

Добавьте перед git pull:

unset GIT_DIR

Если вы не отключите GIT_DIR, то при выполнении в хуке он все равно будет работать так же, как и в репозитории 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
person VonC    schedule 12.07.2014
comment
Я сделал предложенные вами изменения. Но это не помогло. Сервер по-прежнему не запускается при запуске из ssh, но работает нормально, если скрипт запускается непосредственно на удаленной машине. :( - person aa333; 12.07.2014
comment
@ aa333 затем поместите эхо, чтобы убедиться, что хотя бы хук вызван. - person VonC; 12.07.2014
comment
Да, крючок называется. Сервер останавливается, но не запускается снова, как должен, и если я помещаю эхо в файл, он работает как положено. - person aa333; 12.07.2014
comment
@ aa333 он начнется снова, если вы вообще не сделаете git pull в своем скрипте ловушки? - person VonC; 12.07.2014
comment
Только что попробовал. Наличие или отсутствие git pull не влияет на поведение, как я и подозревал. Я считаю, что это больше связано с навсегда, чем с git, исходя из различий в процессах, запущенных в двух разных случаях. Я поставил их в вопросе, ps-ef | выходы узла grep. - person aa333; 12.07.2014
comment
@aa333 странно, как если бы github.com/nodejitsu/forever создавал подоболочку - person VonC; 12.07.2014
comment
@aa333 аа333 можешь добавить env в крючок? Переменные окружения при запуске скрипта напрямую и при запуске через хуки должны как-то отличаться. - person VonC; 12.07.2014
comment
Может быть. Можете ли вы уточнить, как мне это сделать? О каких переменных env мы говорим? - person aa333; 12.07.2014
comment
@ aa333 Я не знаю, но я прыгал, чтобы получить разницу между двумя выходами env и посмотреть, что отличается. - person VonC; 12.07.2014
comment
Я поставил два env в вопросе. Однако мне ничего не приходит в голову, кроме отсутствия NODE_PATH в ssh env. Но я не уверен, как это влияет на это. - person aa333; 12.07.2014
comment
@ aa333 это может повлиять на выполнение команды узла forever, учтите, что это выполняется в сеансе ssh. - person VonC; 12.07.2014
comment
Я заставил его работать. Пришлось экспортировать NODE_PATH перед запуском остальной части скрипта. Отличный призыв к дифференциации envs. :) - person aa333; 12.07.2014
comment
@aa333 Отлично! Я включил ваш вывод в ответ для большей наглядности. - person VonC; 12.07.2014