Dodaj wiersze do crona ze skryptu

40

Czy istnieje sposób dodawania linii do crona użytkownika za pomocą skryptu?

Zwykle robię to za pomocą crontab -e, ale chciałbym zautomatyzować to zadanie za pomocą skryptu powłoki.

Adam Matan
źródło
stackoverflow.com/questions/878600/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

49

Możesz powtórzyć linię w dolnej części bieżącego pliku crontab w następujący sposób:

#!/bin/bash

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
Richard Holloway
źródło
+1, bo mnie do tego pobiłeś (miałem błąd skryptu podczas testowania: D). Myślę, że należy dodać jedną rzecz: system musi zostać poinformowany o cronzmianie.
Rinzwind
Wiedziałem, że to wyścig, na który trzeba będzie odpowiedzieć! Masz rację, że cron musi zostać powiadomiony. Dlatego nie możesz po prostu powtórzyć polecenia do końca tabeli. Przetestowałem, że powyższy skrypt działa i cron zaczyna uruchamiać polecenie.
Richard Holloway,
13
Aha i myślę, że to również crontab
popełni
7
Ostrzega cię, że crontab użytkowników nie istnieje, jeśli tak jest, ale wtedy go utworzy. Wasze komentarze oceniam jako wnikliwe.
Richard Holloway,
3

Jeśli chcesz edytować wartość w swoim crontab, możesz zrobić coś w stylu:

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

Oczywiście musisz uważać na swoją zamianę, aby upewnić się, że pasuje ona tylko do linii, które chcesz zmienić; w przeciwnym razie wszystkie fooszostaną zmienione na bars(w tym przykładzie).

Zaletą tej metody jest to, że nie zastępujesz całego pliku crontab. (Metaforyczna pinceta zamiast młota.)

Możesz użyć dowolnego polecenia edycji zamiast sed . Na przykład, jeśli chcesz użyć ed do poprawienia linii, która zaczyna się tak:

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

Powiedzmy, że ten wiersz jest jednym z wielu wierszy lub masz wiele różnych crontabów do aktualizacji w różnych systemach i wiesz tylko, że twoja linia będzie jedyną linią z zawartym flitchw niej terminem .

Może wyglądać następująco:

$ 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
...

Teraz muszę przyznać, że prawie 100% czasu sed zrobi to, co zrobi ed , ale zawsze dobrze jest mieć dodatkowe narzędzie na szwajcarskim nożu wojskowym. ^. ^

fbicknel
źródło