Wie stelle ich eine Aufgabe so ein, dass sie von Zeit zu Zeit ausgeführt wird?

84

Wie kann ich alle 30 Minuten ein Skript ausführen lassen? Ich gehe davon aus, dass es für verschiedene Betriebssysteme unterschiedliche Möglichkeiten gibt. Ich benutze OS X.

Stalepretzel
quelle

Antworten:

136

Verwenden Sie einfach launchd . Es ist ein sehr leistungsfähiges Startsystem und mittlerweile das Standard-Startsystem für Mac OS X (die aktuelle OS X-Version würde ohne es nicht einmal booten). Für diejenigen , die nicht vertraut sind launchd(oder mit O X im Allgemeinen), ist es wie eine Kreuzung zwischen init, cron, at, SysVinit ( init.d) inetd, upstartund systemd. Ausleihen von Konzepten für all diese Projekte, aber auch für Dinge, die Sie anderswo vielleicht nicht finden.

Jeder Dienst / jede Aufgabe ist eine Datei. Der Speicherort der Datei hängt von den Fragen ab: "Wann soll dieser Dienst ausgeführt werden?" und "Welche Berechtigungen benötigt der Dienst?"

Systemaufgaben gehen zu

/Library/LaunchDaemons/

ob sie ausgeführt werden sollen, unabhängig davon, ob ein Benutzer am System angemeldet ist oder nicht. Sie werden mit "root" -Berechtigungen gestartet.

Wenn sie nur ausgeführt werden sollen, wenn ein Benutzer angemeldet ist, gehen sie zu

/Library/LaunchAgents/

und wird mit den Berechtigungen des Benutzers ausgeführt, der sich gerade angemeldet hat.

Wenn sie nur ausgeführt werden sollen, wenn Sie angemeldet sind, gehen sie zu

~/Library/LaunchAgents/

Dabei ist ~ Ihr HOME-Verzeichnis. Diese Aufgabe wird mit Ihren Berechtigungen ausgeführt, als hätten Sie sie selbst über die Befehlszeile oder durch Doppelklicken auf eine Datei im Finder gestartet.

Beachten Sie, dass es auch existiert /System/Library/LaunchDaemonsund /System/Library/LaunchAgentswie üblich alles unter /SystemOS X verwaltet wird. Sie dürfen dort keine Dateien ablegen, Sie dürfen dort keine Dateien ändern, es sei denn, Sie wissen wirklich, was Sie tun. Durch Herumspielen im Ordner "Systeme" kann Ihr System unbrauchbar werden (in einen Zustand versetzen, in dem es sich sogar weigert, erneut zu starten). Dies sind die Verzeichnisse, in denen Apple die launchdAufgaben platziert, die Ihr System während des Startvorgangs zum Laufen bringen, die Dienste nach Bedarf automatisch starten, Systemwartungsaufgaben ausführen usw.

Für jede launchdAufgabe gibt es eine Datei im Plist-Format. Es sollte eine umgekehrte Domainnamen-Notation haben. ZB können Sie Ihre Aufgabe benennen

com.example.my-fancy-task.plist

Diese Liste kann verschiedene Optionen und Einstellungen haben. Das Schreiben einer Hand ist nicht optimal. Möglicherweise möchten Sie das kostenlose Tool Lingon zum Erstellen Ihrer Aufgaben verwenden. Früher war dieses Tool kostenlos, jetzt kostet es 5 US-Dollar im App Store und 10 US-Dollar als Nicht-App-Store-Version (die Nicht-App-Store-Version ist viel leistungsfähiger, und wenn Sie bereits vorhaben, ernsthaft dafür zu bezahlen, besorgen Sie sich den Nicht-App-Store Ausführung). Wenn jemand ein vergleichbares Tool kennt, das Freeware oder Open Source ist, schreibe mir eine Zeile in den Kommentaren und ich werde dieses eher empfehlen (ich möchte hier nicht für kommerzielle Software werben).

