Phonegap CLI从SSH会话运行,但不是从bash脚本

时间:2015-11-03 09:27:58

标签: bash cordova automation phonegap-cli

我正在设置一个Ubuntu 14.04服务器,以使用Phonegap CLI自动化混合Android应用程序构建。编写了所有相关脚本后,我遇到了一个相当奇怪的问题 - 当我通过SSH连接到我的服务器时,我可以运行脚本并在我的交互式shell会话中成功运行所有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来管理Node,所以我确保系统知道在哪里找到nvm.sh
  • 我正在启动NVM以使用稳定(4.1.1。)版本的Node + NPM
  • 我想确保我的批处理文件实际上正在执行,因此我ls /home并将其输出传递给/tmp/ls文件。
  • 我想确保node,git和phonegap实际可用,因此我将which node|git|phonegap的输出传输到/tmp文件夹中的文件。
  • 使事情变得复杂的一点,所以我发出最简单的Phonegap命令,phonegap -v来报告当前的版本号。执行此操作时可能发生的任何错误都会通过管道传输到文件/tmp/pgpe

第2步 - 确保pgtest最后一次运行     ln -s /etc/init.d/pgtest /etc/rc2.d/S04PGTest

解释 - 我只希望在我服务器上的所有其他有机会启动后运行

完成所有这些后,我重新启动了服务器并检查了/tmp文件夹的内容。我的发现

  • ls - 显示/home文件夹的文件夹列表并更正。
  • nodegitpgp指向Node,Git和Phonegap的位置
  • pgpv,其中应包含Phonegap版本号, EMPTY
  • pgpe存在且为空

最后暗示系统在尝试执行phonegap -v时遇到错误。以下是pgpe

的内容
  

path.js:8

     

抛出新的TypeError(' Path必须是一个字符串。收到' +

     

^

     

TypeError:Path必须是字符串。收到未定义的

     

在assertPath(path.js:8:11)

     

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

     

at Object。

     

(/根/ .nvm /版本/节点/ V4.1.1 / LIB / node_modules / PhoneGap的/ node_modules / PhoneGap的建造/ LIB /普通/配置/ global.js:17:28)

     

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

     

at 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)

     

at require(module.js:384:17)

     

at Object。   (/root/.nvm/versions/node/v4.1.1/lib/node_modules/phonegap/node_modules/phonegap-build/lib/common/config.js:9:13)

现在这是一件好奇的事。如果我清除/tmp文件夹并在交互式shell会话中发出/etc/init.d/pgtest,我会得到以下结果

  • /tmp/ls出现并填充了之前的/home文件夹列表
  • /tmp/node/tmp/git /tmp/pgp出现并更正
  • /tmp/pgpv报告5.3.6 - 当前的Phonegap版本号
  • /tmp/pgpe EMPTY ,即没有报告错误

显然,当我运行自动脚本时,交互式bash shell环境不存在 - 在这种情况下启动时,但是当我通过任何其他方式通过自动脚本触发进程时也会发生这种情况。

有了这一切,我正在接近解决问题的原因。但是,我对这些系统如何工作的了解让我失望。交互式shell环境与自动脚本遇到的环境有什么区别?我该如何解释/tmp/pgpe中报告的错误?我该怎么做才能修复它们?

我非常感谢能够让我走上正确轨道的人。

根据@ Eduardo的建议进行编辑。我抓住了两套环境(interactive& init.d)。执行DIFF(交互式vs init.d)的结果可以在this fiddle中找到。 DIFF结果的可访问性稍差的转储如下所示

  

