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?