主管在启动时使用 Meteor settings.json

Supervisor using Meteor settings.json On Launch

如何通过 supervisor 将 --settings json 文件传递​​给流星? 如果我从 home 命令 运行 meteor 运行 命令,一切都很完美:

meteor --settings settings.json

这是我当前的 conf.d 文件:

[program:demo]
command=/usr/local/bin/meteor
directory=/home/username/demo
autostart=true
autorestart=true
environment=
    HOME="/home/username",
    METEOR_SETTINGS="/home/username/demo/settings.json"
stdout_logfile=/home/username/demo.log
stdout_logfiel_maxbytes=50MB
user=username

出现以下错误:

Errors prevented isopacket load:

While loading isopacket `constraint-solver`:
packages/meteor.js:59:11: METEOR_SETTINGS are not valid JSON:
/home/username/demo/settings.json
at packages/meteor.js:59:11
at packages/meteor.js:80:4
at packages/meteor.js:1380:3

settings.json

{
  "private": {
    "init_admin": {
      "userName": "admin",
      "email": "admin@example.com",
      "password": "test123"
    }
  }
}

我很惊讶还没有人回答这个问题。当我试图找出如何将 settings.json 文件放入 METEOR_SETTINGS 并避免主管配置中的语法错误时,我在 google 上发现了你的问题。

因为要回答你的问题,METEOR_SETTINGS环境变量必须包含JSON。所以它必须包含 settings.json 的 JSON 数据,而不是文件名或路径

这有点愚蠢,因为您要将 JSON 数据放入环境变量中。所以基本上 METEOR_SETTINGS="$(cat settings.json|tr -d '\n')" 但是这样做会导致 supervisord 出现问题,因为显然不支持这种语法。

"error: <class 'xmlrpclib.Fault'>, <Fault 92: 'CANT_REREAD: Unexpected end of key/value pairs'>: file: /usr/lib64/python2.7/xmlrpclib.py line: 794"]

我的永久解决方案是用 shell 脚本包装节点命令,这样我就可以在 bash 中正确设置 METEOR_SETTINGS 变量而不是 supervisord。

因此,从您的 supervisord 环境中删除 METEOR_SETTINGS。 (这是我的 Ansible 中的一个示例,所以这就是为什么值用方括号括起来的原因)

[program:pwfrank]                                                                                                                            
directory={{pwfrank_home}}/build/bundle                                                                                                      
command={{pwfrank_home}}/start_node.sh 
environment=                                                                                                                                 
  HOME="{{pwfrank_home}}",                                                                                                                   
  MONGO_URL="{{pwfrank_mongo_url}}",                                                                                                         
  PORT="{{pwfrank_listenport}}",                                                                                                             
  ROOT_URL="{{pwfrank_baseurl}}"                                                                                                             

然后像这样创建一个 shell 脚本。

#!/usr/bin/env bash

export METEOR_SETTINGS="$(cat {{pwfrank_home}}/pwfrank/{{pwfrank_settings_file}} | tr -d '\n')"                                              

/usr/local/bin/meteor node main.js    

这对我有用,但我正在从主管转移到 systemd,因为 systemd 有环境文件,所以我不必使用 shell 脚本来包装节点。

为将来编辑 googlers:我最终意识到只要将 json 数据放在单引号之间,systemd 就可以正常工作。我个人使用 ansible 完成此操作,使用我上面提到的 cat|tr 命令提取 JSON 数据,将其放入一个 ansible 事实,然后在我的 EnvironmentFile 模板中为 systemd 中的 Meteor 服务单元使用该事实。