1

У меня есть пользовательская настройка запуска, запускаемая при изменении каталога. Он работает уже довольно давно, и до недавнего времени (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 для мониторинга пути?

1 ответ1

0

Диск FireWire может появляться и исчезать несколько раз при загрузке системы - это естественно, что он является съемным, не так ли?

С небольшим расширением вы сможете жить так, как работает launchd, и временем, когда он загружается (рано, до того, как ваш диск появится). Настройте второй скрипт, чтобы

  • монитор / тома для изменений
  • если что-то меняется, и ваш скрипт запускается, проверьте, что случилось
    • если это был не твой диск: иди снова спать
    • если появился ваш диск: загрузите наблюдатель каталога (ваш оригинальный)
    • если ваш диск исчезает: выгрузите наблюдателя

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