poniedziałek, 16 sierpnia 2010

crontab

crontab


Example 9.2. Sample crontab file
#Format
#min hour day mon dow  command

# Download data every night at 7:25 pm
 25  19   *   *   *    $HOME/bin/get.pl

# 8:00 am, on weekdays (Monday through Friday)
 00  08   *   *   1-5  $HOME/bin/dosomething

# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy


crontab - tabela programu cron posiadająca specjalny format oraz nazwa programu służącego do jej edycji. Etymologia nazwy odnosi się do języka greckiego (χρόνος [czyt. chronos] - znaczy czas).

Program crontab wywoływany z linii poleceń z opcją -l wyświetla aktualną tabelę użytkownika. Opcja -r usuwa ją, a -e pozwala na jej edycję.
Położenie [edytuj]

Tabele cronu właściwe dla danych użytkowników znajdują się zwykle w katalogu /var/spool/cron/crontabs (np. jest tak w systemach HP-UX i Solaris, z kolei dystrybucja Linuksa RHEL i jej klony używają w tym celu /var/spool/cron).

Niektóre dystrybucje Linuksa mają dodatkową tabelę systemową umieszczoną w pliku /etc/crontab. Od zapisów tam umieszczonych zależy sposób obsługi skryptów z katalogów /etc/cron.*:

/etc/cron.hourly - skrypty wykonywane co godzinę
/etc/cron.daily - skrypty wykonywane codziennie
/etc/cron.weekly - skrypty wykonywane raz w tygodniu
/etc/cron.monthly - skrypty wykonywane raz w miesiącu

W powyższych katalogach należy umieścić plik ze skryptem do wykonania.
Przykład [edytuj]

Przykładowa tabela crontab z systemu GNU/Linux (ze strony podręcznika: man 5 crontab) właściwa dla danego użytkownika:

# Używaj /bin/sh do wywoływania komend. Nieważne co jest w /etc/passwd.
SHELL=/bin/sh
#
# Przesyłaj wyjście do użytkownika paul
MAILTO=paul
#
# Uruchamiaj się 5 minut po północy, codziennie
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
#
# Uruchamiaj się o 14:15 pierwszego dnia każdego miesiąca -- wyjście jest
# przesyłane do paula
15 14 1 * * $HOME/bin/monthly
#
# Denerwuj Kasię od poniedziałku do piątku o godzinie 22:00
0 22 * * 1-5 echo "Kasiu, jest już 22:00. Gdzie są Twoje dzieci?!" | mail -s "Wybiła 22:00" kasia@example.com

#
# Inne przykłady
23 0-23/2 * * * echo "uruchamiaj 23 min po polnocy, 2, 4 ..., codziennie"
5 4 * * sun echo "Uruchamiaj się 5 po 4 w niedziele"
0 10 * * 1,3 echo "Uruchamiaj się w każdy poniedzialek i srode o 10.00"
*/2 * * * * echo "Uruchamiaj się co 2 minuty"

lub z wykorzystaniem zapisu słownego z wykorzystaniem znaku "@" tzn.:

@reboot echo "System uruchomił się!" -polecenie uruchamiane każdorazowo po uruchomieniu systemu
@yearly echo "Minął kolejny rok!" -odpowiednik zapisu "0 0 1 1 *
@annually echo "Minął kolejny rok!" - j.w.
@monthly echo "Minął kolejny miesiąc!" -odpowiednik zapisu "0 0 1 * *"
@weekly echo "Minął kolejny tydzień!" -odpowiednik zapisu "0 0 * * 0"
@daily echo "Minął kolejny dzień!" -odpowiednik zapisu "0 0 * * *"
@midnight echo "Minął kolejny dzień!"- j.w.
@hourly echo "Minęła kolejna godzina!" -odpowiednik zapisu , "0 * * * *"


Pierwsza część pliku to definicje dwóch zmiennych środowiskowych SHELL i MAILTO. Wartość zmiennej SHELL ustala powłokę w której cron będzie uruchamiał polecenia. Wartość zmiennej MAILTO określa użytkownika, któremu pocztą elektroniczną wysłany zostanie raport zawierający standardowy strumień wyjścia oraz standardowy strumień błędów, jeśli wykonywane polecenie umieści coś na jednym z nich.

