Niestety, większość najlepszych odpowiedzi tutaj pokazuje tylko, jak modyfikować crontab - choć w dość bezpieczny sposób - ale myślę, że ogólnie jest to złe podejście. Lepszym, bezpieczniejszym i prostszym jest upuszczenie pliku do {{cron.d}}, a istnieją (obecnie) niskie głosy wyjaśniające, jak to zrobić, jeśli spojrzysz w dół.
gregmac,
Odpowiedzi:
539
Możesz dodać do crontab w następujący sposób:
#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello">> mycron
#install new cron file
crontab mycron
rm mycron
Objaśnienie linii Crona
*****"command to be executed"-----|||||||||-----Day of week (0-7)(Sunday=0 or 7)|||-------Month(1-12)||---------Day of month (1-31)|-----------Hour(0-23)-------------Minute(0-59)
Sugeruję, aby zmienić ;z &&jako bezpieczne-baczności przed przypadku, gdy crontab -lnie powiedzie się. tak jak:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
MacUsers
12
@MacUsers, crontab -lkończy się niepowodzeniem, jeśli nie ma crontab, więc użycie &&uniemożliwia skryptowi dodanie pierwszego wpisu do crontab.
crontab -lwyświetla bieżące zadania crontab, catdrukuje je, echodrukuje nowe polecenie i crontab -dodaje wszystkie wydrukowane rzeczy do pliku crontab. Możesz zobaczyć efekt, robiąc nowy crontab -l.
dzięki, możesz wyjaśnić składnię lub wskazać adres URL, który to wyjaśnia?
witryny
9
crontab -lwyświetla bieżące zadania crontab, catdrukuje je, echodrukuje nowe polecenie i crontab -dodaje wszystkie wydrukowane rzeczy do pliku crontab. Możesz zobaczyć efekt, robiąc nowycrontab -l
nha
3
To dla mnie przyjemność. Jeśli użytkownik nie ma istniejącego pliku crontab, zobaczysz no crontab for <username>, ale i tak działa.
etap
21
nie działa na mojej instancji Amazon EC2. Zamiast tego (crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -działa.
Nie mogłem wymyślić, jak wyeliminować potrzebę dwóch zmiennych bez powtarzania się.
commandto oczywiście polecenie, które chcę zaplanować. jobtrwa$command i dodaje dane planowania. Potrzebowałem obu zmiennych osobno w wierszu kodu, który działa.
Detale
Podziękowania dla duckyflip, używam tego małego przekierowania thingy ( <(*command*)), aby przekształcić dane wyjściowe crontab -lw dane wejściowe dla plikufgrep polecenia.
fgrepnastępnie odfiltrowuje wszystkie dopasowania $command( -vopcja), bez rozróżniania wielkości liter (-i opcja).
Ponownie, mała rzecz przekierowująca ( <(*command*)) służy do zamiany wyniku z powrotem na dane wejściowe dlacat polecenia.
catPolecenie otrzymuje również echo "$job"(oczywista), również przez zastosowanie tego rodzaju lasera (przekierowania<(*command*) ).
Więc odfiltrowane dane wyjściowe crontab -li proste echo "$job", połączone są przesyłane strumieniowo („|”), aby crontab -w końcu zostać zapisane.
I żyli długo i szczęśliwie!
W skrócie:
Ten wiersz kodu odfiltrowuje wszystkie zadania cron pasujące do polecenia, a następnie wypisuje pozostałe zadania cron z nowym, skutecznie działając jak funkcja „dodaj” lub „zaktualizuj”. Aby tego użyć, wystarczy zamienić wartości zmiennych commandi job.
Zaletą tego podejścia jest to, że można go uruchomić wiele razy, nie martwiąc się o zduplikowane wpisy w pliku crontab (w przeciwieństwie do wszystkich innych rozwiązań). Wynika to zfgrep -v
aleemb
5
Jeśli wolisz tradycyjny sposób crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
układania
1
@ AntoineLizée, na końcu odpowiedź zawiera dodatkowe „l”, którego nie powinno być.
W powyższym przykładzie utworzyliśmy plik w /etc/cron.d/, pod warunkiem, że zmienne środowiskowe dla komendy do pomyślnego wykonania, oraz podaliśmy userkomendę i commandsamą. Ten plik nie powinien być wykonywalny, a nazwa powinna zawierać tylko znaki alfanumeryczne i łączniki (więcej szczegółów poniżej).
Aby udzielić dokładnej odpowiedzi, spójrzmy na różnice między crontabvs cron/crond:
crontab -- maintain tables for driving cron for individual users
Dla tych, którzy chcą uruchomić zadanie w kontekście swojego użytkownika w systemie, użycie crontabmoże mieć sens.
cron -- daemon to execute scheduled commands
Dla tych, którzy używają zarządzania konfiguracją lub chcą zarządzać zadaniami dla innych użytkowników, w takim przypadku powinniśmy skorzystać cron .
Szybki fragment stron podręcznika zawiera kilka przykładów tego, co należy robić, a czego nie robić:
/ etc / crontab i pliki w /etc/cron.d muszą być własnością użytkownika root i nie mogą być zapisywane w grupach ani w inny sposób. W przeciwieństwie do obszaru buforowania pliki w /etc/cron.d lub pliki w /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly i /etc/cron.monthly dowiązania symboliczne, pod warunkiem, że zarówno dowiązanie symboliczne, jak i plik, na który wskazuje, są własnością użytkownika root. Pliki w /etc/cron.d nie muszą być wykonywalne, podczas gdy pliki w /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly i /etc/cron.monthly tak, jak są one uruchamiane według części roboczych (więcej informacji można znaleźć w części roboczej (8)).
Nadal sh: 1: Syntax error: "(" unexpectedużywam sh .
Batandwa
Działa to tylko wtedy, gdy używasz BASH. Nie znam poprawnej składni DASH (sh). Zaktualizowałem również odpowiedź
kvz
1
fwiw, ten błąd pojawia się przy użyciu bash, jeśli między <i jest spacja (. To znaczy , że się nie < (udaje, ale <(działa, chyba że w twoim harmonogramie są gwiazdki ...
dou Rozwarp
Uważam, że jest to właściwy sposób:cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Stanislav,
5
Do szybkiego i brudnego tworzenia / zastępowania pliku crontab ze skryptu BASH użyłem tej notacji:
Jeśli używasz Vixie Cron, np. W większości dystrybucji Linuksa, możesz po prostu umieścić plik w /etc/cron.d z indywidualnym cronjob.
Działa to tylko dla roota. Jeśli twój system to obsługuje, powinieneś zobaczyć kilka przykładów. (Zwróć uwagę na nazwę użytkownika zawartą w wierszu, w tej samej składni, co stary plik / etc / crontab)
Smutne jest, że w cronie jest to mylne, że nie ma sposobu, aby poradzić sobie z tym jako zwykły użytkownik i że tak wiele implementacji crona nie ma żadnego sposobu, aby sobie z tym poradzić.
sudo - ponieważ potrzebujesz podwyższonych uprawnień do zmiany konfiguracji crona w katalogu / etc
echo - pojazd do tworzenia wyjścia na standardowym wyjściu. printf, cat ... też by działały
„- użyj podwójnego cudzysłowu na początku łańcucha, jesteś profesjonalistą
0,15,30,45 * * * * - standardowy harmonogram uruchamiania cron, ten uruchamia się co 15 minut
ntpdate -u time.nist.gov - właściwe polecenie, które chcę uruchomić
„- ponieważ moje pierwsze podwójne cudzysłowy potrzebuje znajomego, aby zamknąć wyjściowy wiersz
>> - podwójne nadpisanie dołącza zamiast zastępuje *
/etc/cron.d/vmclocksync - vmclocksync to nazwa pliku, którą wybrałem, idzie w /etc/cron.d/
* jeśli użyjemy przekierowania>, możemy zagwarantować, że mamy tylko jeden wpis zadania. Ale groziłoby nam usunięcie wszelkich innych reguł w istniejącym pliku. Możesz sam zdecydować, czy możliwe jest zniszczenie za pomocą>, czy możliwe duplikaty za pomocą >> są dla Ciebie. Ewentualnie możesz zrobić coś skomplikowanego lub zaangażowanego, aby sprawdzić, czy nazwa pliku istnieje, czy coś w nim jest i czy dodajesz jakiekolwiek duplikaty - ale mam coś do zrobienia i nie mogę tego zrobić dla Ty w tej chwli.
Skrypt Bash do dodawania zadania cron bez interaktywnego edytora. Poniższy kod pomaga dodać cronjob przy użyciu plików linux.
#!/bin/bash
cron_path=/var/spool/cron/crontabs/root
#cron job to run every 10 min.
echo "*/10 * * * * command to be executed">> $cron_path
#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed">> $cron_path
Wiem, że minęło sporo czasu, ale to wciąż jedyna dobra odpowiedź, ponieważ wszystkie najbardziej głosujące usuwają stare crony zamiast tylko dodawać nowe.
AFE
1
Ten nie instaluje crona. Po prostu dołącza go do pliku. Będziesz musiał jakoś powiadomić proces cron o zainstalowaniu nowego wpisu.
Apoorv Parijat
1
Oto funkcja bash do dodawania polecenia crontabbez powielania
function addtocrontab (){local frequency=$1
local command=$2
local job="$frequency $command"
cat <(fgrep -i -v "$command"<(crontab -l))<(echo "$job")| crontab -}
addtocrontab "0 0 1 * *""echo hello"
Zapewni to prawidłowe posługiwanie się pustą nową linią u dołu. Aby uniknąć problemów z crontabem, zwykle należy zakończyć plik crontab pustą nową linią. Powyższy skrypt upewnia się, że najpierw usuwa wszelkie puste wiersze za pomocą „grep”. część, a następnie dodaj nowy pusty wiersz na końcu z „\ n” na końcu skryptu. Zapobiegnie to również umieszczeniu pustej linii nad nowym poleceniem, jeśli istniejący plik crontab kończy się pustą linią.
Odpowiedzi:
Możesz dodać do crontab w następujący sposób:
Objaśnienie linii Crona
Źródło nixCraft .
źródło
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
- łatwiej skopiować kopiowane;
z&&
jako bezpieczne-baczności przed przypadku, gdycrontab -l
nie powiedzie się. tak jak:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
crontab -l
kończy się niepowodzeniem, jeśli nie ma crontab, więc użycie&&
uniemożliwia skryptowi dodanie pierwszego wpisu do crontab.Możesz to zrobić w locie
crontab -l
wyświetla bieżące zadania crontab,cat
drukuje je,echo
drukuje nowe polecenie icrontab -
dodaje wszystkie wydrukowane rzeczy do pliku crontab. Możesz zobaczyć efekt, robiąc nowycrontab -l
.źródło
crontab -l
wyświetla bieżące zadania crontab,cat
drukuje je,echo
drukuje nowe polecenie icrontab -
dodaje wszystkie wydrukowane rzeczy do pliku crontab. Możesz zobaczyć efekt, robiąc nowycrontab -l
no crontab for <username>
, ale i tak działa.(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
działa.Ten krótszy nie wymaga pliku tymczasowego, jest odporny na wiele wstawień i pozwala zmienić harmonogram istniejącego wpisu.
Powiedz, że masz te:
Aby dodać go do crontab, bez powielania:
Aby usunąć go z crontab bez względu na aktualny harmonogram:
Uwagi:
źródło
Dziękuję wszystkim za pomoc. Zestawiając to, co znalazłem tutaj i gdzie indziej, wymyśliłem to:
Kod
Nie mogłem wymyślić, jak wyeliminować potrzebę dwóch zmiennych bez powtarzania się.
command
to oczywiście polecenie, które chcę zaplanować.job
trwa$command
i dodaje dane planowania. Potrzebowałem obu zmiennych osobno w wierszu kodu, który działa.Detale
<(*command*)
), aby przekształcić dane wyjściowecrontab -l
w dane wejściowe dla plikufgrep
polecenia.fgrep
następnie odfiltrowuje wszystkie dopasowania$command
(-v
opcja), bez rozróżniania wielkości liter (-i
opcja).<(*command*)
) służy do zamiany wyniku z powrotem na dane wejściowe dlacat
polecenia.cat
Polecenie otrzymuje równieżecho "$job"
(oczywista), również przez zastosowanie tego rodzaju lasera (przekierowania<(*command*)
).crontab -l
i prosteecho "$job"
, połączone są przesyłane strumieniowo („|”), abycrontab -
w końcu zostać zapisane.W skrócie:
Ten wiersz kodu odfiltrowuje wszystkie zadania cron pasujące do polecenia, a następnie wypisuje pozostałe zadania cron z nowym, skutecznie działając jak funkcja „dodaj” lub „zaktualizuj”. Aby tego użyć, wystarczy zamienić wartości zmiennych
command
ijob
.źródło
fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
EDYCJA (naprawiono nadpisywanie):
źródło
crontab -l
zawiedzie, ale sięcrontab -
powiedzie, twój crontab będzie liniowy.Było wiele dobrych odpowiedzi na temat używania crontab, ale nie wspomniano o prostszej metodzie, takiej jak używanie
cron
.Korzystanie
cron
by skorzystać z systemu plików i katalogów znajdujących się/etc/crontab
,/etc/cron.daily,weekly,hourly
czy/etc/cron.d/
:W powyższym przykładzie utworzyliśmy plik w
/etc/cron.d/
, pod warunkiem, że zmienne środowiskowe dla komendy do pomyślnego wykonania, oraz podaliśmyuser
komendę icommand
samą. Ten plik nie powinien być wykonywalny, a nazwa powinna zawierać tylko znaki alfanumeryczne i łączniki (więcej szczegółów poniżej).Aby udzielić dokładnej odpowiedzi, spójrzmy na różnice między
crontab
vscron/crond
:Dla tych, którzy chcą uruchomić zadanie w kontekście swojego użytkownika w systemie, użycie
crontab
może mieć sens.Dla tych, którzy używają zarządzania konfiguracją lub chcą zarządzać zadaniami dla innych użytkowników, w takim przypadku powinniśmy skorzystać
cron
.Szybki fragment stron podręcznika zawiera kilka przykładów tego, co należy robić, a czego nie robić:
Zarządzanie cronami w ten sposób jest łatwiejsze i bardziej skalowalne z perspektywy systemu, ale nie zawsze będzie najlepszym rozwiązaniem.
źródło
<job>
nie powinno zawierać rozszerzenia pliku.Możliwe, że automatyzujesz to i nie chcesz, aby jedno zadanie zostało dodane dwukrotnie. W takim przypadku użyj:
Działa to tylko wtedy, gdy używasz BASH. Nie znam prawidłowego DASH (
sh
składni ).Aktualizacja: To nie działa, jeśli użytkownik nie ma jeszcze pliku crontab. Bardziej niezawodnym sposobem byłoby:
Alternatywnie, jeśli Twoja dystrybucja to obsługuje, możesz również użyć osobnego pliku:
Znaleziono je w innym pytaniu SO .
źródło
sh: 1: Syntax error: "(" unexpected
używam sh .<
i jest spacja(
. To znaczy , że się nie< (
udaje, ale<(
działa, chyba że w twoim harmonogramie są gwiazdki ...cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Do szybkiego i brudnego tworzenia / zastępowania pliku crontab ze skryptu BASH użyłem tej notacji:
źródło
Wariant, który edytuje crontab, tylko jeśli nie ma tam pożądanego ciągu:
źródło
Jeśli używasz Vixie Cron, np. W większości dystrybucji Linuksa, możesz po prostu umieścić plik w /etc/cron.d z indywidualnym cronjob.
Działa to tylko dla roota. Jeśli twój system to obsługuje, powinieneś zobaczyć kilka przykładów. (Zwróć uwagę na nazwę użytkownika zawartą w wierszu, w tej samej składni, co stary plik / etc / crontab)
Smutne jest, że w cronie jest to mylne, że nie ma sposobu, aby poradzić sobie z tym jako zwykły użytkownik i że tak wiele implementacji crona nie ma żadnego sposobu, aby sobie z tym poradzić.
źródło
Tak więc w Debianie, Ubuntu i wielu podobnych dystrybucjach opartych na Debianie ...
Istnieje mechanizm konkatenacji zadania cron, który pobiera plik konfiguracyjny, łączy je i dodaje do uruchomionej usługi cron.
Możesz umieścić plik pod /etc/cron.d/somefilename, gdzie somefilename jest tym, czego chcesz.
Rozłóżmy to:
sudo - ponieważ potrzebujesz podwyższonych uprawnień do zmiany konfiguracji crona w katalogu / etc
echo - pojazd do tworzenia wyjścia na standardowym wyjściu. printf, cat ... też by działały
„- użyj podwójnego cudzysłowu na początku łańcucha, jesteś profesjonalistą
0,15,30,45 * * * * - standardowy harmonogram uruchamiania cron, ten uruchamia się co 15 minut
ntpdate -u time.nist.gov - właściwe polecenie, które chcę uruchomić
„- ponieważ moje pierwsze podwójne cudzysłowy potrzebuje znajomego, aby zamknąć wyjściowy wiersz
>> - podwójne nadpisanie dołącza zamiast zastępuje *
/etc/cron.d/vmclocksync - vmclocksync to nazwa pliku, którą wybrałem, idzie w /etc/cron.d/
* jeśli użyjemy przekierowania>, możemy zagwarantować, że mamy tylko jeden wpis zadania. Ale groziłoby nam usunięcie wszelkich innych reguł w istniejącym pliku. Możesz sam zdecydować, czy możliwe jest zniszczenie za pomocą>, czy możliwe duplikaty za pomocą >> są dla Ciebie. Ewentualnie możesz zrobić coś skomplikowanego lub zaangażowanego, aby sprawdzić, czy nazwa pliku istnieje, czy coś w nim jest i czy dodajesz jakiekolwiek duplikaty - ale mam coś do zrobienia i nie mogę tego zrobić dla Ty w tej chwli.
źródło
Skrypt Bash do dodawania zadania cron bez interaktywnego edytora. Poniższy kod pomaga dodać cronjob przy użyciu plików linux.
źródło
Oto funkcja bash do dodawania polecenia
crontab
bez powielaniaźródło
dodaj parametr -w, aby dokładnie komenda grep, bez parametru -w dodanie polecenia cronjob „testowanie” powoduje usunięcie zadania cron „test123”
funkcja skryptu do dodawania / usuwania cronjobs. brak wpisów powielania:
testowane:
źródło
Moim preferowanym rozwiązaniem byłoby:
Zapewni to prawidłowe posługiwanie się pustą nową linią u dołu. Aby uniknąć problemów z crontabem, zwykle należy zakończyć plik crontab pustą nową linią. Powyższy skrypt upewnia się, że najpierw usuwa wszelkie puste wiersze za pomocą „grep”. część, a następnie dodaj nowy pusty wiersz na końcu z „\ n” na końcu skryptu. Zapobiegnie to również umieszczeniu pustej linii nad nowym poleceniem, jeśli istniejący plik crontab kończy się pustą linią.
źródło
źródło
Nie, w crontab nie ma opcji modyfikacji plików cron.
Musisz: wziąć bieżący plik cron (crontab -l> newfile), zmienić go i umieścić nowy plik na swoim miejscu (crontab newfile).
Jeśli znasz perl, możesz użyć tego modułu Config :: Crontab .
LLP, Andrea
źródło
funkcja skryptu, aby dodać cronjobs. sprawdź zduplikowane wpisy, użyteczne wyrażenia *> „
testowane:
źródło: mój mózg;)
źródło
Prawdopodobnie możesz zmienić domyślny edytor na ed i użyć heredoc do edycji.
Uwaga wiodący > w tym kodzie oznacza, że naciśnięto klawisz Return / Enter, aby utworzyć nowy wiersz.
Te a środki APPEND więc nie zastąpi nic.
The . oznacza, że skończyłeś edycję.
w środki zapisać zmiany.
Gdy Q oznacza ZAKOŃCZ lub wyjścia wyd.
możesz to sprawdzić
Możesz także usunąć wpis.
Spowoduje to usunięcie wpisu crontab z Myscript.
Do d środki usunąć wzór wewnątrz / / .
Nie, sprawdź to jeszcze raz
To rozwiązanie działa w skrypcie zbyt mało > oczywiście :-)
źródło