【发布时间】:2014-01-28 17:40:41
【问题描述】:
我在从厨师食谱运行 npm install 时遇到问题。当我从命令行运行它时,它会在不到一分钟的时间内完成,只有一些与package.json no repository field 相关的警告(应该是无害的)。但是当我从厨师运行它时,它会挂起最后一行输出回到命令行,如下所示:
* execute[npm-install-app] action run
配方中的这个资源块是什么:
execute "npm-install-app" do
cwd "#{home}/#{prefix}#{app}"
command "npm --registry #{priv['url']}:#{priv['port']}#{priv['path']} install --cache #{home}/.npm --tmp #{home}/tmp > npm-run.log 2>&1"
user node['nodejs']['user']
action :run
end
其中#{home} 扩展为/home/nodejs,用户为nodejs。
如您所见,我将输出重定向到一个文件到一个带有> npm-run.log 2>&1 的文件。输出文件获取写入它的 npm install 命令的输出(与命令行不同),最后出现的是这样的:
-- a bunch of 200's and 304s, like this --
npm http 304 http://my.private.npm.amazonaws.com/registry/_design/app/_rewrite/esprima
kerberos@0.0.3 install /home/nodejs/my-app/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos
(node-gyp rebuild 2> builderror.log) || (exit 0)
kerberos 是我们依赖的一个模块的依赖项,但我们自己并没有使用 kerberos。我从其他来源收集到 npm 正在运行 node-gyp 以编译在 npm 服务器上不可用的应用程序版本。
它将保持该状态 2 小时,直到 Chef shellout 注册超时并显示致命错误。 ps -e 将在 chef-client 仍在运行时显示 npm 仍在运行,并且中断 chef-client 将导致 npm 从进程列表中消失,这表明 npm 至少仍然认为它仍在做有意义的工作。 (附带说明,当我遇到连接问题时,我倾向于问this question。这个npm install 很可能是另一个问题的根本问题,但我认为它们值得单独考虑.)
编辑: 使用-l debug 运行chef-client 会将少量信息添加到/var/log/chef/client.log 文件中,这基本上确认npm install 命令是最后一个资源在挂起之前执行:
[2014-01-09T22:49:28+00:00] INFO: Processing execute[npm-install-app] action run (my-app::default line 111)
[2014-01-09T22:49:28+00:00] DEBUG: Platform ubuntu version 12.04 found
我认为 || 是对的吗? (exit 0) 是否让 Chef ShellOut 提供程序检测到成功退出?有什么我可以做的吗?
编辑 2: Chef 刚刚在设置了 -l debug 的情况下运行超时,但仍然只获得有关超时的日志信息。
[2014-01-10T00:26:56+00:00] ERROR: execute[npm-install-app] (my-app::default line 111) had an error: Mixlib::ShellOut::CommandTimeout: command timed out:
---- Begin output of npm --registry http:my.private.npm.amazonaws.com:5984/registry/_design/app/_rewrite install --cache /home/nodejs/.npm --tmp /home/nodejs/tmp > npm-run.log 2>&1 ----
STDOUT:
STDERR:
---- End output of npm --registry http://ec2-54-221-190-191.compute-1.amazonaws.com:5984/registry/_design/app/_rewrite install --cache /home/nodejs/.npm --tmp /home/nodejs/tmp > npm-run.log 2>&1 ----
但是!大约 5 分钟后,另一个节点刚刚成功完成,并且在 npm-run.log 文件中有此内容:
> kerberos@0.0.3 install /home/nodejs/spicoli-authorization/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos
> (node-gyp rebuild 2> builderror.log) || (exit 0)
make: Entering directory `/home/nodejs/spicoli-authorization/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build'
SOLINK_MODULE(target) Release/obj.target/kerberos.node
SOLINK_MODULE(target) Release/obj.target/kerberos.node: Finished
COPY Release/kerberos.node
make: Leaving directory `/home/nodejs/spicoli-authorization/node_modules/mongoose-q/node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build'
我想不出为什么会有如此巨大的性能差异,两台服务器都运行在亚马逊小型 ec2 实例上。也许工作服务器和损坏服务器上的主目录之间存在权限差异......我会从这个角度进行调查。
【问题讨论】:
-
您找到解决方案了吗?我没有看到任何明显会导致这种情况的东西。
-
@sethvargo 我还没有取得任何进展。我目前正在尝试找到一种从
node-gyp rebuild进程中捕获更多日志的方法,但their documentation 没有提及任何相关内容。我可能需要深入研究源代码,或者尝试一些别名魔法。
标签: node.js npm chef-infra freeze chef-recipe