Chcę mieć możliwość programowego dodawania nowego zadania cron, jaki jest najlepszy sposób, aby to zrobić?
Z moich badań wynika, że mógłbym zrzucić bieżący plik crontab, a następnie dołączyć nowy, przesyłając go z powrotem do pliku crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Czy jest lepszy sposób?
Odpowiedzi:
Zawsze mi się to udawało.
Powinieneś rozważyć nieco bardziej wyrafinowany skrypt, który może zrobić trzy rzeczy.
Dołącz linię crontab; zapewniając, że nie istnieje. Dodawanie, gdy już istnieje, jest złe.
Usuń linię crontab. Może tylko ostrzeżenie, jeśli nie istnieje.
Połączenie powyższych dwóch funkcji, aby zastąpić linię crontab.
źródło
Najlepszym sposobem, jeśli pracujesz jako root, jest upuszczenie pliku do /etc/cron.d
jeśli używasz menedżera pakietów do pakowania oprogramowania, możesz po prostu umieścić pliki w tym katalogu i są one interpretowane tak, jakby były plikami crontab, ale z dodatkowym polem na nazwę użytkownika, np .:
Nazwa pliku:
/etc/cron.d/per_minute
Zadowolony:
* * * * * root /bin/sh /home/root/script.sh
źródło
/etc/cron.d/*
? Trudno stwierdzić, czy coś działa, jeśli trzeba czekać godzinę na sprawdzenie!Rozwiązanie OP ma błąd, może pozwolić na dwukrotne dodanie wpisów, użyj poniżej, aby naprawić.
źródło
sort
przeduniq
np .:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Użyj-u
opcji nasort
.Dodać coś do crona
Aby usunąć to z cron
nadzieja pomogłaby komuś
źródło
2>&1 | grep -v "no crontab"
ponieważ gdy nie ma tabeli crontab, linia wyjściowacrontab: no crontab for...
jest wysyłana do stderr. Nie ma powodu, aby przechwytywać te dane wyjściowe, wysyłać je na standardowe wyjście, a następnie filtrować je za pomocą grep. Jeśli Twoim celem jest uniknięcie patrzeniacrontab: no crontab for...
na wynik, użyj2> /dev/null | sort....
.Większość rozwiązań tutaj dotyczy dodawania linii do tabeli crontab. Jeśli potrzebujesz większej kontroli, będziesz chciał mieć możliwość kontrolowania całej zawartości tabeli crontab.
Możesz użyć orurowania, aby zrobić to całkiem elegancko.
Aby całkowicie przepisać plik crontab, zrób
Powinno to być łatwe do połączenia z innymi opisanymi tutaj odpowiedziami, takimi jak
Lub, jeśli masz zawartość w pliku, jest to jeszcze prostsze
źródło
Jeśli planujesz robić to dla scenariusza run-raz tylko wget'ing coś, przyjrzeć się „na”
źródło
Po prostu zmień edytor na tee polecenie:
źródło
Zakładając, że w twojej tabeli crontab znajduje się już wpis, poniższe polecenie powinno działać stosunkowo dobrze. Zauważ, że
$CMD
zmienna jest tam tylko dla czytelności. Sortowanie przed odfiltrowaniem duplikatów jest ważne, ponieważuniq
działa tylko na sąsiednich wierszach.Jeśli obecnie masz pustą tabelę crontab, na stderr pojawi się następujący błąd:
Jeśli chcesz tego uniknąć, możesz dodać trochę złożoności dodaj zrób coś takiego:
źródło
Oto inny jednoliniowy sposób, który pozwala uniknąć duplikatów
A oto sposób na odpowiedź JohnZ i uniknięcie
no crontab for user
komunikatu lub jeśli musisz działać wset -eu
środowisku typu i nie możesz mieć nic zwracającego błąd (w takim przypadku2>/dev/null
część jest opcjonalna):Lub jeśli chcesz podzielić rzeczy, aby były bardziej czytelne:
Lub opcjonalnie usuń wszelkie odniesienia do komendy twoja_polecenie (np. Jeśli harmonogram się zmienił, chcesz, aby był on kiedykolwiek cron'owany tylko raz). W tym przypadku już nie potrzebujemy
uniq
(dodatkowy bonus, kolejność reklamowa jest również zachowana):źródło
man crontab jest również przydatny:
CRONTAB (1)
NAZWA
STRESZCZENIE
źródło
Dodając do odpowiedzi JohnZ, oto składnia planowania jako root, jeśli jesteś sudoerem:
źródło
źródło
Spowoduje to sprawdzenie, czy polecenie nie istnieje przed jego dodaniem.
Twoje zdrowie.
źródło
Piping stdout into
crontab
nie zainstalował dla mnie nowego crontab na macOS, więc zamiast tego znalazłem to rozwiązanie, używająctee
edytora w powłoce podrzędnej:źródło
Jeśli chcesz, aby zadanie było uruchamiane jako użytkownik:
Jeśli chcesz, aby zadanie było uruchamiane z uprawnieniami:
i sprawdź zadanie (z lub bez 'sudo'):
źródło
Poniżej przedstawiam to, czego używam w swoim skrypcie
1.
# wypisz aktualną tabelę crontab
#echo nowy cron do pliku cron
# zainstaluj nowy plik cron
źródło
możesz również dodać swoje zadania do /etc/cron.*/
źródło
Możesz również edytować plik tekstowy tabeli cron bezpośrednio, ale Twoje rozwiązanie wydaje się całkowicie akceptowalne.
źródło