Perché il mio task 'launchd' non risponde alle modifiche nei file guardati?

3

Ho un'attività launchd che non si attiva quando un file cambia e non riesco a capire perché non funziona.

Quando carico .plist sotto con

launchctl load /Users/Rax/Library/LaunchAgents/com.crashplan.status.plist

lo script specificato viene eseguito (una volta) e viene eseguito come previsto (posso anche eseguirlo correttamente dalla riga di comando). Ma quando il file sul percorso dell'orologio ( /Library/Logs/CrashPlan/history.log.0 ) cambia, non accade nulla.

Cosa potrebbe mancare che impedisca a questa attività di rispondere al cambio di file?

<?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.crashplan.status</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Rax/Library/Automation/Shell/crashplan_status</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Logs/CrashPlan/history.log.0</string>
    </array>
</dict>
</plist>
    
posta orome 27.11.2013 - 20:32
fonte

2 risposte

2

FWIW L'ho provato qui e sembra che funzioni per me. Ogni volta che aggiungo manualmente qualcosa a /Library/Logs/CrashPlan/history.log.0 lo script è stato attivato.

In quanto tale, questa non è davvero una risposta, ma è più una serie di suggerimenti per il debug di launchd :

Alcuni suggerimenti per la diagnosi di launchd:

1) Utilizza i percorsi stdout e stderr e verifica se qualcosa viene registrato su di essi. Puoi farlo aggiungendo queste righe al tuo file com.crashplan.status.plist .

<key>StandardErrorPath</key>
<string>/tmp/com.crashplan.status.stderr.log</string>
<key>StandardOutPath</key>
<string>/tmp/com.crashplan.status.stdout.log</string>

(Se più persone usano lo stesso Mac, potresti voler usare un percorso diverso da / tmp / ma se sei solo tu allora è buono come un posto qualsiasi.)

2) Con # 1 potresti anche voler regolare il tuo script (/ Users / Rax / Library / Automation / Shell / crashplan_status) per includere informazioni di debug come quando è iniziato e quando è finito. Questo può essere semplice come qualcosa di simile aggiunto nella parte superiore dello script:

echo "$0: started at 'date'"

e qualcosa di simile alla fine

echo "$0: finished at 'date'"

3) Con # 2 potresti anche voler usare qualcosa come terminale-notificatore per mostrarti quando il tuo copione è essere chiamato, almeno fino a quando non superi la fase di debug.

4) Se nessuno di questi aiuti, dovresti controllare lo stato di uscita di qualsiasi comando che stai chiamando in crashplan_status e vedere se quelli stanno uscendo correttamente. Ad esempio, supponiamo che stavi eseguendo echo nel tuo crashplan_status

5) Il tuo ambiente in launchd è diverso dalla tua shell in qualche modo? La cosa migliore è verificata aggiungendo questa riga nella parte superiore del tuo script di avvio:

/usr/bin/printenv | /usr/bin/open -ef

che farà sì che printenv venga inviato allo stdout e i risultati aperti in TextEdit.

Il problema più comune di "ambiente" in cui mi imbatto non sta avendo il PATH $ impostato correttamente per launchd. Di solito è impostato nei file init di shell come .bashrc ed ereditato da qualsiasi script di shell eseguito da Terminal, ma non sarà per launchd .

Puoi vedere il percorso che launchd sta utilizzando:

launchctl getenv PATH

Se desideri impostarlo, puoi impostarlo

launchctl setenv PATH

per esempio, per il mio sistema sarebbe:

launchctl setenv /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

Se non desideri ricordare di impostarlo ogni volta che avvii il computer, puoi aggiungerlo a /etc/launchd.conf aggiungendo una riga:

setenv PATH /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

ovviamente modificalo in modo che corrisponda al tuo sistema. Inoltre, non sorprenderti se /etc/launchd.conf non esiste sul tuo sistema. Potrebbe essere necessario crearlo. Per farlo, ti consiglio un semplice:

sudo pico -w /etc/launchd.conf

e quando hai finito di modificare, premi control + X e segui le istruzioni per salvare le modifiche.

    
risposta data 01.12.2013 - 08:33
fonte
0

So che questo è un vecchio post, ma dato che non ha una risposta reale, invierò semplicemente un suggerimento. Hai ancora il problema o è stato risolto finalmente? Altrimenti potrei avere un indizio mentre ho sperimentato lo stesso problema.

Nel terminale, controlla se il tuo file guardato ha esteso argomenti usando questo comando:

ls -l@

Se il tuo file ha argomenti estesi come questo:

com.apple.quarantine    32

prova e digita questo comando per rimuovere argomenti estesi (usa sudo se necessario):

xattr -d -r com.apple.quarantine /Library/Logs/CrashPlan/history.log.0

nel tuo caso ...

Sembra che i percorsi di avvio di launchd ignorino i file con argomento esteso in quarantena ...

Spero che possa aiutarti.

    
risposta data 27.11.2014 - 22:11
fonte

Leggi altre domande sui tag