Configura launchd

3

Ho un plist di lancio in ~/Library/LaunchAgents progettato per eseguire uno script situato a ~/writout.sh ogni giorno alle 10:30:

<?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>local.jackson.testwrite.plist</string>
    <key>Program</key>
    <string>/Users/jacksonkearl/writeout.sh</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>10</integer>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</dict>
</plist>

Lo script è:

#!/bin/bash
echo "it works" >> log.txt

Tuttavia, niente viene scritto all'ora desiderata.

Sono necessari dei passi per avvisare launchd al nuovo agente? O in quale altro modo inizio il processo?

    
posta Jackson 28.11.2015 - 16:37
fonte

3 risposte

3

Devi caricare l'agente di lancio in launchd.

  1. Apri terminale
  2. Digita cd ~/Library/LaunchAgents
  3. Digita launchctl load -w local.jackson.testwrite.plist (assumendo che questo sia il nome del tuo file plist)

Questo caricherà e abiliterà permanentemente il tuo plist. Puoi verificare se è caricato con launchctl list

    
risposta data 28.11.2015 - 17:00
fonte
3

Per eseguire il debug di questo, dovrai abilitare il reindirizzamento.

<key>StandardErrorPath</key>
<string>/tmp/local.job.err</string>
<key>StandardOutPath</key>
<string>/tmp/local.job.out</string>

Ho anche inserito la mia versione del tuo script in /usr/local/bin e ho verificato che fosse eseguibile con chmod a+x

L'errore che ottengo è:

/usr/local/bin/writeout.sh: line 3: log.txt: Permission denied

Pertanto, potresti voler inviare il tuo comando echo a $TMPDIR o a un'altra posizione scrivibile. Sembra che il percorso predefinito per launchd non sia quello a cui un utente può scrivere (e probabilmente per una buona ragione).

Ma fare launchd / launchctl a mano è difficile. Consiglio vivamente di utilizzare uno strumento come LaunchControl o Lingon . Forniscono l'aiuto e l'automazione che mi rende molto meglio con questi script.

Usando Launch Control - mi ha permesso di ricreare rapidamente il tuo lavoro, di avere tutti i tipi di suggerimenti utili e, cosa più importante, di suggerire il reindirizzamento per eseguire il debug della condizione di uscita / errore dello script.

Con un clic, ha aggiunto le righe sopra al mio file plist e mi è stato offerto di salvarlo e ricaricare il lavoro per me.

    
risposta data 28.11.2015 - 17:03
fonte
2

Hai diversi errori nel tuo file plist:

<key>Label</key>
<string>local.jackson.testwrite.plist</string>

diventa

<key>Label</key>
<string>local.jackson.testwrite</string>

e il plist manca un

</plist>

alla fine. Il plist dovrebbe finalmente assomigliare a questo:

<?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>local.jackson.testwrite</string>
    <key>Program</key>
    <string>/Users/jacksonkearl/writeout.sh</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>10</integer>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</dict>
</plist>

Per caricare LaunchAgent, inserire:

launchctl load /Users/jacksonkearl/Library/LaunchAgents/local.jackson.testwrite.plist

Per caricare il LaunchAgent, inserire in modo permanente

launchctl load -w /Users/jacksonkearl/Library/LaunchAgents/local.jackson.testwrite.plist
    
risposta data 28.11.2015 - 17:09
fonte

Leggi altre domande sui tag