**Cron** е програма којашто овозможува автоматско извршување на наредби (за оперативни системи засновани на Unix (оперативен систем)), скрипти (група наредби) во точно определено време.

Како се покрева cron?
---------------------

Cron е демон, што значи дека се покрева само еднаш за да потоа чека додека од него не биде побарано извршување на некое барање. Пример, опслужувачот е демон, којшто чека барање за приказ на одредена мрежна страница. Cron демонот, или crond, e неактивен сè до времето кое е специфицирано во еден од неговите конфигурациски податотеки - crontabs.

Во најголемиот број на GNU/Linux дистрибуции, crond е автоматски инсталиран и е дел од почетните (start up) скрипти. За да видите дали е подигнат, внесете ја следнава наредба:

```
 [saso@marco saso]$ ps aux | grep crond
```

```
 root 1681 0.0 0.2 1944 508 ? S Dec15 0:00 crond
 saso 15034 0.0 0.2 4492 508 pts/26 S 14:17 0:00 grep crond
```

Првата линија покажува дека crond е подигнат, а втората линија е пребарувањето коешто го зададовме.

Ако не е подигнат, тоа може да се направи со crond. Процесот автоматски ќе се префрли за работа во позадина. Од сега па во иднина после превклучување на сметачот, crond ќе биде подигнат. Доколку не сакаме да го превклучуваме, неопходно е извршување на crond со root привилегии.

```
 [saso@marco saso]$ crond
```

Најголемиот број на демони (пр.: httpd и syslogd) потребно е да бидат превклучени по промена во нивните конфигурациски податотеки. Кај Cron тоа не е случај, промените автоматски се прифаќаат по внесувањето со crontab. Некои cron верзии вршат обнова на конфигурациските податотеки на секоја минута, некои бараат превклучување. Во Fedora, Red Hat и SUSE Linux дистрибуциите овие промени се приложуваат во моментот на нивното снимање.

Употреба на cron

Има неколку различни начини на употребата на cron.
Во /etc директориумот може да се најдат следниве под директориуми именувани како:

'cron.hourly', 'cron.daily', 'cron.weekly' and 'cron.monthly'. Ако поставите скрипта во еден од овие директориуми, таа ќе биде извршена часовно, неделно или месечно, во зависност од директориумот во кој се наоѓа.

За поголема флексибилност, можно е уредување на /etc/crontab податотеката. Во Fedora и RadHat дистрибуциите crontab податотеката изгледа вака:

```
 [saso@marco /]$ cat /etc/crontab
```

```
 SHELL=/bin/bash
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 MAILTO=root
 HOME=/
```

```
 # run-parts
 01 * * * * root run-parts /etc/cron.hourly
 02 4 * * * root run-parts /etc/cron.daily
 12 4 * * 0 root run-parts /etc/cron.weekly
 22 4 1 * * root run-parts /etc/cron.monthly
 32 4 * * * root run-parts /etc/cron.rotate
```

Да го разгледаме вториот дел од податотеката. Секоја линија е сочинета од серија на повеќе полиња одделени со празно место.

Полињата се:

**minute hour dom month dow user command**

*minute* - Параметар кој ги контролира минутите во еден час. Вредноста е помеѓу 0 и 59;

*hour* - Контрола за часот во кој се извршува наредбата (24 часовен облик). Вредноста е помеѓу 0 и 23 (0 е полноќ);

*dom* - Ден во месецот. Вредноста е помеѓу 1 и 31;

*month* - Месец во годината. Вредноста е помеѓу 1 и 12 (претставено бројчено) или текстуално на англиски јазик со користење на првите три букви(Jan – Dec);

*dow* - Овој параметер означува ден во неделата. Вредноста е помеѓу 0 и 7. Денот недела се означува како 0 или 7 или текстуално на англиски јазик со користење на првите три букви од денот (Mon – Sun);

*user* - Името на корисникот со кое се извршува наредбата;

*command* - Ова е самата наредба којашто сакаме да ја извршиме. Ова поле може да содржи повеќе наредби според правилот за извршување на наредби внесени во една линија;

Доколку не сакате некоја од овие променливи полиња да ги специфицирате, во тој случај ставете ѕвезда ‘\*’.

На пример:

```
 01 * * * * root echo "Hello"
```

Испис на зборот "Hello" секој час во 01 минута.

```
 17 20 * * * root date
```

Приказ на системското време секој ден во 20:17.

```
 00 4 * * 0 root rm –fr /tmp/*
```

Оваа наредба (безусловно рекурзивно бришење на сите податотеки во /tmp/ директориумот) ќе биде извршена секоја недела во 4 часот наутро.

Кога двете полиња dom и dow се внесени, наредба се извршува кога било кој од двата услова е исполнет.

Пример:

```
 * 12 16 * 1 root /scripts/backup-make
```

Условите во полињата налагаат извршување на оваа наредба секој понеделник и секој 16-ти на пладне. Истиот резултат би го добиле ако се употребат следниве две наредби:

```
 * 12 16 * * root /scripts/backup-make
 * 12 * * 1 root /scripts/backup-make
```

