Как получить и обработать объект изменения JSON? - PullRequest
0 голосов
/ 16 января 2019

Я использую сторож Facebook на Linux под Bash для отслеживания файловой системы изменения.

Я не совсем понимаю, как получить объект 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 с компоненты name, существующие, new, size и mode.

В системном журнале я вижу следующее:

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)

1 Ответ

0 голосов
/ 17 января 2019

Сторож передаст список имен файлов вашей триггерной программе в векторе аргументов, и данные 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 является именованным курсором; сервер будет отслеживать данные внутренних часов от вашего имени каждый раз, когда вы запрашиваете их использование в запросе с момента. Вы можете найти больше информации об этом здесь: https://facebook.github.io/watchman/docs/clockspec.html

...