Для launchd есть WatchPaths (и для некоторых более конкретных случаев QueueDirectories), который отслеживает изменения на пути. Однако, если это каталог, он будет распознавать только создания / удаления в каталоге, то есть не измененное содержимое содержащихся файлов или любые изменения в любых подкаталогах (см. Здесь).

(Для Linux некоторые хорошие решения, кажется, перечислены здесь.)

Похоже, launchd не в состоянии сделать это, не так ли?

Я мог бы написать свой собственный всегда работающий демон, который расширяет возможности launchd этой функциональности через FSEvents (или kqueue, fam или gamin?).

Или существуют проекты / инструменты, которые могут это сделать?

1 ответ1

0

launchd также должен отслеживать изменения файлов (напрямую) в каталогах в WatchPaths .

Попробуйте сохранить этот список как ~/Library/LaunchAgents/test.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>test</string>
  <key>ProgramArguments</key>
  <array>
    <string>say</string>
    <string>a</string>
  </array>
  <key>WatchPaths</key>
  <array>
    <string>~/Documents/</string>
  </array>
</dict>
</plist>

Затем запустите launchctl load ~/Library/LaunchAgents/test.plist и измените некоторый файл в ~/Documents/ . Программу следует запускать, даже если вы изменили файл без атомарного сохранения или даже если время изменения ~/Documents/ не изменилось.

Обратите внимание, что launchd не отслеживает изменения в подкаталогах просматриваемых каталогов. Расширение Tilde работает в аргументах WatchPaths по умолчанию, но нет способа включить расширение имени файла. (EnableGlobbing применяется только к ProgramArguments .)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .