Soll ich / etc / crontab bearbeiten oder crontab -e als root ausführen?

43

Ich richte regelmäßige Systemwartungsaufgaben ein, die als root ausgeführt werden müssen. Ich plane, die Cron-Variante zu verwenden, die standardmäßig in Ubuntu 14.04 LTS enthalten ist.

Ich sehe den vorherigen Administrator (der seitdem das Unternehmen verlassen hat), der / etc / crontab direkt bearbeitet hat. Ich verstehe jedoch, dass ein anderer möglicher Ansatz darin besteht, crontab -eals root zu arbeiten. Gibt es überzeugende Argumente für die Verwendung des einen oder anderen oder liegt es an den Vorlieben?

marcv81
quelle
9
Für mich scheint dies eine legitime Best-Practice-Frage zu sein, und ich hoffe, dass sie nicht abgeschlossen wird. Ich kann bereits relevante Sachverhalte in den Antworten und Kommentare dazu erkennen.
MadHatter unterstützt Monica
1
Ich habe einmal crontab -l (um die crontab aufzulisten) eingegeben, aber crontab -; versehentlich wurde stattdessen meine crontab gelöscht. Ich habe an diesem Tag viel gelernt.
Holzfäller

Antworten:

64

Es kann nützlich sein, zu beachten, dass Jobs in einer persönlichen crontab ( crontab -e) immer als deren Eigentümer ausgeführt werden, wobei /etc/crontabein zusätzliches Pflichtfeld enthalten <user>ist, mit dem ein Administrator den Job so konfigurieren kann, dass er als Nicht-Root-Benutzer ausgeführt wird.

Das Bearbeiten der System-Crontab oder das Einrichten einer persönlichen Crontab für root sind wahrscheinlich etwas portabler, nicht spezifisch für bestimmte Linux-Distributionen und für eine Person wahrscheinlich bequemer zu warten, da alle Jobs in einer einzigen Datei gespeichert sind, aber:

Persönlich bevorzuge ich eine dritte Option : für jede geplante Aufgabe fallen entweder

  • eine Datei /etc/cron.d/mit einem Cron-Snippet
  • eine ausführbare Datei (Skript) im entsprechenden /etc/cron.[hourly |daily |weekly |monthly]Verzeichnis.

Das ist einfacher zu skripten (Sie können solche Dateien einfach erstellen / überschreiben / löschen und müssen sich nicht um den Inhalt einer einzelnen crontab-Datei kümmern) und das funktioniert gut mit Konfigurationsmanagement-Tools, und das sind Paketmanager bereits trotzdem tun.

Jobs / Skripte in /etc/cron.[hourly |daily |weekly |monthly]werden immer als root ausgeführt, wobei die Cron-Snippets in /etc/cron.d/sowohl das Festlegen eines benutzerdefinierten Zeitplans als auch das Ausführen als anderer Benutzer mit demselben Pflichtfeld <user>in ermöglichen /etc/crontab.

HBruijn
quelle
18
Ein Nachteil der Bearbeitung /etc/crontabist, dass bei jeder Aktualisierung des cronPakets eine Zusammenführung erforderlich ist . Sie haben dieses Problem nicht, wenn Sie einfach eine neue Datei zu einem der /etc/cron.*Verzeichnisse hinzufügen .
Kasperd
1
Sie sollten in den meisten Distributionen hinzufügen , dass /etc/cron.[hourly |daily |weekly |monthly]hält ausführbaren Dateien während /etc/cron.dhält crontabs. Ansonsten +1.
GnP
Ich bin definitiv ein Fan der Cron. [Timing] -Verzeichnisse, ich brauche selten etwas Granulareres als die Commn-Optionen. Beachten Sie jedoch, dass einige Distributionen, insbesondere Ubuntu, Skripte mit Dateierweiterungen in diesen Ordnern im Hintergrund ignorieren (ein ziemlich Internet-empörender Fehler, den die meisten Leute hinzufügen würden, der möglicherweise in den letzten Distributionen behoben wurde). Es ist sehr schwierig herauszufinden, warum Skripte in dieser Situation nicht funktionierten - zumindest das Hinzufügen zur crontab wird garantiert ausgeführt.
Gargravarr
15