Druga część to już właściwa tabela zawierająca informacje o czasie uruchomienia i poszczególnych komendach dla każdego z zadań. W tej części linie nie będące komentarzem zawierają sześć kolumn. Pierwsze pięć określa czas uruchomienia zadania, szósta definiuje komendę, która ma zostać wykonana:

* * * * * komenda do wykonania
- - - - -
| | | | |
| | | | +----- dzień tygodnia (0 - 7) (Niedziela=0, Poniedziałek=1, Wtorek=2,..., Niedziela=7)
| | | |
| | | +------- miesiąc (1 - 12)
| | |
| | +--------- dzień miesiąca (1 - 31)
| |
| +----------- godzina (0 - 23)
|
+------------- minuta (0 - 59)


Uwagi:

* Aby uniknąć problemów z uruchomieniem poleceń systemowych, należy w crontabie podawać pełne ścieżki do nich. Tak samo należy postąpić w przypadku skryptów, które są wywoływane przez crontaba - również w nich trzeba umieścić pełne ścieżki do poleceń.

* Dzień wykonania komendy można wyspecyfikować na dwa sposoby: podając dzień miesiąca lub dzień tygodnia. Jeśli oba pola są ustawione, to komenda wykona się zarówno w ustawiony dzień miesiąca, jak i w ustawiony dzień tygodnia!

* Wartości liczbowe możemy zapisywać w różnych formatach:
o 1-3 - czyli wartości 1,2,3
o 0-10/2 - czyli wartość 0,2,4,6,8 i 10 (co druga wartość ze zbioru od 0 do 10)
o 1,2,5 - czyli wartości kolejno 1,2,5
o */2 - co 2 dozwolona wartość (np. w pierwszej kolumnie będzie to 0,2,4,6...56,58)
o 1-3,5,6 - czyli 1,2,3 oraz 5 i 6

* Tabela systemowa zawarta w pliku /etc/crontab posiada nieznacznie inną składnię: pierwsze pięć pól określa czas uruchomienia zadania, szóste pole określa nazwę użytkownika, z którego uprawnieniami zadanie zostanie uruchomione, siódme pole definiuje komendę, która zostanie wykonana.

-------------------------------------------------------------------------------------

Automatyzacja zadań - cron, at, anacron

Tym razem jak sam tytuł wskazuje zajmę się problemem automatyzacji zadań o których możemy zaliczyć tworzenie kopi zapasowych, wysyłanie raportów mailem oraz wiele innych zadań, które mają być wykonywane w tle bez naszego udziału.

W artykule zajme się opisem trzech podstawowych programów, które różnia sie sposobem działania oraz sytuacjami w których nalezy je stosować.
Zaczne od programu cron, który jest demonem systemowym, odpowiedzialnym za uruchamianie programów (zadań) cyklicznie lub o określonej porze (działa w systemach przcujących ciągle tj. 24 godziny na dobę). W zależności od dystrybucji start demona "cron" odbywać sie może troche inaczej. W większości dystrybujci cron domyślnie jest uruchomiony, ale w razie watpliwości w Fedorze uruchamiamy go nst.:
[root@localhost ~]# service crond start
Uruchamianie crond: [ OK ]
[root@localhost ~]#

Cron przegląda /var/spool/cron/crontabs w poszukiwaniu plików-tabel (crontab), nazywanych według kont w /etc/passwd (tabele w /var nie powinny być bezpośrednio modyfikowane). Cron szuka również /etc/crontab lub /etc/cron.d/crontab, które jest w innym formacie następnie budzi się co minutę, sprawdzając wszystkie zapisane tabele. Podczas wywoływania komend, wszelkie ich wyjście jest przesyłane pocztą do właściciela tabeli (lub do użytkownika podanego w zmiennej środowiskowej MAILTO w tabeli, jeśli taki istnieje).
Ważna informacja to taka, że crona nie trzeba restartowac po kazdej wprowadzonej zmianie ponieważ cron sprawdzi czasy modyfikacji tabel i przeładuje wszystkie te, które były ostatnio zmienione.
Do instalacji, deinstalacji lub oglądania zawartości tabel używanych przez demon cron słuzy program crontab.
Standartowo z crontab może korzystać root, jeżeli chcemy aby inni uzytkownicy mogli również z niego korzystać to musimy im na to zezwolić. Służą do tego pliki cron.allow i cron.deny w /etc. Najlepiej zrobić nst. wpisy: w /etc/cron.deny wpisać all, zabroni to wszystkim kozystac z crontab'a, a następnie w /etc/cron.allow dopisac uzytkowników, którym pozwolimy na jego używanie
(Nadanie innemu użytkownikowi dostępu do crona nie powoduje, że będzie on mógł uruchamiać zaplanowane zadania jako root.).

