Как получить и обработать объект изменения JSON?

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

Я запутался в том, как получить объект изменения JSON. Все, что мне кажется, это список измененных файлов. Я установил часы и триггер, как показано ниже:

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 ответ

Сторож передаст список имен файлов вашей триггерной программе в векторе аргументов, и данные 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

Другие вопросы по тегам