So registrieren Sie einen Agenten bei launchd


13

Ich bin nicht in der Lage einen periodischen Start plant mit launchctl/ launchdauf O X (Leopard). Grundsätzlich kann ich keine Schritt-für-Schritt-Liste mit Anweisungen im Web 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 ich das Skript mit registriert

launchctl load ~/Library/LaunchAgents/sync.plist

Um zu testen, ob es funktioniert, habe ich den Job gestartet :

 launchctl start net.madrat.utils.sync

- Nichts ist passiert. Die manuelle Ausführung des rsyncBefehls im Terminal liefert das erwartete Ergebnis.

Ich bin mir ziemlich sicher, dass der Job korrekt registriert wurde, da beim Versuch, einen nicht vorhandenen Job zu starten, eine Fehlermeldung angezeigt wird (die ich im obigen Befehl nicht erhalten habe).

Was habe ich falsch gemacht?

Antworten:


5

Lingon ist ein gutes GUI-Tool zum Verwalten von launchd. Das Projekt scheint jetzt nicht unterstützt zu werden ... aber es funktioniert definitiv immer noch auf 10.5.x.

Aber zu deinem spezifischen Problem ... hast du es versucht

sudo launchctl list 

Hier erfahren Sie, ob die .plist korrekt ausgeführt wird. Es wird 1 zurückgegeben, wenn der Dämon nicht gestartet wird, und eine '0', wenn es erfolgreich ist. Vielleicht suchen Sie danach.

Immer wenn ich eine '1' sehe, liegt das normalerweise daran, dass ich das Skript an die falsche Stelle gestellt, einen Tippfehler gemacht oder die Berechtigungen falsch eingestellt habe.

Auch .... oft neustarten .. Ich habe gesehen

launchctl start

nicht effektiv sein, wo ein Neustart war ..

Wenn Sie sich Ihre Frage genauer ansehen, warum nicht einfach diesen rsync-Code in ein Bash-Skript einfügen und in das Skript einfügen? /usr/bin/Dann könnten Sie einfach chmod+xdiese Datei erstellen und Ihre .plist vereinfachen das Skript auszulösen, wann immer Sie möchten ....


Danke, Sie haben den Befehl in eine zusätzliche Shell-Datei geschrieben und das hat den Trick gemacht. Es ist jedoch eine sehr unbefriedigende Lösung. Warum funktioniert es nicht, den Befehl direkt aufzurufen? Übrigens launchctl list habe 1 angezeigt, aber erst nachdem ich den Agenten manuell über gestartet habe launchctl start.
Konrad Rudolph

Ich bin nicht positiv, aber ich denke, die launchd .plist-Dateien sind wirklich nur dazu gedacht, 'launch-on-demand'-Kriterien für Daemons zu definieren ... Vielleicht war es nicht sicher, was mit den Argumenten geschehen soll, die Sie in <key> übergeben hatten ProgramArguments </ key>.
CaseyIT

11

Lange Antwort:

Es ist schwierig, mit launchd zu arbeiten, ohne einige Grundprinzipien zu verstehen. Es ist also wahrscheinlich, dass Sie keine Schritt-für-Schritt-Anleitung finden, sie hat so viele Möglichkeiten. Ein guter Schritt ist, den Leitfaden für die ersten Schritte im ADC zu lesen: http://developer.apple.com/macosx/launchd.html

Sie können auch den Manpages lesen launchd, launchctlund die .plist - Dateien Syntax launchd.plist.

Es gibt ein häufiges Missverständnis, wo Sie Ihren Agenten oder Deamon hinstellen sollen. Lassen Sie mich hier einige Informationen dazu veröffentlichen:

  • Wenn Ihr Job ausgeführt werden muss, auch wenn keine Benutzer angemeldet sind, legen Sie ihn in / Library / LaunchDaemons ab.
  • Wenn es nur sinnvoll ist, wenn Benutzer angemeldet sind, legen Sie es in / Library / LaunchAgents oder in die persönlichen LaunchAgents-Verzeichnisse bestimmter Benutzer (~ / Library / LaunchAgents).
  • Platzieren Sie Ihren Job nicht in / System / Library, das 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, kann derzeit nicht getestet werden, aber ich hätte ihn auf festgelegt net.madrat.utils.sync.plist. unloadWenn Sie die Datei bearbeitet haben, kann es auch nützlich sein, zuerst Ihr Deamon zu laden, bevor Sie es laden.


Danke für die Information. Allerdings: (1) Ich habe bereits alle Dokumente gelesen, die Sie oben verlinkt haben, und einige mehr. Nirgendwo steht tatsächlich, wie ein Agent gestartet wird. (Zumindest habe ich es nirgendwo gefunden.) Das wäre in Ordnung, wenn mein intuitiver Ansatz funktionieren würde. (2) Das Ändern des Dateinamens funktioniert ebenfalls nicht. :-( (3) Einige der Informationen sind veraltet. Sie schlagen zum Beispiel den Befehl launchd bashzum Debuggen vor - dies funktioniert jedoch nicht auf Leopard ( launchdkann nicht direkt gestartet werden).
Konrad Rudolph

@Konrad Rudolph: Gern geschehen: :) @Skylarking bekommt einige interessante Punkte: Haben Sie die Prämisse der Akte überprüft? Oder den sudo Befehl benutzt? Ich musste auch manchmal neu starten, damit launchctl richtig funktioniert.
Arko

2

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


0

versuche dies, meine Skripte funktionieren ohne den Programmteil zu verwenden, nur Programmargumente ...

ersetzen

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

mit

    <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

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

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

0

Sie haben eine falsche Sache in Ihrer .plist-Datei und eine zweifelhafte Sache (jeder dieser Punkte wurde in früheren Antworten angesprochen; ich fasse sie hier zusammen).

Du schreibst besser:

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

Das erste Argument im ProgramArgumentsArray ist das auszuführende Programm. Sie haben dies ausgelassen. Wenn der ProgramSchlüssel weggelassen wird, wird standardmäßig das erste Argument von verwendet ProgramArguments. Es ist wahrscheinlich ratsam, dies nur einmal anzugeben.

Da Sie dieses erste Argument ausgelassen, Ihre .plist wird haben rsync aufgerufen (durch Namen gekennzeichnet ist Program), aber rsync ‚erstes Argument‘ gewesen wäre /path/to/folder, und nicht -ar(das laufende Programm wird sehr kurz sichtbar gewesen in psAusgabe, bevor es beendet mit ein Fehler, aber benannt als -ar, der den Inhalt des nullten Arguments darstellt).

Sie müssen nicht haben , um den Pfad zu schließen rsync, aber in dieser Art von Kontext, ist es wahrscheinlich klug , dies zu tun, vertrauen, um zu vermeiden die in PATHgeeigneter Weise eingestellt werden.

Die Dokumentation dazu ist in launchd.plist(5). Beachten Sie, dass in dieser Manpage hervorgehoben wird, dass der Wert des ProgramArgumentsSchlüssels an übergeben wird execvp(3). Es ist die execvpManpage, die die PATH-Suche erklärt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.