launchd A diretiva WatchPaths parou de acionar o job

1

Eu tenho uma configuração personalizada do job launchd para ser executada quando um diretório é alterado. Funciona há algum tempo e, até recentemente (28 de julho de 2011), tem funcionado perfeitamente. Acabei de perceber, no entanto, que o trabalho não está mais sendo acionado por modificações no caminho.

Aqui está o meu plad launchd ( /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>

Eu verifiquei tudo o que consegui pensar:

Houve todos os tipos de atividade no diretório observado recentemente (novos arquivos) que sempre acionaram o trabalho no passado:

$ ls -ld /Volumes/MyDisk/Watch
drwxrwxr-x  93 adminuser  admingrp  3162 Aug  3 16:08 /Volumes/MyDisk/Watch

O trabalho está ativo:

$ sudo launchctl list | grep mydomain
-   0   com.mydomain.myscript

Meu script está no local correto, é executável e funciona perfeitamente quando executado manualmente como o usuário correto. O arquivo de log mostra a última data em que meu script foi executado pelo 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...

Eu fiz uma atualização de software recentemente, então verifiquei o que mudou lá ...

$ 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)

"Atualização de segurança 2011-004" parece muito suspeito, no entanto o artigo kb mencione qualquer coisa sobre launchd.

Alguma sugestão?

Versão do sistema: Mac OS X Server 10.5.8 (9L30)

EDITAR:

Ok, depois de mais algumas pesquisas e pesquisas, descobri o problema. Ocorre (o launchd falha ao monitorar as alterações de caminho) quando a máquina é reinicializada (nesse caso, devido à atualização do software). Enquanto bisbilhotava os logs de sistema rotacionados, encontrei este erro de inicialização que ocorreu apenas alguns segundos após a máquina ser ligada:

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

O problema REAL aqui é o caminho que o launchd deve assistir existe em um volume externo (FireWire), e a tarefa launchd é carregada na inicialização antes que o volume seja montado. Eu pessoalmente consideraria isso um bug launchd, porque eu esperaria que o launchd tratasse o caminho como "não modificado" se ele não existir e simplesmente não executaria o trabalho naquele momento. Em vez disso, o launchd ignora completamente o caminho desse ponto em diante, e o trabalho fica inativo por toda a eternidade.

Então, minha pergunta agora é: o que é uma boa maneira de garantir as montagens de disco antes de dizer ao launchd para monitorar o caminho?

    
por joxl 03.08.2011 / 22:54

1 resposta

0

O disco firewire pode aparecer e desaparecer várias vezes quando o sistema é inicializado - a natureza é que ele é removível, não é?

Com uma pequena extensão, você deve ser capaz de conviver com a maneira como o launchd funciona e a hora em que ele é inicializado (antes de seu disco estar lá). Configurar um segundo script, para

  • monitor / Volumes para alterações
  • se algo mudar e seu script for disparado, verifique o que aconteceu
    • se não foi o seu disco: volte a dormir
    • se foi o seu disco aparecendo: carregue o inspetor de diretórios (o original)
    • se seu disco estiver desaparecendo: descarregue o observador
por 30.09.2011 / 23:44