У меня есть пользовательская настройка запуска, запускаемая при изменении каталога. Он работает уже довольно давно, и до недавнего времени (28 июля 2011 г.) он работал отлично. Я только что понял, однако, что работа больше не вызвана изменениями пути.
Вот мой стартовый список (/Library/LaunchDaemons/com.mydomain.myscript.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>com.mydomain.myscript</string>
<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>20</integer>
<key>Program</key>
<string>/path/to/myscript.sh</string>
<key>RunAtLoad</key>
<false/>
<key>StandardErrorPath</key>
<string>/Library/Logs/myscript.log</string>
<key>StandardOutPath</key>
<string>/Library/Logs/myscript.log</string>
<key>ThrottleInterval</key>
<integer>60</integer>
<key>UserName</key>
<string>adminuser</string>
<key>WatchPaths</key>
<array>
<string>/Volumes/MyDisk/Watch</string>
</array>
</dict>
</plist>
Я дважды проверил все, что мог придумать:
В наблюдаемом каталоге недавно были все виды деятельности (новые файлы), которая всегда вызывала работу в прошлом:
$ ls -ld /Volumes/MyDisk/Watch
drwxrwxr-x 93 adminuser admingrp 3162 Aug 3 16:08 /Volumes/MyDisk/Watch
Работа активна:
$ sudo launchctl list | grep mydomain
- 0 com.mydomain.myscript
Мой сценарий находится в правильном месте, является исполняемым и отлично работает при запуске вручную как правильный пользователь. Файл журнала показывает последнюю дату, когда мой скрипт был запущен launchd:
$ cat /Library/Logs/myscript.log
<snip>
[2011-07-27 08:04:27] running...
[2011-07-27 08:06:33] running...
[2011-07-27 08:07:33] running...
[2011-07-27 20:58:15] running...
[2011-07-28 21:10:18] running...
Я недавно выполнил обновление программного обеспечения на машине, поэтому я проверил, что там изменилось ...
$ cat /Library/Logs/Software\ Update.log
<snip>
2011-06-15 08:13:31 -0400: Installed "Java for Mac OS X 10.5 Update 9" (1.0)
2011-07-29 15:39:24 -0400: Installed "Java for Mac OS X 10.5 Update 10" (1.0)
2011-07-29 15:40:55 -0400: Installed "Safari" (5.0.6)
2011-07-29 15:45:46 -0400: Installed "Security Update 2011-004" (1.0)
2011-07-29 15:47:10 -0400: Installed "iTunes" (10.4)
«Обновление безопасности 2011-004» выглядит очень подозрительно, однако в статье о kb ничего не говорится о launchd.
Какие-либо предложения?
Версия системы: Mac OS X Server 10.5.8 (9L30)
РЕДАКТИРОВАТЬ:
Хорошо, после еще некоторого возни и исследования я обнаружил проблему. Это происходит (launchd не может отслеживать изменения пути), когда машина перезагружается (в этом случае из-за обновления программного обеспечения). Просматривая журналы вращающейся системы, я обнаружил эту ошибку запуска, которая произошла всего через несколько секунд после включения машины:
Aug 1 07:37:12 localhost kernel[0]: Darwin Kernel Version 9.8.0: ...
<snip>
Aug 1 07:37:17 localhost com.apple.launchd[1] (com.mydomain.myscript): Path monitoring failed on "/Volumes/MyDisk/Watch": No such file or directory
Настоящая проблема здесь в том, что путь, который должен запускать startd, должен существовать на внешнем (FireWire) томе, а задание launchd загружается при запуске до монтирования тома. Я лично считаю, что это ошибка launchd, потому что я ожидаю, что launchd будет трактовать путь как "неизмененный", если он не существует, и просто не будет запускать задание в этот момент. Вместо этого launchd полностью игнорирует путь с этого момента, и задание бездействует вечность.
Итак, мой вопрос сейчас: каков хороший способ убедиться, что диск монтируется перед тем, как запустить launchd для мониторинга пути?