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


Ich richte regelmäßige Systemwartungsaufgaben ein, die als root ausgeführt werden müssen. Ich plane, den Geschmack von Cron zu verwenden, der standardmäßig mit Ubuntu 14.04 LTS geliefert wird.

Ich sehe, dass der vorherige Administrator (der die Firma verlassen hat) direkt / etc / crontab bearbeitet hat. Allerdings verstehe ich einen anderen möglichen Ansatz zu verwenden wäre crontab -e als root. Gibt es irgendwelche zwingenden Argumente, um das eine oder das andere zu verwenden, oder liegt es an der Präferenz?


42
2017-09-06 06:51


Ursprung


Für mich sieht das nach einer legitimen Best-Practice-Frage aus, und ich hoffe, es wird nicht geschlossen. Ich kann bereits relevante, sachliche Punkte in den Antworten und Kommentare dazu sehen. - MadHatter
Ich ging einmal zu crontab -l (um die Crontab aufzulisten), aber ich tippte crontab -; aus Versehen löschte ich stattdessen meine crontab. Ich habe an diesem Tag viel gelernt. - Lumberjack


Antworten:


Es könnte nützlich sein, dass Jobs in einer persönlichen Crontab (crontab -e) werden immer als deren Besitzer ausgeführt, wo /etc/crontab enthält ein zusätzliches Pflichtfeld <user> Feld, in dem ein Administrator den Job so konfigurieren kann, dass er als Benutzer ohne Rootberechtigung ausgeführt wird.

Das Bearbeiten der System-Crontab oder das Einrichten einer persönlichen Crontab für root ist wahrscheinlich ein bisschen portabler, nicht spezifisch für bestimmte Linux-Distributionen und wohl praktischer für eine Person zu verwalten, mit allen Jobs in einer einzigen Datei, aber:

Persönlich bevorzuge ich dritte Option: Für jede geplante Aufgabe fallen beide

  • eine Datei in /etc/cron.d/ mit einem Cron-Ausschnitt
  • eine ausführbare Datei (Skript) in der relevanten /etc/cron.[hourly |daily |weekly |monthly] Verzeichnis.

Das ist einfacher zu scripten (Sie können einfach solche Dateien erstellen / überschreiben / löschen und Sie müssen nicht im Inhalt einer einzelnen Crontab-Datei herumfummeln) und das funktioniert gut mit Konfigurations-Management-Werkzeugen und das ist es, was Paketmanager bereits sind mach es trotzdem.

Jobs / Skripte in /etc/cron.[hourly |daily |weekly |monthly] werden immer als root ausgeführt, in dem der Cron einschneidet /etc/cron.d/ Erlaubt sowohl das Einstellen eines benutzerdefinierten Zeitplans als auch das Ausführen als ein anderer Benutzer mit dem gleichen obligatorischen <user> Feld gefunden in /etc/crontab.


58
2017-09-06 07:13



Ein Nachteil der Bearbeitung /etc/crontab ist, dass eine Zusammenführung immer dann erforderlich ist, wenn Sie die Aktualisierung durchführen cron Paket. Sie haben dieses Problem nicht, wenn Sie nur eine neue Datei zu einem der hinzufügen /etc/cron.* Verzeichnisse. - kasperd
Das ist eine sehr gute Antwort, vielen Dank. - marcv81
Sie sollten das in den meisten Distributionen hinzufügen /etc/cron.[hourly |daily |weekly |monthly] hält ausführbare Dateien während /etc/cron.d hält Crontabs. Ansonsten +1. - GnP
Ich bin definitiv ein Fan der cron. [Timing] Verzeichnisse, ich brauche selten etwas granularerer als die Commn-Optionen. Beachten Sie jedoch, dass einige Distributionen, insbesondere Ubuntu, Skripte mit Dateierweiterungen in diesen Ordnern stillschweigend ignorieren werden (ein Fehler, der die Internetnutzung erschwert, da die meisten Leute .sh hinzufügen, die in den letzten Distributionen behoben wurden). Es ist sehr schwierig herauszufinden, warum Skripte in dieser Situation nicht funktionieren - zumindest wird die Crontab ausgeführt. - Gargravarr