--- /home/env.inter 2015-11-11 08:30:40.314172560 +0000   +++ /home/env.auto 2015-11-11 08:32:55.240906000 +0000   @@ -1,48 +1,38 @@    BASH = /斌/庆典    BASHOPTS = cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:源路径    BASH_ALIASES =()   -BASH_ARGC =()   -BASH_ARGV =()   + BASH_ARGC =([0] =&#34; 1&#34)   + BASH_ARGV =([0] =&#34;开始&#34)    BASH_CMDS =()    BASH_LINENO =([0] =&#34; 0&#34)   -BASH_SOURCE =([0] =&#34; /etc/init.d/pgtest")   + BASH_SOURCE =([0] =&#34; /etc/rc2.d/S04pgtest")    BASH_VERSINFO =([0] =&#34; 4&#34; 1 =&#34; 3&#34; [2] =&#34; 11&#34; [3] =&#34; 1& #34; [4] =&#34;发布&#34; [5] =&#34; x86_64-pc-linux-gnu&#34;)    BASH_VERSION =&#39; 4.3.11(1)-release&#39;    DIRSTACK =()    EUID = 0    组=()   -home = /根    HOSTNAME = example.com    HOSTTYPE = x86_64的    IFS = $&#39; \吨\ n&#39;   -lang =的en_US.UTF-8   -LESSCLOSE =&#39; / usr / bin / lesspipe%s%s&#39;   -LESSOPEN =&#39; | / usr / bin / lesspipe%s&#39;   -LogName =根   -LS_COLORS =&#39; RS = 0:DI = 01; 34:LN = 01; 36:MH = 00:PI = 40; 33:SO = 01; 35:做= 01; 35:BD = 40; 33 ; 01:CD = 40; 33; 01:或= 40; 31; 01:SU = 37; 41:SG = 30; 43:CA = 30; 41:TW = 30; 42:流量= 34; 42:第一= 37; 44:前= 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:。广州= 01; 31: .lz = 01; 31: .xz = 01; 31:操作.bz2 = 01; 31: .BZ = 01; 31: .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: .pbm = 01; 35:< /em>.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:文件.mpeg = 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:。室= 01; 35: .rmvb = 01; 35: .FLC = 01; 35:的.avi = 01; 35:< EM> .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:&#39;    MACHTYPE = x86_64的-PC-Linux的GNU   -mail =的/ var /邮件/根   -NVM_DIR = /根/ .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 /安卓/工具中:/ opt / Android的:在/ usr / local / sbin中:在/ usr / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr /本地/游戏   + PATH = / sbin目录:/ usr / sbin目录:/ bin中:在/ usr / bin中    PIPESTATUS =([0] =&#34; 0&#34)   -PPID = 4801   + PPID = 911   + PREVLEVEL = N    PS4 =&#39; +&#39;   -Pwd =的/ etc / init.d中   + PWD = /   + RUNLEVEL = 2    SHELL = /斌/庆典    SHELLOPTS = braceexpand:hashall:交互式评论   -SHLVL = 3   -SSH_CLIENT =&#39; nn.nn.nn.nn nnnn nnnn&#39;   -SSH_CONNECTION =&#39; nn.nn.nn.nn nnnn nn.nn.nn.nn nnnn&#39;   -SSH_TTY =的/ dev / PTS / 0   -TERM = xterm的   + SHLVL = 1   + TERM = Linux的    UID = 0    - 用户=根   -XDG_RUNTIME_DIR = /运行/用户/ 1000   -XDG_SESSION_ID = 5   + UPSTART_EVENTS =运行级别   + UPSTART_INSTANCE =   + UPSTART_JOB = RC    _ =正   +先前= N   +运行级别= 2

我在这里更改的唯一内容是 - 屏蔽了主机名和SSH客户端IP地址。

我很确定在发布这个问题之前我已经在我自己的实验中尝试了这个,但是按照@ Eduardo的建议在下面我试着坚持

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...行的正下方。稍后重新启动结果仍然相同:空/tmp/pgpv并在/tmp/pgpe中报告相同的错误。

1 个答案:

答案 0 :(得分:1)

只需确保将脚本中的PATH变量设置为相同的,更长的变量,您可以在差异上看到,然后自动重试。

我可能还会定义HOME和NVM *变量。作为测试,我在phonegap的同一目录下创建一个test.sh脚本,其中包含以下内容:

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

并将您的脚本设为:

#!/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