Wie ich mich am besten erinnere, crontab -ehat es den zusätzlichen Vorteil, dass es die crontab-Syntax vor der Installation überprüft und die vorherige fehlerhaft ausführt und wiederherstellt, wenn Sie einen Fehler machen. Auf diese Weise hört alles, was zuvor funktioniert hat, nicht plötzlich auf, wenn die Syntax falsch ist. Ich denke, die beste Vorgehensweise besteht darin, die Dienstprogramme zu verwenden, visudoanstatt sie /etc/sudoersdirekt zu bearbeiten .

Gargravarr
quelle
2
+1 Ein guter Punkt zur Syntaxüberprüfung, obwohl sie einige Syntaxfehler erkennt, ist sie auch alles andere als narrensicher (dh Sie können gerne eine /etc/crontabZeile mit einem Benutzernamen in der 6. Spalte eingeben ). - Obwohl ich behaupten möchte, dass die Verwendung interaktiver Tools kein "Best Practice" ist , sollten Sie mit Tools wie Puppet / Salt / Ansible usw. automatisieren und Server nicht mehr von Hand konfigurieren. Auf der anderen Seite, wenn Sie altmodisch sind, dann verwenden Sie in der Tat Ihre Werkzeuge.
HBruijn
Ansible und andere sind gut, wenn Sie mehr als 5 Server konfigurieren, aber nicht den Aufwand für nur 1 wert. Sie könnten argumentieren, dass mit nur 1 Server ein Ansible-Skript die Möglichkeit bietet, es identisch wiederherzustellen, wenn es 2 Jahre später ausfällt, aber An diesem Punkt wird das Skript wahrscheinlich aufgrund von Distributions- / Repos-Änderungen nicht mehr funktionieren.
Marcv81
Dies ist der Grund, warum ich der akzeptierten Antwort vehement widerspreche. Alle vorgenommenen Änderungen sollten mindestens einmal durchlaufen werden. Wenn man dann eine Zeile von der neuen crontab kopiert und sie einem automatisierten Tool zur Weitergabe an andere Server bereitstellt, ist dies das Beste aus beiden Welten.
Monty Harder
Weder beim Starten eines Skripts noch bei Fehlern helfen. Daher ist in beiden Fällen ein Test im Probelauf erforderlich.
McKenzm
@ McKenzm einverstanden, aber es gibt nur so viel Idiotensicherheit, die Sie anwenden können :)
Gargravarr
2

Es ist wirklich eine Stilfrage, es gibt einen Grund, warum das Betriebssystem mehrere Methoden anbietet. Seien Sie einfach konsistent und passen Sie nicht zusammen, wenn Sie niemanden verwirren möchten (oder wenn Sie sich nach einiger Zeit nicht mit dem System befassen) in bösen Überraschungen enden.

Rackandboneman
quelle
2

Um sicher zu gehen, dass ein Cron-Job hinzugefügt wird, für den bestimmte Benutzerrechte erforderlich sind, verwende ich persönlich den folgenden Befehl:

 # crontab -u <user> -e

Sie können auch hinzufügen sudo.

Wie @rackandboneman feststellte, besteht keine Notwendigkeit, sich mit /etc/cron.d/ -Dateien herumzuschlagen. Wenn es um die Cron-Jobs des Benutzers geht, verwenden Sie die crontabBefehlsfunktionen.

Aesnak
quelle
3
-1 Der große Nachteil ist, dass der Benutzer nun auch den Cronjob ändern / löschen / unterbrechen kann, was normalerweise nicht wünschenswert ist, wenn Sie als Administrator Ihre wertvolle Zeit mit dem Einrichten von Dingen verbracht haben ... Auch wenn der Benutzer ist ein Dienstkonto und dieses Konto ist gesperrt / abgelaufen. Der Dienst wird weiterhin ausgeführt, persönliche Cron-Registerkarten für gesperrte Konten werden jedoch normalerweise deaktiviert.
HBruijn
Wenn der hier angegebene Benutzer ein öffentlicher Benutzer ist, z. B. ein Mitglied einer Umgebung mit öffentlichen Terminaldiensten, haben Sie Recht. Wenn es sich jedoch um den Benutzer eines Dienstleisters / Agenten handelt, dann geht es wirklich um Stil.
Aesnak