Jak napisać crona, który będzie uruchamiał skrypt codziennie o północy?

144

Słyszałem, że crontab to dobry wybór, ale jak napisać linię i gdzie umieścić ją na serwerze?

Matt Elhotiby
źródło

Odpowiedzi:

261

Oto dobry tutorial na temat tego, czym jest crontab i jak go używać w systemie Ubuntu. Twoja linia crontab będzie wyglądać mniej więcej tak:

00 00 * * * ruby path/to/your/script.rb

( 00 00wskazuje północ - 0 minut i 0 godzin - a* s oznacza każdy dzień każdego miesiąca).

Składnia: 
  Polecenie mm hh dd mt wd

  mm minuta 0-59
  hh godzina 0-23
  dd dzień miesiąca 1-31
  miesiąc 1-12 mt
  wd dzień tygodnia 0-7 (niedziela = 0 lub 7)
  polecenie: co chcesz uruchomić
  wszystkie wartości liczbowe można zastąpić *, co oznacza wszystko
Jordan Running
źródło
1
Czy nie brakuje Ci kolumny „uruchom jako użytkownik”?
Lucas Cimon
4
@LucasCimon Kolumna użytkownika (która pojawiłaby się przed poleceniem) jest dozwolona w /etc/crontab(w systemie Ubuntu), ale po uruchomieniu crontab -eedytujesz crontab specyficzny dla użytkownika, który nie zezwala na tę kolumnę. IIRC Ubuntu odradza /etc/crontabręczne zamykanie, ponieważ może zostać nadpisane. Zobacz tutaj: stackoverflow.com/questions/8475694/ ...
Jordan Bieganie
@Jordan, więc odpowiedzią na crontab dla roota jestsudo crotab -u root -e
dashy
40

ze strony podręcznika

linux$ man -S 5 crontab

   cron(8) examines cron entries once every minute.

   The time and date fields are:

          field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sun, or use names)
   ...
   # run five minutes after midnight, every day
   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
   ...

Dobrze jest zwrócić uwagę na specjalne „pseudonimy”, których można używać (udokumentowane na stronie podręcznika), szczególnie „@reboot”, który nie ma alternatywy dla czasu i daty.

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh

Możesz również użyć tej sztuczki, aby uruchomić zadanie crona wiele razy na minutę.

   # Run every minute at 0, 20, and 40 second intervals
   * * * * *       sleep 00; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 20; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 40; /usr/local/sbin/run_3times_per_minute.sh

Aby dodać zadanie cron, możesz zrobić jedną z trzech rzeczy:

  1. dodaj polecenie do tabeli crontab użytkownika, jak pokazano powyżej (oraz z tabeli crontab, sekcja 5, strona podręcznika).

    • edytuj crontab użytkownika jako root za pomocą crontab -e -u <username>
    • lub edytuj crontab bieżącego użytkownika za pomocą just crontab -e
    • Możesz ustawić edytor za pomocą EDITORzmiennej środowiskowej
      • env EDITOR=nano crontab -e -u <username>
      • lub ustaw wartość EDITOR dla całej sesji powłoki
        1. export EDITOR=vim
        2. crontab -e
    • Spraw, aby skrypty były wykonywalne z chmod a+x <file>


  1. utwórz skrypt / program jako zadanie cron i dodaj go do systemowych /etc/cron.*lykatalogów anacron

    • anacron /etc/cron.*ly katalogi:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • jak w:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - uczyń go wykonywalnym
    • Zobacz także stronę podręcznika man anacron: man anacron
    • Spraw, aby skrypty były wykonywalne z chmod a+x <file>
    • Kiedy te skrypty cron. * Ly są uruchamiane?
      • W przypadku RHEL / CentOS 5.x są one konfigurowane w /etc/crontablub/etc/anacrontab uruchamiane w określonym czasie
      • Systemy Linux RHEL / CentOS 6.x + i Fedora 17+ definiują to tylko w /etc/anacrontabprogramie cron.hourly w/etc/cron.d/0hourly


  1. Lub można tworzyć tabele systemowe w /etc/cron.d.

    • Opisana wcześniej składnia crontab (z dodatkowym zapewnieniem użytkownikowi wykonywania każdego zadania jako) jest umieszczana w pliku, a plik jest umieszczany w katalogu /etc/cron.d.
    • Są one łatwe do zarządzania w pakietach systemowych (np. Pakiety RPM), więc zwykle mogą być specyficzne dla aplikacji.
    • Różnica w składni polega na tym, że dla zadania cron należy określić użytkownika po polach czasu / daty, a przed poleceniem do wykonania.
    • Pliki dodane do /etc/cron.d nie muszą być wykonywalne.
    • Oto przykładowe zadanie, które jest wykonywane jako użytkownik someuser, a użycie /bin/bashjako powłoki jest wymuszone.


   File: /etc/cron.d/myapp-cron
   # use /bin/bash to run commands, no matter what /etc/passwd says
   SHELL=/bin/bash
   # Execute a nightly (11:00pm) cron job to scrub application records
   00 23 * * * someuser /opt/myapp/bin/scrubrecords.php
