Come registrare un agente con launchd


14

Non riesco a pianificare un lancio periodico con launchctl/ launchdsu OS X (Leopard). Fondamentalmente, non riesco a trovare un elenco dettagliato di istruzioni sul Web e l'approccio intuitivo non funziona.

Il sync.plistfile:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

Ho inserito questo script nel percorso ~/Library/LaunchAgents.

Successivamente, ho registrato lo script utilizzando

launchctl load ~/Library/LaunchAgents/sync.plist

Alla fine, per provare che funziona, ho iniziato il lavoro:

 launchctl start net.madrat.utils.sync

- Non è successo niente. L'esecuzione manuale del rsynccomando nel terminale produce il risultato previsto.

Sono abbastanza sicuro che il lavoro sia stato registrato correttamente perché se provo ad avviare un lavoro inesistente, ricevo un messaggio di errore (che non ho ricevuto nel comando sopra).

Che cosa ho fatto di sbagliato?

Risposte:


5

Lingon è un buon strumento di interfaccia grafica per gestire launchd. Il progetto sembra non essere supportato ora ... ma sicuramente funziona ancora su 10.5.x.

Ma per il tuo problema specifico ... hai provato

sudo launchctl list 

Questo ti dirà se il .plist sta funzionando correttamente. Restituirà 1 se il demone non è in fase di lancio e uno "0" se ha esito positivo. Forse cercalo.

Ogni volta che vedo un '1' di solito è perché ho messo lo script nel posto sbagliato, ho fatto un refuso o ho impostato le autorizzazioni in modo errato.

Inoltre .... riavvia spesso .. Ho visto

launchctl start

non essere efficace in caso di riavvio ..

Inoltre, esaminando la tua domanda più da vicino ... perché non mettere semplicemente quel codice rsync in uno script bash ... e incollarlo /usr/bin/..... Quindi potresti semplicemente chmod+xquel file .... e semplificare il tuo .plist licenziare quella sceneggiatura quando vuoi ...


Grazie, inserendo il comando in un file di shell aggiuntivo e avviando ciò ha funzionato. È una soluzione molto insoddisfacente però ... perché il richiamo del comando non funziona direttamente? A proposito, launchctl list ha visualizzato 1, ma solo dopo aver avviato l'agente manualmente utilizzando launchctl start.
Konrad Rudolph,

Non sono positivo, ma penso che i file .plist di launchd siano realmente intesi solo per definire i criteri di 'avvio su richiesta' per i demoni ... Forse non era sicuro di cosa fare con gli argomenti che avevi passato in <key> ProgramArguments </ key>.
CaseyIT,

11

Risposta lunga:

È difficile lavorare con launchd senza comprendere alcuni principi di base. Quindi è probabile che non troverai alcuna istruzione dettagliata, ha così tante capacità. Una buona mossa è quella di andare alla guida introduttiva sull'ADC : http://developer.apple.com/macosx/launchd.html

È inoltre possibile leggere le pagine man launchd, launchctle la sintassi dei file .plist, launchd.plist.

C'è un frequente malinteso su dove collocare il tuo agente o il tuo deamon, quindi lasciami dare qualche informazione al riguardo qui:

  • Se il tuo lavoro deve essere eseguito anche quando nessun utente ha effettuato l'accesso, inseriscilo in / Library / LaunchDaemons.
  • Se è utile solo quando gli utenti hanno effettuato l'accesso, inseriscilo in / Library / LaunchAgents o nelle directory personali LaunchAgents di utenti specifici (~ / Library / LaunchAgents).
  • Non inserire il tuo lavoro in / Sistema / Libreria, riservato ai demoni forniti dal sistema.
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

Risposta breve:

Il nome del tuo file plist potrebbe essere errato, non posso testarlo in questo momento ma lo avrei impostato su net.madrat.utils.sync.plist. Può anche essere utile innanzi tutto il unloadtuo deamon prima di caricarlo se hai modificato il file.


Grazie per le informazioni. Tuttavia: (1) ho già letto tutti i documenti che hai linkato sopra e molti altri. Da nessuna parte si dice in realtà come avviare un agente. (Almeno, non l'ho trovato da nessuna parte.) Sarebbe perfetto se il mio approccio intuitivo funzionasse. (2) Anche la modifica del nome del file non funziona. :-( (3) alcune delle informazioni non sono aggiornate. Ad esempio, suggeriscono il comando launchd bashper il debug - ma questo non funziona su Leopard ( launchdnon può essere avviato direttamente).
Konrad Rudolph

@Konrad Rudolph: Prego: :) @Skylarking ottiene alcuni punti interessanti: hai controllato la premissione del file? O hai usato il comando sudo? A volte dovevo anche riavviare per far funzionare correttamente launchctl.
Arko,

3

Non riesco a trovare la documentazione che questo sia in realtà un comportamento standard, ma sembra che launchd richieda percorsi assoluti nei file plist. Quindi prova /usr/bin/rsyncinvece. Per me va bene!


0

prova questo, i miei script funzionano senza usare la parte del programma, solo args programma ...

sostituire

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

con

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

0

prova ad aggiungere queste chiavi al tuo file plist

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

0

Hai una cosa sbagliata nel tuo file .plist e una cosa dubbia (ognuno di questi punti è stato toccato nelle risposte precedenti; li sto riunendo qui).

Faresti meglio a scrivere:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

Il primo argomento ProgramArgumentsdell'array è il programma da eseguire: lo avresti omesso. Se la Programchiave viene omessa, per impostazione predefinita viene utilizzato il primo argomento di ProgramArguments; è probabilmente saggio specificarlo solo una volta.

Poiché hai omesso questo primo argomento, il tuo .plist avrà invocato rsync (attraverso il nome Program), ma il 'primo argomento' di rsync sarebbe stato /path/to/folder, e non -ar(il programma in esecuzione sarebbe stato molto brevemente visibile psnell'output, prima di uscire con un errore, ma chiamato come -ar, che è il contenuto dell'argomento zeroth).

Non è necessario includere il percorso verso rsync, ma in questo tipo di contesto, è probabilmente prudente farlo, per evitare di dover fare affidamento sull'impostazione PATHappropriata.

La documentazione per questo è in launchd.plist(5). Si noti che quella manpage sottolinea che il valore della ProgramArgumentschiave viene passato a execvp(3). È la execvpmanpage che spiega la ricerca del PERCORSO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.