Update-CRON mit bash-script

Kann jemand sehen, meine syntax Fehler hier? Versuchen zu Bearbeiten/aktualisieren eines cron-job, aber die Datei wird nicht aktualisiert.

crontab -l | sed 's%*/5 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%' | crontab -

* UPDATE *

So, ich bin immer noch Schwierigkeiten mit diesem. Letztlich bin ich versucht zu ziehen, einen Wert aus einer config-Datei $FREQ (Minuten) der job ausgeführt werden soll. Das Skript prüft zuerst, um zu sehen, ob der Wert in der config anders ist als der Wert, der aktuell in der crontab. Wenn der Wert anders ist, wird es aktualisieren Sie die crontab mit dem neuen Wert. Die crontab (sowohl die erstmalige Installation und updates) zieht auch die Laufenden Verzeichnis und script-Namen von Variablen. Beispiel:

DIR=`pwd`
SCRIPT=`basename $0`
CRONTMP=`crontab -l | grep anm.sh`
crontab -l | sed 's%'$CTMP'%*/'$FREQ' * * * * cd '$DIR' && ./'$SCRIPT'%' | crontab -

Etwas entlang jenen Linien. Dies ist offensichtlich fehlen ein paar Dinge, aber das sollte Ihnen die Allgemeine Idee.

Danke für die Hilfe!

* UPDATE *

Ok, so Dinge bewegen sich entlang, aber ich habe immer noch ein kleines problem. Ich glaube, ich habe die meisten der Logik erarbeitet. Hier ist der gesamte (relevante) Teil der Skript, so können Sie ein Gefühl dafür bekommen, genau das, was ich versuche zu erreichen.

Denken Sie daran: $SCRIPT und $DIR sind definiert außerhalb der Funktion und sind nur in Höhe der Skripte name (anm.sh zum Beispiel), und das aktuelle Arbeitsverzeichnis. Und ich nahm Ihren Vorschlag und aktualisiert alle mein code. Ich verwende jetzt-SCRIPT=$(basename $0). Dank

function CRON {
  if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then
    CTMP=$(crontab -l | grep $SCRIPT)
    if [ "$CTMP" = "*/$FREQ * * * * cd $DIR && ./$SCRIPT" ]; then
      echo "$GREEN No modifications detected $RESET"
    else
      crontab -l | "sed s%$CTMP%*/$FREQ * * * * cd $DIR && ./$SCRIPT%" | crontab -
    fi
  else
    echo "$YELLOW CRON not detected - Installing defaults $RESET"
    (crontab -l ; echo "*/$FREQ * * * * cd $DIR && ./$SCRIPT") | crontab -
  fi
}

Im wesentlichen, wenn die Funktion ausgeführt wird, überprüft es zuerst, wenn der cron-job ist auch installiert (vielleicht ist dies das erste mal, das Skript ausgeführt wurde). Wenn Sie nicht erkennen etwas, fügt es den cron-job, um die crontab-Datei. Dies funktioniert soweit Super. Weiter, wenn die Funktion erkennt, dass der cron-job installiert wurde, vergleicht es vs die Frequenz (in Minuten) in der Konfigurationsdatei festgelegt. Wenn Sie identisch sind, wird keine änderung vorgenommen wurde, um die config-Datei und das Skript verschoben wird, auf. Schließlich, wenn die Werte sind zwar unterschiedlich, dann versucht update die entsprechende Zeile in der crontab-Datei entsprechend den änderungen in der Konfigurationsdatei. Dieser Letzte Teil ausfällt. Derzeit sind seine einfach überschreiben die crontab-Datei komplett zu leeren.

* UPDATE *

Wie es aussieht, gibt es ein großes Problem mit der folgenden Zeile. Dies ist nicht richtig, ziehen Sie die gewünschte Zeile aus der crontab und speichern es in die variable CTMP:

CTMP=$(crontab -l | grep $SCRIPT)

wenn ich echo aus CTMP, bekomme ich ein paar unerwartete Ergebnisse. Anscheinend bin ich mit grep falsch hier.

Ok, das Problem war gelöst. Die variable wurde korrekt gespeichert, ich war gerade hallte es aus falsch.

* UPDATE 06/24/13 5:08am *

Dem letzten Problem zu sein scheint, die sed-Linie. Hier ist die Fehlermeldung recherchiere ich nun.

sed s%*/12 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%: No such file or directory

Es sieht aus wie es versucht, ersetzen Sie die Zeile, aber nicht.

* UPDATE 06/24/13 5:45h *

Also die Fehlermeldung oben war natürlich verursacht durch meine eigene Dummheit. Ich war auch sed innerhalb der Anführungszeichen. Ich habe da entfernt das Kommando aus der zitiert, jedoch das Problem noch besteht. Ich habe versucht, einfache Anführungszeichen, doppelte Anführungszeichen, escaping * und . mit kein Glück. Die cron Datei ist noch nicht aktualisiert. Hier ist der aktuelle code:

function CRON {
  if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then
    CTMP="$(set -f; crontab -l | grep $SCRIPT)"
    if [ "$CTMP" = "*/$FREQ * * * * cd $DIR && ./$SCRIPT" ]; then
      echo "$GREEN No modifications detected $RESET"
    else
      crontab -l | sed "s%$CTMP%*/$FREQ * * * * cd $DIR && ./$SCRIPT%" | crontab -
    fi
  else
    echo "$YELLOW CRON not detected - Installing defaults $RESET"
    (crontab -l ; echo "*/$FREQ * * * * cd $DIR && ./$SCRIPT") | crontab -
  fi
}

* UPDATE 06/24/13 6:05bin *

Vielleicht das Problem ist ich bin nicht auf der Flucht alles. d.h. die Variablen innerhalb der sed Ausdruck einmal erweitert haben Zeichen, die Notwendigkeit der Flucht? Könnte das das Problem sein? Wenn dem so ist, ich bin nicht genau sicher, wie diese zu lösen. Bitte helfen Sie.

* GELÖST *

Ich tatsächlich haben wollte, um die Flucht der Variablen, bevor Sie Sie an sed. Hier ist der code:

CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab -
Gut, dass du voran.. aber das könnte sich bald rechtfertigen eine änderung im Frage-Titel, wenn es nicht bereits? Auch, ich weiß nicht, ob ich es Lesen sollte, Ihre updates nach unten oder nach oben, und was der neueste Stand der Frage ist.
Beginnen Sie oben und Lesen Sie unten. Niedrigsten update ist das aktuellste.
Stellen Sie sicher, dass Sie Ihr Angebot-Befehl sed: Sie wollen nicht sed s///g file möchten Sie in der Regel sed 's///g' file.
Yup ironischerweise gerade herausgefunden, diese Fehler als gut. Leider ist es noch nicht die Aktualisierung der cron-Datei. Updates oben in einer minute.
Mögliche Duplikate von Wie kann ich programmgesteuert erstellen Sie einen neuen cron-job?

InformationsquelleAutor Atomiklan | 2013-06-24

Schreibe einen Kommentar