Как получить и обработать объект изменения 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