我在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)
答案 0 :(得分:0)
Watchman将在参数向量中将文件名列表传递给触发程序,并且json数据将通过其 stdin流提供给它。
您可以将bash脚本更改为:
jq '.'
它应该显示您感兴趣的数据。
我想指出,触发器很难使用和调试,因为它们会记录到值班服务器日志中,并且很难查看。因此,我倾向于推动人们使用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