Самите параметри во полињата може да бидат и листа од параметри одделени со запирака, или интервал со користење на цртичка.

Пример:

```
 59 11 * * 1,2,3,4,5 root /scripts/proverka.sh
```

Ќе се изврши во 11:59 секој понеделник, вторник и среда. Истото би го добиле и со:

```
 59 11 * * 1-5 root /scripts/proverka.sh
```

Cron исто така поддржува и употреба на 'step' променливи.

Вредноста \*/2 во dom полето, значи дека наредбата ќе се извршува секој втор ден, а \*/5 во полето за минути овозможува извршување на секои пет минути.

Пример:

```
 * 12 10-16/2 * * root backup.sh
```

е исто со:

```
 * 12 10,12,14,16 * * root backup.sh
```

```
 */15 9-17 * * * root reset-adsl.test
```

Секои 15 минути помеѓу 9 и 15 часот.

Коментари се дозволени во crontab, но тие мора да започнат со '#';

Повеќекориснички cron
---------------------

Сите Unix засновани оперативни системи се повеќекориснички. Cron е апликација која е поддржана од ваквите оперативни системи. Секој од корисниците може да имаат свој crontab којшто може да биде менуван, уредуван и избришан од корисникот. Crontab податотеките се наоѓаат најчесто во /var/spool/cron/ (RedHat, Fedora) или во /var/cron/tabs/ (SUSE).

За уредување (или создавање) на лична crontab податотека се користи наредбата, crontab -e

Личната crontab податотека го има потполно истиот облик како и основната /etc/crontab со исклучок на променливата MAILTO во првиот дел од податотеката која и не е неопходна за функционирање на crontab.

Во овој случај, кај мултикоричка употреба на crontab не е задолжителна употребата на корисничкото поле во crontab наредбите.

Доколку сакате можно е и уредување на crontab без употреба на crontab –e наредбата. Со уредувач на текст создаваме податотека која со crontab наредба ја предаваме на crontab активната податотека. На пример доколку создаваме податотека со име sasocron.test, неопходно е користење на:

```
 [saso@marco /]$ crontab sasocron.test
```

Други корисни наредби околу crontab се:

```
 [saso@marco /]$ crontab –l
```

преглед на моменталниот crontab, и

```
 [saso@marco /]$ crontab –r
```

за бришење на crontab.

Корисниците со root привилегии може да уредуваат туѓи crontab податотеки со употреба на:

```
 [saso@marco /]$ crontab -u
```

по што следи името на корисникот и соодветната наредба -e, -l или -r.

Контрола на пристап до Cron
---------------------------

Cron има можност за ограничување на пристапот до crontab. Ова е овозможено со употреба на /etc/cron.allow и /etc/cron.deny податотеките. Овие податотеки работат на ист начин како и allow/deny податотеките кај другите демони (пр. httpd, squid). За да забраните одреден корисник да има пристап до crontab доволно е да се стави неговото име во cron.deny, за овозможување на употреба на crontab ставете го корисничкото име во cron.allow. Доколку сакате на сите корисници да им биде забрането користењето на crontab, внесете ALL во cron.deny податотеката:

```
 [root@marco etc]$ echo ALL >>/etc/cron.deny
```

Доколку сакате да овозможите корисникот saso да користи crontab, направете го следново:

```
 [root@marco etc]$ echo saso >>/etc/cron.allow
```

Доколку не постои cron.allow или cron.deny податотеката, тогаш употребата на crontab е дозволено за сите корисници.

Излезни параметри на Cron
-------------------------

Излезните параметри од cron се праѓаат како mail пораки до корисникот со кој е извршена комнадата, или до корисникот кој е посочен во MAILTO параметарот.

Но тоа не е единствен избор. Можно е создавање на логови, текстуални податотеки, коишто може во иднина да служат и како референца за анализа или преглед на успешно односно неуспешно извшување на наредбите посочени во crontab.

Доколку сакаме излезните параметри од cron да бидат пратени на емаил до некој корисник што не е дел од постоечкиот сметачки систем можно е користење на целосни е-поштенски адреси.

Следи пример за двата случаи:

```
 0 16 * * 5 /scripts/vikend.sh | mail -s "VIKEND" saso
```

и

```
 0 16 * * 5 /scripts/vikend.sh | mail -s "VIKEND" sstojanovski@mt.net.mk
```

Доколку имате наредба која се извршува многу често и не сакате секојпат cron да дава излезна вредност за таа наредба може излезот да го насочите во /dev/null.

```
 0 0 1 * * /scripts/sinhroniziraj > dev/null
```

ПРенасочувањето на излезните параметри од наредбите во crontab се можни и во податотека:

```
 0 3 * * * /scripts/rotiraj-log >> log.file
```

Забележете ја употребата на двојниот ">" знак, со цел да не дојде до пребришување на старата содржина во log.file податотеката.

Досегашните примери вршеа редирекција на стандарниот излез од crontab наредбите, но не и на стандарната грешка. За да се запише целосниот излез се користи "2>&1"

```
 0 3 * * * /scripts/rotiraj-log >> log.file 2>&1
```