Nur als Beispiel könnte es so aussehen

<?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.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

Dieser Agent führt das Shell-Skript /usr/local/bin/my-script.sh alle 1800 Sekunden (alle 30 Minuten) aus. Sie können die Aufgabe auch an bestimmten Daten / Zeiten ausführen lassen (im Grunde kann launchd alles tun, was cron kann) oder Sie können sogar "OnDemand" deaktivieren, wodurch launchd den Prozess dauerhaft laufen lässt (wenn er beendet wird oder abstürzt, wird launchd ihn sofort neu starten). . Sie können sogar einschränken, wie viele Ressourcen ein Prozess verwenden darf (wie bereits erwähnt, zeigt Lingon all diese Einstellungen in einer schönen Benutzeroberfläche an).

Update: Obwohl OnDemandes weiterhin unterstützt wird, ist es veraltet. Die neue Einstellung wird benannt KeepAlive, was viel sinnvoller ist. Es kann einen booleschen Wert haben. In diesem Fall ist es genau das Gegenteil von OnDemand(Festlegen, dass es falsesich so verhält, als ob es OnDemandist, trueund umgekehrt). Die großartige neue Funktion ist, dass sie anstelle eines booleschen auch einen Wörterbuchwert haben kann. Wenn es einen Wörterbuchwert hat, haben Sie einige zusätzliche Optionen, die Ihnen eine genauere Kontrolle über die Körnung ermöglichen, unter welchen Umständen die Aufgabe am Leben erhalten werden soll. Beispielsweise wird es nur so lange am Leben gehalten, wie das Programm mit einem Exit-Code von Null beendet wurde, nur solange eine bestimmte Datei / ein bestimmtes Verzeichnis auf der Festplatte vorhanden ist, nur wenn eine andere Aufgabe ebenfalls aktiv ist oder nur wenn das Netzwerk gerade aktiv ist.

Sie können Aufgaben auch manuell über die Befehlszeile aktivieren / deaktivieren:

launchctl <command> <parameter>

Der Befehl kann Laden oder Entladen sein, um eine Liste zu laden oder erneut zu entladen. In diesem Fall ist der Parameter der Pfad zur Datei. Oder der Befehl kann start oder stop sein, um eine solche Aufgabe einfach zu starten oder zu stoppen. In diesem Fall ist der Parameter die Bezeichnung (com.example.my-fantasie-task). Es gibt auch andere Befehle und Optionen.

Weitere Informationen finden Sie in der Apple-Dokumentation zum Plist-Format und zum launchctlBefehlszeilentool (beachten Sie, dass Sie die OS X-Version oben auswählen können, da das Format / die Optionen zwischen verschiedenen OS X-Versionen variieren).

Mecki
quelle
Was ist, wenn ich als Benutzer möchte, dass etwas ausgeführt wird, auch wenn ich nicht angemeldet bin? Ist das möglich oder muss ich den Administrator bitten, etwas in / Library / LaunchDaemons abzulegen?
Mark Baker
@Mark: Ja, Ihr Administrator müsste dies tun, und die Schlüssel für Benutzername und Gruppenname müssten in der .plist-Datei entsprechend festgelegt werden.
Steve Folly
Beachten Sie auch, dass OnDemand für Leopard und darüber hinaus zugunsten des KeepAlive-Schlüssels veraltet ist. man launchd.plist für weitere Details.
Steve Folly
1
LaunchControl soma-zone.com/LaunchControl ist sehr nützlich, es eine unbegrenzte Testversion hat, so weit ich es gegen die lizenzierte Version keine Einschränkungen sind zu berichten.
BaneOfSerenity
1
@MaciekRek StartCalendarIntervalmit einem Array von zwei Wörterbüchern, sowohl mit dem Schlüssel Minuteals auch mit dem Wert einmal 00und einmal, 30würde genau das tun, was Sie angefordert haben. Bitte stellen Sie Fragen in Zukunft als Fragen, nicht als Kommentare, dann kann ich Ihnen auch das endgültige Wörterbuch zeigen (das kann ich in einem Kommentar nicht tun). Auf dieser Seite dreht sich alles um Fragen. Wenn Sie jemanden auf die Frage hinweisen möchten, veröffentlichen Sie den Link zur Frage als Kommentar, nicht jedoch die Frage selbst.
Mecki
46

