如何获取和处理JSON更改对象?

时间:2019-01-15 22:51:38

标签: watchman

我在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

但是,当我查询文件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
    }   ] }

据我了解,这应该给我一个带有 名称,存在,新的,大小和模式的组件。

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

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输出转储到stdout

$(echo jq '.' $1)

1 个答案:

答案 0 :(得分:0)

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

您可以将bash脚本更改为:

jq '.'

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

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

我想指出,触发器很难使用和调试,因为它们会记录到值班服务器日志中,并且很难查看。因此,我倾向于推动人们使用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 since /Users/osx/Applications/docker/tests n:file-sync

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