Russell E. Glaue
źródło
5

Czasami będziesz musiał określić PATH i GEM_PATH używając crontab z rvm.

Lubię to:

# top of crontab file
PATH=/home/user_name/.rvm/gems/ruby-2.2.0/bin:/home/user_name/.rvm/gems/ruby-2.2.0@global/bin:/home/user_name/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/user_name/.rvm/gems/ruby-2.2.0:/home/user_name/.rvm/gems/ruby-2.2.0@global

# jobs
00 00 * * * ruby path/to/your/script.rb
00 */4 * * * ruby path/to/your/script2.rb
00 8,12,22 * * * ruby path/to/your/script3.rb
LV2014
źródło
4

Krótki przewodnik po konfiguracji zadania cron

Utwórz nowy plik tekstowy, przykład: mycronjobs.txt

Dla każdego codziennego zadania (00:00, 03:45) zapisz wiersze harmonogramu w pliku mycronjobs.txt

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh

Wyślij zadania do crona (za każdym razem, gdy to uruchomisz, cron usunie to, co zostało zapisane i zaktualizuje o nowe informacje w mycronjobs.txt )

crontab mycronjobs.txt

Dodatkowe przydatne informacje

Zobacz aktualne zadania cron

crontab -l

Usuń wszystkie zadania cron

crontab -r
dyltini
źródło
Twoja składnia crontab jest nieprawidłowa dla 03:45. Pola crontab to Minuta, potem Godzina, czyli "45 03" - masz to odwrócone w swoim poście.
Russell E Glaue
1

Możesz uruchomić skrypt powłoki na dwa sposoby, używając zadania cron lub pisząc skrypt powłoki

Załóżmy, że nazwa twojego skryptu to „yourscript.sh”

Najpierw sprawdź uprawnienia użytkownika do skryptu. użyj poniższego polecenia, aby sprawdzić uprawnienia użytkownika do skryptu

ll script.sh

Jeśli skrypt jest w katalogu głównym, użyj poniższego polecenia

sudo crontab -e

Po drugie, jeśli skrypt przechowuje użytkownika „ubuntu”, użyj poniższego polecenia

crontab -e

Dodaj następujący wiersz do swojej tabeli crontab: -

55 23 * * * /path/to/yourscript.sh

Innym sposobem na zrobienie tego jest napisanie skryptu i uruchomienie go w tle

Oto skrypt, w którym musisz wpisać nazwę swojego skryptu (np .: - youscript.sh), który będzie uruchamiany codziennie o 23:55

#!/bin/bash while true do /home/modassir/yourscript.sh sleep 1d done

zapisz go w pliku (nazwijmy go „every-day.sh”)

sen 1d - oznacza, że ​​czeka jeden dzień, a następnie działa ponownie.

teraz daj uprawnienia swojemu skryptowi. użyj poniższego polecenia: -

chmod + x every-day.sh

teraz wykonaj ten skrypt powłoki w tle, używając "nohup". Spowoduje to kontynuowanie wykonywania skryptu nawet po wylogowaniu się z sesji.

użyj poniższego polecenia, aby wykonać skrypt.

nohup ./every-day.sh &

Uwaga: - aby uruchomić "yourscript.sh" codziennie o 23:55, musisz wykonać skrypt "every-day.sh" dokładnie o 23:55.

Modassir Haider
źródło
0

Umieść to zdanie w pliku crontab: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

MAES
źródło