Sie können den sehr praktischen Plist-Generator verwenden: http://launched.zerowidth.com/ (Sie müssen nichts kaufen…)

es werden Ihnen ein Shell - Einzeiler einen neuen geplanten Auftrag mit der bereits empfohlen registrieren launchd

Kosmotaurus
quelle
11

Unter MacOSX haben Sie mindestens die folgenden Optionen:

  • Wiederkehrender iCal-Alarm mit der Aktion "Skript ausführen"
  • gestartet
  • cron ( link1 , link2 )

Aus persönlicher Erfahrung ist cron am zuverlässigsten. Als ich getestet habe, hatte launchd eine Reihe von Fehlern und Macken. iCal-Alarme werden nur ausgeführt, wenn Sie angemeldet sind (dies ist jedoch möglicherweise etwas, das Sie bevorzugen).

Bruno De Fraine
quelle
7

Wie Mecki betonte, wäre Launchd der richtige Weg. Es gibt eine GUI-Oberfläche für launchd namens Lingon , die Sie möglicherweise überprüfen möchten, anstatt die launchd-Dateien manuell zu bearbeiten:

Lingon ist eine grafische Benutzeroberfläche zum Erstellen von Konfigurationsdateien für Mac OS X Leopard 10.5.

[snip ...]

Das Bearbeiten einer Konfigurationsdatei ist in dieser Version einfacher als je zuvor und verfügt über zwei verschiedene Modi. Grundmodus mit den gängigsten Einstellungen in einer sehr einfachen Benutzeroberfläche und Expertenmodus, in dem Sie alle Einstellungen entweder direkt im Text hinzufügen oder über ein Menü einfügen können.

Jay
quelle
4

MAC OS verfügt über ein Automator- Tool, das dem von Task Scheduler in Windows entspricht. Mit Automator können Sie Aufgaben täglich planen und die Aufgabe mit einem wiederkehrenden Kalenderereignis verknüpfen, um Skripts täglich zu einer bestimmten Zeit auszuführen. Verweisen Sie auf den Link , um Skripte unter Mac OS täglich auszuführen

Jlearner
quelle
Zumindest in macOS Catalina (10.15.x) konnte ich über Automator keine Möglichkeit finden, Aufgaben im Kalender zu planen. Ich hatte viel bessere Ergebnisse mit Lingon (siehe die anderen Antworten, die als Schnittstelle zum Start erwähnt werden).
Calvinf
2

Für Apple-Skripte habe ich einen speziellen iCal-Kalender eingerichtet und verwende Alarme, um sie regelmäßig auszuführen. Für Befehlszeilentools verwende ich launchd.

Mike Heinz
quelle
1

Zu Ihrer Information: Während ich die Siplizität vermisse, gehört Cron unter OS X der Vergangenheit an. Es war ein Wachhund auf Panther. Seit Tiger wurde es gestartet. Wenn Sie also Leopard Cron verwenden, ist dies keine Option.


quelle
0

Mit cron können Sie Aufgaben planen.

crontab -e

Ein Job wird im folgenden Format angegeben.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

Beispiel:

0 12 * * *  cd ~/backupfolder && ./backup.sh

Sobald Sie Ihre Cron-Aufgaben installiert haben, können Sie mit crontab -l Ihre Aufgaben auflisten.

crontab -l

Wenn Sie mehr über Cron-Zeitplanausdrücke erfahren möchten, können Sie darauf zugreifen

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

UnchartedWorks
quelle