Edycja pliku crontab jest nst.:
crontab -e - edycja,
crontab -l - wswietlanie listy,
crontab -r - usówanie.

Wpisy w plikach crontab zbudowane są z 6 pól. Pierwsze 5 pól określa czas wykonania, natomiast 6 pole czynność.
Minuty Godziny Dni Miesiące Dni tygodnia Zadanie
01 * * * * echo "co 1 min.wpis do" >> min.txt
01 12 5 * mon /home/user/skrypt.sh
00 12 * 1-12/2 * /home/user/skrypt.sh
05 12 01 01 * echo "happy new year"
5 0 * * * polecenie (5 po północy dziennie)
15 16 1 * * polecenie (16:15 pierwzego każd.m-ca)
0 4 * * 7 polecenie (4:00 w każdą niedzielę)
30 4 * * 1-5 polecenie (4:30 od pon. do piątku)
Pierwszej pozycji nie musze objasniać, druga - o 12:01 piątego oraz poniedziałek każdego miesiąca zostanie wykonany skrypt. W trzeciej pozycji skrypt będzie wykonywany co drugi miesiąc każdego dnia o godzinie 12:00. W ostatniej pierwszego stycznie o godzinie 12:05 linux złozy nam zyczenia (o ile przekierujemy echo)

Znaczenie pól:
- Minuta (zakres 0-59)
- Godzina (zakres 0-23)
- Dzień (zakres 0-31)
- Miesiąc (zakres 0-12 lub nazwa, pierwsze 3 litery nazwy angielskiej)
- Dzień_Tygodnia (zakres 0-7 lub nazwa (0 i 7 to niedziela), pierwsze 3 litery nazwy angielskiej)
- Polecenie (reszta linii)

Pole może mieć gwiazdkę (*), czyli wykonuj zawsze.
Dozwolone są zakresy liczb, oddzielonych przecinkami lub myślnikiem. Zakres ten jest domknięty. np. 8-11 dla godzin oznacza wywoływanie w godzinach 8, 9, 10, 11. Dozwolone są też listy. Lista jest zbiorem liczb (lub zakresów), oddzielonych przecinkami. np. 1,2,5,9 albo 0-4,8-12 mozna równiez dzielić okresy czasu np. */2 - wykonanie co 2 jednostki czasu

Anacron
Anacron nie jest demonem crona. Zazwyczaj pracuje w połączeniu z cronem. Wykonuje polecenia w odstępach czasu podawanych w dniach oraz nie czyni założeń o ciągłym działaniu systemu. Uruchamia zadania, które nie zostały wywołane podczas wyłączeń systemu. Anacron przeważnie jest uruchamiany przez demona cron raz dziennie.
Do uruchamiania zadań za poprzez anacron'a edytujemy plik /etc/anacrontab, ktory składa sie z czterech nst. pól:
Ilość dni miedzy uruchomieniami Opóźnienie w min. Nazwa zadania Zadanie
1 65 cron.daily /etc/cron.daily
7 70 cron.weekly /etc/cron.weekly
30 75 cron.monthly /etc/cron.monthly
Program Anacron kończy działanie po tym, gdy wszystkie zadania wymienione w pliku anacrontab, zostaną wykonane.
Uruchamiając anacron przy starcie systemu umożliwimy mu wykonanie wszystkich cznnośc, których cron nie zdołał wykonać, może byc przydatny zwłaszcza przy zadaniach typu weekly, monthly.