Soweit ich mich erinnere, crontab -e hat den zusätzlichen Vorteil, dass es die Crontab-Syntax vor der Installation überprüft, und wird Fehler und Wiederherstellen der vorherigen, wenn Sie einen Fehler machen. Auf diese Weise hört alles, was vorher funktionierte, nicht plötzlich auf, wenn die Syntax falsch ist. Ich denke, die beste Vorgehensweise besteht darin, die Dienstprogramme zu verwenden, wie das Laufen visudo anstatt zu bearbeiten /etc/sudoers direkt.


16
2017-09-06 15:12



+1 Guter Punkt über die Syntax-Validierung, obwohl es einige Syntaxfehler erkennt, ist es auch weit davon entfernt, narrensicher zu sein (d. H. Es wird Ihnen glücklicherweise erlauben, a einzugeben /etc/crontab Zeile mit einem Benutzernamen in der 6. Spalte). - Obwohl ich argumentieren möchte, dass die Verwendung interaktiver Tools nicht ist "beste Übung", sollten Sie mit Tools wie Puppet / Salt / Ansible etc. automatisieren und Server nicht mehr von Hand konfigurieren. Auf der anderen Seite, wenn Sie Old-School sind, dann verwenden Sie tatsächlich Ihre Werkzeuge. - HBruijn
Ansible und andere sind gut, wenn Sie 5+ Server konfigurieren, aber den Aufwand für nur 1 nicht wert. Sie könnten argumentieren, dass mit nur 1 Server ein Ansible-Skript Ihnen die Möglichkeit gibt, es identisch neu zu erstellen, wenn es 2 Jahre später ausfällt An diesem Punkt wird das Skript wahrscheinlich aufgrund von Distributionen nicht mehr funktionieren. - marcv81
Dies ist der Grund, warum ich der angenommenen Antwort vehement widerspreche. Was auch immer geändert wird, sollte mindestens einmal durch diesen Validierungsprozess laufen. Wenn man dann eine Zeile aus der neuen crontab kopiert und einem automatisierten Tool zur Verfügung stellt, um sie auf andere Server zu übertragen, dann ist es das Beste aus beiden Welten. - Monty Harder
Keine Hilfe, wenn ein Skript gestartet wird, und es gibt Fehler im Skript, daher ist ein Test auf Dry-Run erforderlich. - mckenzm
@mckenzm stimmte zu, aber es gibt nur so viel Idiot-Proofing, das du anwenden kannst :) - Gargravarr


Es ist wirklich eine Stilfrage, es gibt einen Grund, warum das Betriebssystem mehrere Methoden anbietet. Seien Sie einfach konsistent und mischen Sie nicht, wenn Sie niemanden (oder sich selbst nach einiger Zeit des Nichthandelns mit dem System) verwirren möchten - wenn es schwierig ist zu sehen, welche Aufgaben tatsächlich über den gesamten Host geplant sind, tendiert es dazu in böse Überraschungen enden.


2
2017-09-06 14:58





Um sicher zu sein, einen Cron Job hinzuzufügen, der die Rechte eines bestimmten Benutzers erfordert, benutze ich persönlich den folgenden Befehl:

 # crontab -u <user> -e

Du kannst hinzufügen sudo auch.

Wie @rackandboneman sagte, gibt es keine Notwendigkeit, sich mit /etc/cron.d/ Dateien zu befassen. Wenn es sich um Cron-Jobs von Benutzern handelt, verwenden Sie die Funktionen von crontabBefehl.


2
2017-09-06 15:10



-1 Der große Nachteil der oben genannten ist, dass der Benutzer nun in der Lage ist, auch den Cronjob zu modifizieren / löschen / brechen, was normalerweise nicht wünschenswert ist, wenn Sie als Administrator Ihre wertvolle Zeit damit verbracht haben, Dinge einzurichten ... Auch wenn Benutzer ist ein Dienstkonto und dieses Konto ist gesperrt / abgelaufen. Der Dienst wird weiterhin ausgeführt, aber persönliche Cron-Tabs für gesperrte Konten werden normalerweise deaktiviert. - HBruijn
Wenn der hier angegebene Benutzer ein öffentlicher Benutzer ist, z. B. Mitglied einer öffentlichen Terminal Service-Umgebung, haben Sie Recht. Wenn es jedoch um den Benutzer eines Service / Agenten geht, dann ist es beim zweiten Gedanken wirklich Stil. - aesnak