Fügen Sie dem Cron Zeilen aus dem Skript hinzu

40

Gibt es eine Möglichkeit, dem Cron eines Benutzers über ein Skript Zeilen hinzuzufügen?

Normalerweise mache ich das mit crontab -e, aber ich möchte diese Aufgabe mit einem Shell-Skript automatisieren.

Adam Matan
quelle

Antworten:

49

Sie können die Zeile unten in der crontab des aktuellen Benutzers wie folgt wiedergeben:

#!/bin/bash

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
Richard Holloway
quelle
+1, weil du mich geschlagen hast (ich hatte beim Testen einen Skriptfehler: D). Eine Sache, die Sie hinzufügen müssen, denke ich: Das System muss darüber informiert werden, dass crones geändert wurde.
Rinzwind
Ich wusste, dass dies ein Rennen sein würde, um beantwortet zu werden! Sie haben Recht, dass cron benachrichtigt werden muss. Aus diesem Grund können Sie den Befehl nicht einfach bis zum Ende der Crontab wiederholen. Ich habe getestet, dass das obige Skript funktioniert und cron startet den Befehl.
Richard Holloway
13
Oh und ich denke das auch fehler raus wenn crontabfür diesen User noch nicht existiert (?)
Rinzwind
7
Es warnt Sie, dass Benutzer crontab nicht existieren, wenn dies der Fall ist, aber es wird es dann erstellen. Ich stimme Ihren Kommentaren als aufschlussreich zu.
Richard Holloway
3

Wenn Sie einen Wert in Ihrer crontab bearbeiten möchten, können Sie folgende Aktionen ausführen:

$ crontab -l | sed -e 's/foo/bar/' | crontab -

Natürlich müssen Sie bei Ihrer Ersetzung vorsichtig sein, um sicherzustellen, dass sie nur zu den Zeilen passt, die Sie ändern möchten. Andernfalls werden alle foosin bars(in diesem Beispiel) geändert .

Der Vorteil dieser Methode ist, dass Sie nicht die gesamte Crontab ersetzen. (Eine metaphorische Pinzette statt eines Vorschlaghammers.)

Sie können einen beliebigen Bearbeitungsbefehl anstelle von sed verwenden . Wenn Sie beispielsweise mit ed eine Zeile nachbessern möchten, die zunächst so aussieht:

2 * * * * /sbin/flitch --days 3,4 > /var/log/flitch.out 2>&1

Angenommen, diese Zeile gehört zu vielen Zeilen, oder Sie müssen viele verschiedene Crontabs auf verschiedenen Systemen aktualisieren, und Sie wissen nur, dass Ihre Zeile die einzige Zeile mit dem darin enthaltenen Begriff flitchist.

Es könnte so aussehen:

$ cat /tmp/edscript
/flitch
s/3/9/
w
q
$ crontab -l > /tmp/out && ed /tmp/out < /tmp/edscript && crontab - < /tmp/out
$ crontab -l
...
2 * * 1 * /sbin/flitch --days 9,4 > /var/log/flitch.out 2>&1
...

Jetzt muss ich zugeben, dass sed in fast 100% der Zeit das tut, was ed tut, aber es ist immer gut, ein zusätzliches Werkzeug für das Schweizer Taschenmesser zu haben. ^. ^

fbicknel
quelle