我正在设置一个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;
说明的
ls /home
并将其输出传递给/tmp/ls
文件。which node|git|phonegap
的输出传输到/tmp
文件夹中的文件。phonegap -v
来报告当前的版本号。执行此操作时可能发生的任何错误都会通过管道传输到文件/tmp/pgpe
。 第2步 - 确保pgtest
最后一次运行
ln -s /etc/init.d/pgtest /etc/rc2.d/S04PGTest
解释 - 我只希望在我服务器上的所有其他有机会启动后运行
完成所有这些后,我重新启动了服务器并检查了/tmp
文件夹的内容。我的发现
ls
- 显示/home
文件夹的文件夹列表并更正。node
,git
和pgp
指向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
我很确定在发布这个问题之前我已经在我自己的实验中尝试了这个,但是按照@ 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
中报告相同的错误。
答案 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