Schreiben eines Shell-Skripts zum Installieren des Cron-Jobs

8

Dies ist das erste Mal, dass ich ein Shell-Skript schreibe und ich habe sehr wenig Informationen in der gegebenen Zeitleiste. Obwohl ich verschiedene Tutorials durchlese, dachte ich mir aber auch, was ich hier möchte.

Ich möchte ein Shell-Skript schreiben, das auf einem beliebigen Computer den Cronjob bearbeitet, ein neues Skript hinzufügt, das alle 15 Minuten ausgeführt wird. also im Grunde muss ich einen Eintrag hinzufügen

0,15,30,45 * * * * /home/personal/scripts/cronSqlprocedure.sh

Was ich im Shell-Skript haben möchte

  • würde zuerst die Berechtigungen / Ausführungsrechte für cronSqlprocedure.sh
  • ändern
  • Bearbeiten Sie bestehenden Cron-Job und fügen Sie diesen neuen Eintrag hinzu.

Wenn möglich, möchte ich auch cronSqlprocedure über das Shell-Skript schreiben, da es einige Variablen benötigt, die von System zu System variieren können.

%Vor%

Diese Zeilen müssen für jede Maschine in cronSqlprocedure.sh konfiguriert werden.

%Vor%     
Em Ae 31.01.2012, 16:49
quelle

3 Antworten

12

Einfache Antwort auf die ursprüngliche Frage

Es scheint alles wie routiniertes Shell-Scripting zu sein:

%Vor%

Der trap stuff stellt minimalen Schaden sicher, wenn der Benutzer entscheidet, die temporäre Datei zu unterbrechen und zu bereinigen. Beachten Sie, dass die alte Version des Skripts, falls vorhanden, bereits geplottert wurde. Wenn Sie möchten, können Sie das Skript in eine andere temporäre Datei umwandeln und das Verschieben erst dann abschließen, wenn Sie zufrieden sind. Ich verwende normalerweise die I / O-Umleitung für den Befehl crontab . Sie können den Dateinamen als Argument übergeben.

Beachten Sie die Escapes auf $ORACLE_HOME und $PATH , auf die William Purpell richtig hingewiesen hat, sollte anwesend sein $ORACLE_HOME und sollte (vielleicht) auf $PATH vorhanden sein. Sie müssen entscheiden, ob Sie den cron -provided (total minimal) -Wert von $PATH (in welchem ​​Fall Sie den umgekehrten Schrägstrich verwenden möchten) oder ob Sie den aktuellen Wert des Benutzers $PATH in% verwenden wollen. co_de% script. Beide könnten richtig sein - seien Sie sich dessen bewusst und entscheiden Sie sich warum. Beachten Sie, dass die von cron bereitgestellte Umgebung immer minimal ist. Sie erhalten eine Einstellung für PATH, HOME, vielleicht TZ, wahrscheinlich USER und möglicherweise LOGNAME; das kann alles sein. Wenn Sie sich nicht sicher sind, versuchen Sie einen crontab-Eintrag auszuführen, der die Umgebung in einer Datei erfasst:

%Vor%

Sie werden wahrscheinlich feststellen, dass die Datei klein ist. Vergessen Sie nicht, den Eintrag nach dem Testen zu entfernen.

Eine gute Sache, für die Sie empfohlen werden:

  • Ihr Skript (a) stellt sicher, dass es die Umgebung festlegt, und (b) führt einen einfachen Befehl aus dem cron -Eintrag aus und überlässt das Skript der harten Arbeit.

Meiner Ansicht nach sollten die Einträge in der crontab -Datei in der Tat einfach sein und ein speziell dafür entwickeltes Skript aufrufen, um die eigentliche Arbeit zu erledigen.

Kritik des vorgeschlagenen Skripts in der überarbeiteten Frage

%Vor%

Bis jetzt kein Problem:

%Vor%

Das ist furchtbar wiederholend, und mit append anzufangen ist nicht gut. Ich würde verwenden:

%Vor%

Das crontab wendet die E / A-Umleitung auf die enthaltenen Befehle an. Beachten Sie, dass vor dem { ... } ein Semikolon oder eine neue Zeile stehen muss.

%Vor%

Da ich eine Variable für den Dateinamen habe, würde ich es verwenden:

%Vor%

Dann haben wir ein Problem mit der Wiederholung hier, plus nicht hinter uns selbst aufzuräumen:

%Vor%

Also würde ich schreiben:

%Vor%

Ich denke immer noch, dass } nicht zu schwer ist und in jedem Skript verwendet werden sollte, das temporäre Dateien erstellt; Aber es ist dein Chaos, nicht meines. Ich bin nicht davon überzeugt, dass trap überall gebraucht wird; Ich habe es in einem Namen gelassen und nicht in dem anderen. Wenn Sie keinen Verzeichnispfad angeben, wird $PWD impliziert. Ich stelle außerdem fest, dass Sie in Ihrem vorgeschlagenen vollständigen Skript einen etwas anderen Skriptnamen als den ursprünglichen verwenden. Solange die Namen selbstkonsistent sind, gibt es kein Problem (und die Verwendung einer Variablen trägt zur Konsistenz bei), aber seien Sie vorsichtig.

Ich bin mir nicht sicher, ob ich das wirklich so machen würde, aber Sie könnten die temporäre Datei auch vermeiden mit:

%Vor%

Dadurch wird der aktuelle Wert gesammelt und die zusätzliche Zeile angehängt. Dies wird in ein Skript eingegeben, das für eine Sekunde ruht (um den ersten Teil zu beenden), bevor die Ergebnisse wieder in $PWD eingegeben werden. Es ist eine Frage, wie zuverlässig die Verzögerung von einer Sekunde ist, hauptsächlich. Es ist wahrscheinlich gut, aber nicht garantiert. Die temporäre Datei ist 100% zuverlässig - ich würde sie verwenden, weil sie nicht komplexer ist. (Ich könnte runde Klammern um das erste Paar von Befehlen verwenden; ich könnte Klammern um das zweite Paar von Befehlen verwenden, aber ich müsste ein Semikolon zwischen crontab und - hinzufügen, das durch% co_de ersetzt wird %.)

Beachten Sie, dass mein ursprünglicher Vorschlag sorgfältig darauf geachtet hat, dass selbst wenn das Skript mehrere Male ausgeführt wurde, nur ein Eintrag in der Crontab-Datei für den Prozess vorhanden ist. Ihre Varianten stellen die Idempotenz nicht sicher.

    
Jonathan Leffler 31.01.2012, 18:19
quelle
0

Ich habe eine ähnliche Frage gefunden: Crontab programmgesteuert bearbeiten und erzwingen Der Daemon zum Aktualisieren

Das Ändern der Berechtigungen der Datei ist ein typisches Shell-Skript mit vielen verfügbaren Ressourcen.

Für den Cronjob sollten Sie im Wesentlichen mit dem Crontab-Programm interagieren und es mit einer völlig neuen Cron-Datei füttern. Sie können zuerst bereits konfigurierte Cron-Jobs abrufen, Ihre zu der Liste hinzufügen und dann crontab erneut aufrufen, um ihr die neue Eingabedatei zu geben.

Weitere Informationen finden Sie auf der Manpage für crontab .

    
Mr. Shickadance 31.01.2012 17:00
quelle
0
%Vor%     
William Pursell 31.01.2012 18:13
quelle

Tags und Links