CLI Phonegap запускается из сеанса SSH, но не из сценария bash

Я нахожусь в процессе настройки сервера Ubuntu 14.04 для автоматизации сборки гибридных приложений Android с помощью CLI Phonegap. Написав все соответствующие сценарии, я столкнулся с довольно странной проблемой: когда я подключаюсь к своему серверу по SSH, я могу запустить сценарий и успешно выполнить все команды Phonegap в сеансе интерактивной оболочки. Однако каждая попытка запустить те же самые команды в автоматизированном сценарии, который запускается каким-либо другим событием, сгенерированным посетителем, терпит неудачу. Чтобы определить проблему, я свел ее к простому эксперименту, который я описываю ниже.

Шаг 1. Напишите сценарий запуска, pgtest в /etc/init.d

#! /bin/bash 
source ~/.nvm/nvm.sh;
nvm use stable;
cd /home;
ls >> /tmp/ls;
which node >> /tmp/node;
which git >> /tmp/git;
which phonegap >> /tmp/pgp;
phonegap -v >> /tmp/pgpv 2>/tmp/pgpe;

Пояснения

  • Я запускаю NVM, чтобы использовать стабильную (4.1.1.) версию Node + NPM.
  • Я хочу убедиться, что мой пакетный файл действительно выполняется, поэтому я делаю ls /home и передаю его вывод в файл /tmp/ls.
  • Я хочу быть уверен, что node, git и phonegap действительно доступны, поэтому я передаю вывод из which node|git|phonegap в файлы в папке /tmp.
  • Нет смысла все усложнять, поэтому я выдаю самую простую из команд Phonegap, phonegap -v, чтобы сообщить номер текущей версии. Любые ошибки, которые могут возникнуть при этом, передаются в файл /tmp/pgpe.
  • ls - список папок для папки /home присутствует и верен.

Шаг 2. Убедитесь, что pgtest выполняется последним ln -s /etc/init.d/pgtest /etc/rc2.d/S04PGTest

Объяснение. Я хочу, чтобы этот скрипт запускался только после того, как все остальное на моем сервере запустится

Со всем этим я перезагрузился на сервере и проверил содержимое папки /tmp. Мои выводы

  • node, git и pgp указывают на расположение Node, Git и Phonegap.
  • pgpv, который должен содержать номер версии Phonegap, ПУСТОЙ.
  • pgpe присутствует и НЕ пусто
  • /tmp/ls присутствует и заполняется списком папок /home, как и раньше

Последнее означает, что система обнаружила ошибку при попытке выполнить phonegap -v. Вот содержимое файла pgpe.

путь.js: 8

