So registrieren Sie einen Agenten bei launchd

So registrieren Sie einen Agenten bei launchd

launchctlIch kann mit / unter OS X (Leopard) keinen periodischen Start planen launchd. Im Grunde kann ich im Internet keine Schritt-für-Schritt-Anleitung finden und der intuitive Ansatz funktioniert nicht.

Die sync.plistDatei:

<?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>

Ich habe dieses Skript in den Pfad eingefügt ~/Library/LaunchAgents.

Als nächstes habe ichEingetragendas Skript mit

launchctl load ~/Library/LaunchAgents/sync.plist

Um schließlich zu testen, ob es funktioniert,gestartetdie Arbeit:

 launchctl start net.madrat.utils.sync

– Nichts passiert. Die manuelle Ausführung des rsyncBefehls im Terminal führt zum erwarteten Ergebnis.

Ich bin ziemlich sicher, dass der Job korrekt registriert wurde, denn wenn ich versuche, einen nicht vorhandenen Job zu starten, erhalte ich eine Fehlermeldung (die ichnichtget im obigen Befehl).

Was habe ich falsch gemacht?

Antwort1

Lingonist ein gutes GUI-Tool zur Verwaltung von launchd. Das Projekt scheint derzeit nicht mehr unterstützt zu werden ... aber es funktioniert definitiv noch unter 10.5.x.

Aber zu Ihrem spezifischen Problem ... haben Sie versucht

sudo launchctl list 

Dies zeigt Ihnen, ob die .plist korrekt gestartet wird. Es wird 1 zurückgegeben, wenn der Daemon nicht gestartet wird, und eine 0, wenn er erfolgreich ist. Vielleicht sollten Sie danach suchen.

Wenn ich eine „1“ sehe, liegt das normalerweise daran, dass ich das Skript an der falschen Stelle eingefügt, einen Tippfehler gemacht oder die Berechtigungen falsch festgelegt habe.

Außerdem ... Neustart oft .. Ich habe gesehen

launchctl start

nicht wirksam sein, wenn ein Neustart durchgeführt wurde.

Und wenn ich mir Ihre Frage genauer ansehe: Warum fügen Sie den Rsync-Code nicht einfach in ein Bash-Skript ein und fügen ihn ein /usr/bin/? Dann könnten Sie einfach chmod+xdiese Datei verwenden und Ihre .plist vereinfachen, um das Skript jederzeit auszuführen ...

Antwort2

Lange Antwort:

Es ist schwierig, mit launchd zu arbeiten, ohne einige grundlegende Prinzipien zu verstehen. Daher ist es wahrscheinlich, dass Sie keine Schritt-für-Schritt-Anleitung finden, da es so viele Möglichkeiten bietet. Ein guter Tipp ist, sich die Einführungsanleitung zum ADC anzusehen:http://developer.apple.com/macosx/launchd.html

Sie können auch die Manpages für launchdund launchctldie Syntax der .plist-Dateien lesen launchd.plist.

Es besteht häufig ein Missverständnis darüber, wo man seinen Agenten oder Dämon platzieren soll, deshalb möchte ich hier einige Informationen dazu geben:

  • Wenn Ihr Job ausgeführt werden muss, auch wenn keine Benutzer angemeldet sind, legen Sie ihn in /Library/LaunchDaemons ab.
  • Wenn es nur nützlich ist, wenn Benutzer angemeldet sind, legen Sie es in /Library/LaunchAgents oder in den persönlichen LaunchAgents-Verzeichnissen bestimmter Benutzer (~/Library/LaunchAgents) ab.
  • Legen Sie Ihren Job nicht in /System/Library ab, da dieser für vom System bereitgestellte Daemons reserviert ist.
~/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.

Kurze Antwort:

Der Name Ihrer plist-Datei ist möglicherweise falsch. Ich kann es gerade nicht testen, aber ich hätte ihn auf gesetzt net.madrat.utils.sync.plist. Wenn Sie die Datei bearbeitet haben, kann es auch sinnvoll sein, zuerst unloadIhren Daemon zu laden.

Antwort3

Ich kann keine Dokumentation finden, dass dies tatsächlich Standardverhalten ist, aber es scheint, dass launchd absolute Pfade in plist-Dateien erfordert. Versuchen Sie es /usr/bin/rsyncstattdessen. Funktioniert bei mir!

Antwort4

Versuchen Sie, diese Schlüssel zu Ihrer plist-Datei hinzuzufügen

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

verwandte Informationen