【问题标题】:How do I get and process the JSON change object?如何获取和处理 JSON 更改对象?
【发布时间】:2019-01-15 22:51:38
【问题描述】:

我在 bash 下的 Linux 上使用 Facebook watchman 来跟踪文件系统 变化。

我对如何获取更改 JSON 对象感到困惑。所有我似乎 get 是已更改文件的列表。我将手表和触发器设置为 下面:

watchman watch /Users/osx/Applications/docker/tests watchman --
trigger /Users/osx/Applications/docker/tests 'file-sync' \
             -- /Users/osx/Applications/docker/filewatcher/file-sync.sh

但是,当我查询过去到 file-sync.sh 脚本的参数时,它 看起来只是一个文本字段而不是 JSON 对象。

我是否需要做任何其他事情才能真正获得所有的详细信息 根上发生的变化?

watchman trigger-list shows the following results: {   "version":
"4.9.0",   "triggers": [
    {
      "command": [
        "/Users/osx/Applications/docker/filewatcher/file-sync.sh"
      ],
      "stdin": [
        "name",
        "exists",
        "new",
        "size",
        "mode"
      ],
      "append_files": true,
      "name": "file-sync",
      "empty_on_fresh_instance": true
    }   ] }

据我了解,这应该给我一个 JSON 对象 名称、存在、新、大小和模式组件。

在系统日志中我可以看到以下内容:

2019-01-15T22:28:49,191: [trigger file-sync
/Volumes/UserData/osx/Applications/docker/tests] input_json: sending
json object to stm

什么是stm?

在系统日志中我可以看到以下内容:

2019-01-15T22:28:49,191: [trigger file-sync 
/Volumes/UserData/osx/Applications/docker/tests] input_json: sending 
`enter code here`json object to stm

在我的 bash 脚本中,我使用 jq 将 JSON 输出转储到标准输出

$(echo jq '.' $1)

【问题讨论】:

    标签: watchman


    【解决方案1】:

    Watchman 将在参数向量中将文件名列表传递给您的触发器程序,并且 json 数据将通过其 stdin 流提供给它。

    你可以改变你的 bash 脚本来做:

    jq '.'
    

    它应该向您显示感兴趣的数据。

    考虑使用 watchman-make 而不是触发器

    我想指出,触发器有点难以使用和调试,因为它们会记录到 watchman 服务器日志并且很难看到。出于这个原因,我倾向于推动人们使用watchman-make,它在前台运行并且清楚地传达正在发生的事情。例如,假设您要触发rsync,您可能可以通过以下方式逃脱:

    cd /Users/osx/Applications/docker/tests && \
       watchman-make -p '**/*' \
          --run /Users/osx/Applications/docker/filewatcher/file-sync.sh
    

    然后file-sync.sh 可以是这样的:

    #!/bin/bash
    rsync /Users/osx/Applications/docker/tests somewhere:else
    

    请注意,这种模式“丢失”了已更改文件的列表,但 rsync 无论如何都会比较目录结构,并且大多数目录树往往很小 足够你不会介意。

    如果您想要或需要使其增量,您可以让您的脚本回调到 watchman;类似这样的内容将列出自上次运行以来更改的文件:

    watchman since /Users/osx/Applications/docker/tests n:file-sync
    

    n:file-sync 是一个命名游标;每次您在自查询中使用它进行查询时,服务器都会代表您跟踪内部时钟数据。你可以在这里找到更多信息:https://facebook.github.io/watchman/docs/clockspec.html

    【讨论】:

    • 非常感谢 Wez 的快速回复。
    • 只需添加 jq '.'我的脚本让我可以访问 JSON 对象。我需要能够捕获所有更改(新的、更新的和删除的),并且还需要一个强大的解决方案,该解决方案具有响应能力,能够处理潜在的大根并尽快对更改采取行动。我喜欢触发器给我即时通知,我可以采取行动。
    • 您提到 watchman-make 会丢失更改列表。看起来 rsync 会再次进行某种形式的更改跟踪。那么不会有重复的工作发生,我会不会失去一些守望者的跟踪能力?
    • 是否有关于可能的方法或用例以及何时使用每种方法的指南?
    • 您能否解释一下更新文件时得到的 JSON:[ { "mode": 0, "new": true, "size": 0, "exists": false, " name": "file.log.sb-f5914475-w3lcsW" }, { "mode": 33188, "new": false, "size": 71, "exists": true, "name": "file.log" }, { "mode": 0, "new": true, "size": 0, "exists": false, "name": "file.log.sb-f5914475-JN2nat" } ]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2022-01-19
    • 2015-09-26
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多