throw new TypeError('Путь должен быть строкой. Получено ' +

^

TypeError: Путь должен быть строкой. Получено неопределенное

в assertPath (path.js:8:11)

в Object.posix.join (path.js:477:5)

на Объект.

(/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config/global.js:17:28)

в Module._compile (module.js:434:26)

в Object.Module._extensions..js (module.js:452:10)

в Module.load (module.js:355:32)

в Function.Module._load (module.js:310:12)

в Module.require (module.js:365:17)

при необходимости (module.js:384:17)

на Объект. (/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config.js:9:13)

Теперь вот что любопытно. Если я удалю папку /tmp и выполню /etc/init.d/pgtest в сеансе интерактивной оболочки, я получу следующие результаты.

  • /tmp/node, /tmp/git /tmp/pgp присутствуют и верны
  • /tmp/pgpvreports 5.3.6 - номер текущей версии Phonegap
  • /tmp/pgpe EMPTY , т. е. об ошибках не сообщается.
  • Просто убедитесь, что переменная PATH внутри вашего скрипта такая же, более длинная, которую вы видите в diff, а затем повторите попытку автоматически.

Очевидно, что в интерактивной среде оболочки bash есть что-то, чего нет, когда я запускаю автоматический сценарий — в данном случае при запуске, но это также происходит, когда я запускаю процесс через автоматический сценарий любым другим способом.

Со всем этим я приближаюсь к установлению причины проблемы. Однако мои знания о том, как работают эти системы, меня подводят. В чем разница между интерактивной оболочкой и той, с которой сталкивается мой автоматизированный сценарий? Как мне интерпретировать ошибки, о которых сообщается в /tmp/pgpe? Что мне делать, чтобы исправить их?

Я был бы очень благодарен любому, кто мог бы поставить меня на правильный путь здесь.


Отредактируйте в свете предложений @Eduardo. Я взял два набора окружений (интерактивное и init.d). Результаты выполнения DIFF (интерактивного и init.d) можно найти в этой скрипте. Несколько менее доступный дамп результата DIFF показан ниже.

Я почти уверен, что пробовал это в своих собственных экспериментах до публикации этого вопроса, но, следуя предложению @Eduardo ниже, я попытался вставить

Я использую NVM для управления узлом, поэтому я уверен, что система знает, где найти nvm.sh.

вверху скрипта - чуть ниже строки source ~/.nvm.... После перезагрузки результат был тот же: пустой /tmp/pgpv и те же ошибки в /tmp/pgpe.

EXPORT PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Единственное, что я здесь изменил — замаскировал имя хоста и IP-адрес клиента SSH.


person DroidOS    schedule 03.11.2015    source источник
comment
Это может быть проблемой: pgpv 2›, так как он содержит пробел и знак «большой».   -  person 4ae1e1    schedule 03.11.2015
comment
@ 4ae1e1 ваш комментарий, вероятно, полезен, но не для меня. Как я уже упоминал, я достиг предела своего понимания bash. Что же означает запись этого человека и какое отношение она имеет к тому, что я наблюдаю?   -  person Lajos Arpad    schedule 03.11.2015
comment
@ЛайосАрпад. Ммм... я где-то подразумевал в своем вопросе, что мой скрипт не работает и мне нужна помощь с ним? _1_ не имеет никакого отношения к рассматриваемой проблеме.   -  person DroidOS    schedule 03.11.2015
comment
Вы спросили, в чем разница между интерактивной оболочкой и той, с которой сталкивается мой автоматизированный скрипт? И я ответил на это. Кроме этого, я не заинтересован в отладке вашего скрипта. Я не специалист по JS.   -  person DroidOS    schedule 03.11.2015
comment
@ 4ae1e1 - не знаю, где я предложил вам отлаживать мой скрипт...   -  person 4ae1e1    schedule 03.11.2015
comment
Как вы думаете, что _1_ разрешает в этом сценарии _2_, когда он запускается при запуске системы? У какого пользователя есть соответствующая конфигурация телефонной связи для того, что вы хотите делать? Вы устанавливаете phonegap/node/etc. соответствующие настройки в файлах инициализации оболочки вашего обычного пользователя? (Возможно, установка настроила их автоматически.)   -  person DroidOS    schedule 03.11.2015
comment
@EtanReisner - NVM и Phonegap в моей установке можно запускать только от имени пользователя root. Какому пользователю разрешается ~ при запуске из сценария перезагрузки init.d. Я изменил строку _3_ на _4_ и перезагрузился. На этот раз файл _5_ был пуст — когда я выполняю _6_ из интерактивной оболочки, я получаю листинг, содержащий _7_. _8_ до сих пор сообщает _9_. Я не устанавливаю настройки PG, узла и т. д. самостоятельно. Я просто запускаю NVM, и он запускает Nod и т. д. Это дает ценную подсказку, но я не понимаю, как ее интерпретировать или решить проблему.   -  person Etan Reisner    schedule 09.11.2015
comment
Run from ~ init.d почти наверняка не расширится до чего-нибудь полезного. Не используйте его. Используйте явный путь. Также пожалуйста используйте форматирование кода (инструмент cd /home) для блоков ввода, чувствительных к пробелам, а не инструмент цитирования.   -  person DroidOS    schedule 11.11.2015
comment
Спасибо. Я уже пробовал флаг init.d без каких-либо изменений в результатах. Я только что попробовал ваше второе предложение. Он только что сообщил ~.   -  person Etan Reisner    schedule 11.11.2015


Ответы (1)


Вероятно, я бы также определил переменные HOME и NVM*. В качестве теста я бы создал сценарий test.sh в том же каталоге phonegap со следующим содержимым:

И пусть ваш сценарий будет таким:

#!/bin/bash
set > /tmp/env_vars.log

#!/bin/bash
set > /tmp/env_vars.log
. Интерактивная оболочка bash поставляется с источниками
#!/bin/bash 
export TERM=linux
export USER=root
export HOME=/root
export NVM_DIR=/root/.nvm
export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
export NVM_RC_VERSION=
export PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
source ~/.nvm/nvm.sh
nvm use stable
cd /home
ls > /tmp/ls
which node > /tmp/node
which git > /tmp/git
which phonegap > /tmp/pgp
phonegap -v > /tmp/pgpv 2>/tmp/pgpe;
test.sh
s или _3_s, в зависимости от того, является ли это оболочкой входа в систему или нет.

#!/bin/bash 
export TERM=linux
export USER=root
export HOME=/root
export NVM_DIR=/root/.nvm
export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
export NVM_RC_VERSION=
export PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
source ~/.nvm/nvm.sh
nvm use stable
cd /home
ls > /tmp/ls
which node > /tmp/node
which git > /tmp/git
which phonegap > /tmp/pgp
phonegap -v > /tmp/pgpv 2>/tmp/pgpe;
test.sh
person Eduardo    schedule 10.11.2015
comment
Итак, попробуйте ввести полный путь к phonegap в этой командной строке env, посмотрим, что ответит. - person DroidOS; 11.11.2015
comment
см. редактирование моего вопроса выше. Результаты сравнения доступны в более удобочитаемой форме в этой скрипте. - person Eduardo; 11.11.2015
comment
Я попробовал настройку пути (я уверен, что действительно делал это в какой-то момент в своих собственных экспериментах) с точно таким же результатом. _1_ пусто, а _2_ сообщает об ошибках, указанных в моем вопросе. - person DroidOS; 11.11.2015
comment
Как вы установили PATH? Вы его экспортировали? Как? - person DroidOS; 11.11.2015
comment
спасибо за все ваши усилия. Я предполагаю, что принятие вашего ответа гарантирует, что награда автоматически станет вашей. - person Eduardo; 11.11.2015
comment
--- /home/env.inter 11-11-2015 08:30:40.314172560 +0000 +++ /home/env.auto 11-11-2015 08:32:55.240906000 +0000 @@ -1,48 +1 ,38 @@ BASH=/bin/bash BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() -BASH_ARGC=() -BASH_ARGV=() +BASH_ARGC=([ 0]="1") +BASH_ARGV=([0]="start") BASH_CMDS=() BASH_LINENO=([0]="0") -BASH_SOURCE=([0]="/etc/init.d/ pgtest") +BASH_SOURCE=([0]="/etc/rc2.d/S04pgtest") BASH_VERSINFO=([0]="4" 1="3" [2]="11" [3]="1" [4]="выпуск" [5]="x86_64-pc-linux-gnu") BASH_VERSION= '4.3.11(1)-релиз' DIRSTACK=() EUID=0 GROUPS=() -HOME=/root HOSTNAME=example.com HOSTTYPE=x86_64 IFS=$' \t\n' -LANG=en_US.UTF- 8 -LESSCLOSE='/usr/bin/lesspipe %s %s' -LESSOPEN='| /usr/bin/lesspipe %s' -LOGNAME=root -LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do =01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30 ;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arj=01; 31:.taz=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz =01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31: .gz=01;31:.lz=01;31:.xz=01;31:.bz2=01;31:.bz=01;31:< /em>.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01; 31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar= 01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31: .rz=01;31:.jpg=01;35:.jpeg=01;35:.gif=01;35:.bmp=01;35:< em>.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35 :.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg= 01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:. mpg=01;35:.mpe g=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35: .nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01 ;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl =01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.axv=01;35:.anx=01;35:.ogv=01;35: .ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.mid=00; 36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg =00;36:.ra=00;36:.wav=00;36:.axa=00;36:.oga=00;36: .spx=00;36:.xspf=00;36:' MACHTYPE=x86_64-pc-linux-gnu -MAIL=/var/mail/root -NVM_DIR=/root/.nvm -NVM_IOJS_ORG_MIRROR=https://iojs.org/dist -NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist -NVM_RC_VERSION= OPTERR=1 OPTIND=1 OSTYPE=linux-gnu -PATH=/opt/android/platform-tools:/opt/android/tools:/opt/android:/usr/local/sbin:/usr/local/bin:/usr/sbin :/usr/bin:/sbin:/bin:/usr/games:/usr/local/games +PATH=/sbin:/usr/sbin:/bin:/usr/bin PIPESTATUS=([0]="0 ") -PPID=4801 +PPID=911 +PREVLEVEL=N PS4='+ ' -PWD=/etc/init.d +PWD=/ +RUNLEVEL=2 SHELL=/bin/bash SHELLOPTS=braceexpand:hashall:interactive- комментарии -SHLVL=3 -SSH_CLIENT='nn.nn.nn.nn nnnn nnnn' -SSH_CONNECTION='nn.nn.nn.nn nnnn nn.nn.nn.nn nnnn' -SSH_TTY=/dev/pts/0 - TERM=xterm +SHLVL=1 +TERM=linux UID=0 -USER=root -XDG_RUNTIME_DIR=/run/user/1000 -XDG_SESSION_ID=5 +UPSTART_EVENTS=уровень запуска +UPSTART_INSTANCE= +UPSTART_JOB=rc _=n +previous=N + уровень выполнения=2 - person DroidOS; 15.11.2015