At
At wykonuje polecenia o zadanym czasie - tylko raz, czyta on ze standardowego wejścia lub podanego pliku polecenia, które mają zostać wykonane w późniejszym czasie przy użyciu /bin/sh.
Tak jak przy innych tego typu programach superużytkownik może zawsze posługiwać się opisywanymi poleceniami. Dla pozostałych użytkowników tworzymy plik /etc/at.allow i /etc/at.deny. Jeżeli istnieje plik /etc/at.allow, to wyłącznie użytkownicy, których nazwy doń wpisano, mają prawo uruchamiania at. Jeśli nie istnieje /etc/at.allow, to sprawdzany jest plik /etc/at.deny, a każdemu użytkownikowi, którego w nim nie wymieniono, zezwala się na używanie at. Jeśli nie istnieje żaden z plików kontrolujących dostęp do polecenia at, to posługiwać się nim może wyłącznie superużytkownik.
Pusty plik /etc/at.deny oznacza, że pozwala się na używanie opisywanych poleceń wszystkim użytkownikom. Jest to konfiguracja domyślna.

Po tej krótkiej teorii mozemyprzejść do podstawowej składni.
Dla przykładu wpisujemy:
[root@localhost ~]# at 15:45
at> echo "wpis do pliku atd.txt" > atd.txt
at> (Wprowadzanie poleceń kończymy wciskając w nowej linii kombinację klawiszy [Ctrl]+[d])
job 5 at 2007-12-11 15:45
Can't open /var/run/atd.pid to signal atd. No atd running?
To oznacza, że nie uruchomiliśmy demona atd:
[root@localhost ~]# service atd start
Uruchamianie atd: [ OK ]
[root@localhost ~]# at 15:45
at> echo "wpis do pliku atd.txt" > atd.txt
at> job 6 at 2007-12-11 15:45
Zobaczmy potwierdzenie wraz z podanym terminem uruchomienia polecenia.
Aby sprawdzic ile zadań czeka w kolejce do późniejszego wkonania wpisujemy polecenia atq:
[root@localhost ~]# atq
5 2007-12-11 15:45 a root
3 2007-12-10 16:34 a root
1 2007-12-10 16:32 a root
6 2007-12-11 15:45 a root
4 2007-12-11 15:45 a rambix
[root@localhost ~]#
Jeśli z jakiegoś powodu zrezygnujemy z wykonywania zleconego polecenia, to możemy je usunąć poleceniem atrm z podanym numerem zadania przeznaczonego do skasowania. Numer ten możemy odczytać w pierwszej kolumnie wyniku polecenia atq.

Czas w at możemy podawac na wieele sposobów, oto przykłady:
at 18:21 - podając godzine wykonania zadania,
at 18:23 04.03.04 - podając godzine i konkretny dzień wykonania zadania,
at 4pm + 3 days - można stosować znak "+" jako informacja, że czas(data) wykonania to suma dwóch czasów(dat). Np. za trzy dni o czwartej,
at 10am Jul 31 04 - daty i czasy mogą być mieszane,
at 1am tomorrow - możemy stosowac "pisane" daty,

Zainstaluj amavisd-new, SpamAssassin, ClamAV

Zainstaluj amavisd-new, SpamAssassin, ClamAV i
Aby zainstalować amavisd-new, spamassassin i clamav, uruchom następujące polecenie:

apt-get install amavisd-new spamassassin clamav clamav-daemon rozpakowywać zoo bzip2 unzoo libnet-ph-perl libnet-snpp libnet-perl perl-telnet-pax lzop nomarcha

Następnie musimy skonfigurować amavisd-new. Konfiguracja jest podzielona na różne pliki, które znajdują się w / etc / amavis / conf.d katalogu. Spójrz na każdej z nich do zapoznania się z konfiguracją. Większość ustawień jest w porządku, jednak musimy zmodyfikować trzy pliki:

Najpierw musimy włączyć ClamAV oraz SpamAssassin w / etc/amavis/conf.d/15-content_filter_mode poprzez odkomentowanie @ bypass_virus_checks_maps i @ bypass_spam_checks_maps linii:

vi / etc/amavis/conf.d/15-content_filter_mode

Plik powinien wyglądać tak:

use strict;

# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.

#
# Default antivirus checking mode
# Uncomment the two lines below to enable it back
#

@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);


#
# Default SPAM checking mode
# Uncomment the two lines below to enable it back
#

@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

1; # insure a defined return

A następnie należy spojrzeć na ustawienia spam i działań na rzecz spam-/virus-mails w / etc/amavis/conf.d/20-debian_defaults. Nie trzeba nic zmieniać, jeśli domyślne ustawienia są ok dla Ciebie. Plik zawiera wiele wyjaśnień, więc nie ma potrzeby wyjaśniać ustawienia tutaj:

vi / etc/amavis/conf.d/20-debian_defaults

$QUARANTINEDIR = "$MYHOME/virusmails";

$log_recip_templ = undef; # disable by-recipient level-0 log entries
$DO_SYSLOG = 1; # log via syslogd (preferred)
$syslog_ident = 'amavis'; # syslog ident tag, prepended to all messages
$syslog_facility = 'mail';
$syslog_priority = 'debug'; # switch to info to drop debug output, etc

$enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny)
$enable_global_cache = 1; # enable use of libdb-based cache if $enable_db=1

$inet_socket_port = 10024; # default listenting socket

$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.31; # triggers spam evasive actions
$sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent

$sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger
$sa_local_tests_only = 0; # only tests which do not require internet access?

[...]
$final_virus_destiny = D_DISCARD; # (data not lost, see virus quarantine)
$final_banned_destiny = D_BOUNCE; # D_REJECT when front-end MTA
$final_spam_destiny = D_BOUNCE;
$final_bad_header_destiny = D_PASS; # False-positive prone (for spam)


Finally, edit /etc/amavis/conf.d/50-user and add the line $pax='pax'; in the middle:

vi /etc/amavis/conf.d/50-user

use strict;

#
# Place your configuration directives here. They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#

$pax='pax';

#------------ Do not modify anything below this line -------------
1; # insure a defined return

Afterwards, run these commands to add the clamav user to the amavis group and to restart amavisd-new and ClamAV:




adduser clamav amavis
/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/clamav-freshclam restart

Now we have to configure Postfix to pipe incoming email through amavisd-new:

postconf -e 'content_filter = amavis:[127.0.0.1]:10024'
postconf -e 'receive_override_options = no_address_mappings'

Afterwards append the following lines to /etc/postfix/master.cf:

vi /etc/postfix/master.cf

[...]
amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes

127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_bind_address=127.0.0.1

Then restart Postfix:

/etc/init.d/postfix restart

Now run

netstat -tap

and you should see Postfix (master) listening on port 25 (smtp) and 10025, and amavisd-new on port 10024:

server1:/etc/postfix# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost.localdo:10024 *:* LISTEN 14491/amavisd (mast
tcp 0 0 localhost.localdo:10025 *:* LISTEN 14869/master
tcp 0 0 localhost.localdo:mysql *:* LISTEN 12181/mysqld
tcp 0 0 *:sunrpc *:* LISTEN 1684/portmap
tcp 0 0 *:auth *:* LISTEN 2036/inetd
tcp 0 0 *:1522 *:* LISTEN 2077/rpc.statd
tcp 0 0 *:smtp *:* LISTEN 14869/master
tcp 0 0 localhost.localdom:smtp localhost.localdom:2894 TIME_WAIT -
tcp6 0 0 *:imaps *:* LISTEN 12453/couriertcpd
tcp6 0 0 *:pop3s *:* LISTEN 12482/couriertcpd
tcp6 0 0 *:pop3 *:* LISTEN 12463/couriertcpd
tcp6 0 0 *:imap2 *:* LISTEN 12436/couriertcpd
tcp6 0 0 *:www *:* LISTEN 3712/apache2
tcp6 0 0 *:ssh *:* LISTEN 2058/sshd
tcp6 0 0 server1.example.com:ssh ::ffff:192.168.0.2:4515 ESTABLISHED2139/0
tcp6 0 0 server1.example.com:ssh ::ffff:192.168.0.2:4648 ESTABLISHED14784/sshd: root@no



10 Install Razor, Pyzor And DCC And Configure SpamAssassin
Razor, Pyzor and DCC are spamfilters that use a collaborative filtering network. To install them, run

apt-get install razor pyzor dcc-client

Now we have to tell SpamAssassin to use these three programs. Edit /etc/spamassassin/local.cf and add the following lines to it:

vi /etc/spamassassin/local.cf

[...]

# dcc
use_dcc 1
dcc_path /usr/bin/dccproc
dcc_add_header 1
dcc_dccifd_path /usr/sbin/dccifd

#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor
pyzor_add_header 1

#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf

#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
Restart amavisd-new afterwards:

/etc/init.d/amavis restart