Kann jemand ein gutes Tutorial empfehlen, um (von Grund auf) einen Cron-Style-Startjob zu schreiben?


17

Ich habe einen ziemlich einfachen Job, den ich jede Stunde ausführen möchte. Ich könnte es mit machen cron, aber ich dachte, ich würde das nutzen, um etwas zu lernen launchd, da ich gute sachen darüber höre. Ich habe die man launchd.plist Seite als Referenz, aber ich bin auf der Suche nach etwas, das sich mehr mit dem Erstellen eines Beispieljobs befasst.


Dies sollte in Stackoverflow verschoben werden.
Philip Regan

5
@Philip Regan Ich habe darüber nachgedacht, aber es ist nicht wirklich viel Programmierung für mich. Wenn ich a gefragt hätte cron Frage, wäre superuser.com nicht der richtige Ort? Schon seit launchd ist Apples Version von cron (und auch daemontoolsund möglicherweise andere Dinge), dachte ich, dies sei meine beste Option.
Hank Gay

Sie können es auch in ein Automator-Skript einfügen und von iCal aus ausführen - wenn es so läuft, wie Sie es möchten
Mark

In einer witzigen Ironie musste ich drei Jahre später selbst einen Cron / Launchd-Prozess implementieren und stellte fest, dass ich diese Frage erneut in einem ganz anderen Licht betrachtete. Stack Overflow hat eine gemischte Meinung darüber, was mit gestarteten Fragen zu tun ist, aber sie mögen diese Fragen wirklich nicht. Ich fand die ganze Situation amüsant. +1
Philip Regan

Antworten:


13

launchd läuft Daemons ( /Library/LaunchDaemons oder /System/Library/LaunchDaemons ) als root ausführen, unabhängig davon, ob Benutzer angemeldet sind oder nicht. Agenten starten ( /Library/LaunchAgents/ oder ~/Library/LaunchAgents/ ) werden ausgeführt, wenn ein Benutzer als dieser Benutzer angemeldet ist. Sie können setuid nicht verwenden, um den Benutzer zu ändern, der das Skript in Daemons ausführt. Das /System Das Verzeichnis ist für Mac OS X-Aufgaben reserviert launchd plists entweder in die /Library oder der ~/Library Ordner, wie es Sinn macht.

Der erste Schritt ist also festzustellen, ob Sie einen Agenten oder einen Daemon erstellen.

Der zweite Schritt besteht darin, Ihre .plist Datei. Sie können GUI-basierte Programme wie verwenden Lingon um dabei zu helfen oder verwenden Sie einfach Ihren bevorzugten Texteditor:

Eine Probe .plist zum stündlichen Ausführen eines Skripts ( StartInterval oder StartIntervalCalendar sind die Schlüssel, die wir wollen - StartInterval damit ein Gegenstand jeden passiert x Sekunden, StartIntervalCalendar für eine bestimmte Zeit und / oder ein bestimmtes Datum. Sehen 126907 bei SuperUser für ein Beispiel, das ich mit StartCalendarInterval gemacht habe):

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

Modifiziere den .plist Zeigen Sie bei Bedarf auf Ihr Skript und ggf. auf Argumente (Argumente befinden sich in separaten Zeilen), und speichern Sie die Datei mit demselben Namen wie der Label-Wert, jedoch mit .plist Am Ende. (zum Beispiel, local.my-mac.flickrstats würde gespeichert werden als local.my-mac.flickrstats.plist ). Wenn Sie das noch nicht getan haben, verschieben Sie es .plist Datei an /Library/LaunchDaemons bei der Erstellung eines Daemons (läuft die ganze Zeit) oder zu ~/Library/LaunchAgents (nur du bist eingeloggt) oder /Library/LaunchAgents (Jeder Benutzer ist angemeldet).

Zum Starten des Jobs, den Sie ausführen möchten launchctl nach Bedarf, um die Datei zu laden. Für Artikel in /Library, Sie sollten sudo verwenden: zum Beispiel sudo launchctl load -w /PATH/TO/PLIST

Beachten Sie auch die folgenden Fragen zum Super User: Starten Sie den Befehl als root , Laden Sie einen systemweiten Daemon , und Wie bekomme ich ein Skript, das jeden Tag ausgeführt wird?


4

Ich weiß, es ist kein gut Tutorial, aber Sie könnten einen Blick auf die Programmierhandbuch für Daemons und Services von Apple, das einen Abschnitt zum Planen von zeitgesteuerten Jobs enthält.

Ich weiß, es ist kein vollständiges Tutorial, aber damit können Sie die Grundlagen von verstehen launchd.

Es enthält auch ein Beispiel für a crond Aufgabe:

<?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>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>

Ich habe heruntergestimmt, weil Sie zugegeben haben, dass die Ressource nicht das ist, wonach ich gefragt habe, und es kam mir ein bisschen RTFM vor. Leider kann ich es nicht, es sei denn, die Frage wurde bearbeitet (sie war zu lang), und ich habe noch nicht genug Vertreter, um sie zu bearbeiten. Könnten Sie etwas optimieren? Vielen Dank.
Hank Gay

@Hank Gay: Danke für deinen Kommentar. Ich habe auch meine Antwort bearbeitet.
Studer


2

Ich weiß, dass Sie nach einem Tutorial gesucht haben, aber bei der Gelegenheit kommt jemand hierher, um nach einem Werkzeug zu suchen, mit dem er Launchd-Einträge erstellen / bearbeiten kann. Ich habe das schon früher verwendet: Lingon (Quellschmiede)

Es wird nicht mehr aktiv weiterentwickelt, aber was da ist, funktioniert (und beinhaltet natürlich auch die Quelle usw.). Ich habe es auf Snow Leopard verwendet, um Sicherungen in der Amazon-Cloud usw. zu planen.


Lingon ist jetzt im App Store, ist also immer noch aktiv, nur nicht kostenlos, siehe & lt; peterborgapps.com/lingon & gt;
Mark

Die Appstore-Version wurde durch die Richtlinienanforderungen von Apple lahmgelegt. Die vorkompilierte SourceForge-Version funktioniert einwandfrei - obwohl das modale Dialogfeld zum Speichern, das mich zum Abmelden oder Neustarten auffordert, um den Daemon zu aktivieren, nicht geschlossen werden kann. Ich musste das Programm über das Menü beenden (nicht das Beenden erzwingen) und überprüfen, ob die Datei ordnungsgemäß gespeichert wurde. In dieser Datei verkrüppelte Auslöser und Verzeichnisauslöser werden nicht unterstützt und es ist auch nicht möglich, etwas zu erstellen, das mit der AppStore-Version als Root ausgeführt wird.
marfarma
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.