Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions text/00209.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
## Его темнейшество cron

Не знаю как у вас, но у меня с cronом не задалось с самых юных лет. Этот планировщик для автозапуска скриптов довел меня до ручки, хоть и весьма полезен.

Ну не делать же резервные копии каждое утро руками. Или там связь проверять раз в 10 минут. Или мусор чистить на сервере - попробуй уследи без автомата. Вот и приходится идти к cronу на поклон.

### "Куда-ж тебя?" или как я запускал cron

Первое воспоминание, которое я с трепетом храню с самого детского сада, связано с попытками выйти из редактора crontab'а. Crontab - `/etc/crontab` - это такой файл со списком задач, по которому работает cron.

Чтобы не заниматься жуткой магией с запихиванием обновленного файла в котлы памяти работающего crona я решил воспользоваться командой

```
crontab -e
```

Команда эта позволяет сначала отредактировать crontab, а после сохранения подскажет демону заглянуть в этот файл за новыми грешниками. Сама.

Пусть многие скажут, что cron и сам все видит, я все же набил себе пару шишек на том, что это не всегда так.

Кабы там ни было - решено и сделано: `crontab -e`

### Приспешник vi или казнь редактором списка задач

Что такое `vim` и `vi` я тогда не знал, а именно `vi` стоял редактором по-умолчанию на серваке с FreeBSD 4.0, на котором я колдовал. Может быть вам повезло и в вашей системе стоит по-умолчанию простой текстовый редактор, но мне - не повезло.

Вскоре поняв что я не могу выбраться из лабиринта кронотавра, я запаниковал.

Помню как хаотично я тыкал на кнопки и гуглил что попало, а заветный ctrl+c напрочь отказывался выполнять свою магическую функцию спасения моей души.

"Божечки, только выйди, выйди Христа ради, да и бес уже с ним, с сохранением!"

Кнопка `Esc`, а потом `:q!`

Я уже и не помню из каких хтонических глубин ада выскочило это неведомое сочетание, но помню как дрожащими руками вытер холодный пот с расслабленного лба. Сработало. И даже не сохранилось то что я там в стрессе понатыкал. Фух. Слава богам.

Как вообще про это можно догадаться?

На протоптанной дорожке документации по `vi` нашлось и другое буквосочетание.

`:wq`

И я даже узрел в нем сакральный смысл - Write, Quit. Вход-выход-сохранить - разобрался.

С этой душещипательной истории началось мое знакомство с cronoм. И тогда же я понял, насколько травмирующим для неокрепшей детской психики он может быть.

Если вдруг кто сомневается, почитайте про гекатомбы жертв в блоге Stack Overflow: [Helping One Million Developers Exit Vim](https://stackoverflow.blog/2017/05/23/stack-overflow-helping-one-million-developers-exit-vim/)

Название поста говорит само за себя и теперь там уже два миллиона. Хотя, казалось-бы, при чем тут cron.

Это сейчас я знаю что cron тут (почти) не при чем и можно воспользоваться более удобным редактором. Cron берет его из переменной окружения `EDITOR`. Например на ubuntu есть nano, но мне больше нравится mcedit. С самого Norton Commanderа храню нежную любовь к синему фону:

```
EDITOR=mcedit crontab -e
```

Ну или вот ваш nano:

```
EDITOR=nano crontab -e
```

А на некоторых современных дистрибутивах можно выбрать редактор при помощи команды
```
select-editor
```

Но если вдруг других вариантов нет, то на всякий случай я скажу - перед дальнейшими действиями уберите слабонервных и детей от консоли. И только потом начинайте редактировать:

`Esc` потом `:i`

Теперь вы в "режиме вставки" (которых в vi аж два) и можете перемещать курсор в нужное место. И в нужном месте вставлять текст. Похоже на обычный текстовый редактор.

А если что-то не получается, то лучше пройти какое-то обучение. Самое необычное и прикольное, которое я видел - [Vim Adventures](https://vim-adventures.com/)

### Расшифровка древних скрижалей или как я постигал формат записи о задаче

Что-ж. Пожалуй где-то к этому моменту вам должно быть ясно как изменять crontab. Ну как ясно. Примерно как близорукому без очков. А вот что туда надо писать для запуска задачи пока видно только слепому Вельзевулу.

Пытаясь разглядеть что ему там видно, я доедал 127 страницу `man crontab` и выяснил, что каждая строка в этом файле указывает `когда` и `что запускать`. При этом выглядит она примерно так:

```
0 0 * * * /home/lup/backup_database.sh
```

Если с правой частью `что запускать` мне все было понятно - это путь к скрипту-задаче, то глядя на левую часть `когда` я понял, что не зря службы в linuxе называют демонами. Этот демон готовил мне второй круг ада.

Итак, что тут за клинопись:

```
[минуты] [часы] [число] [месяц] [день_недели]
```

Слово "каждый" или "любой" заменяется звёздочкой `*`.

* Запускать кукушку каждый час, т.е. в 6:00, 7:00, 8:00, …, 23:00, 0:00 и т.д. - `0 * * * *`.

* Запускать бэкап в 4:00 по понедельникам - `0 4 * * 1`. 4:00 самое тихое время.

* Запускать расчет зарплаты один раз в месяц в 11:00 первого числа - `0 11 1 * *`

Угадайте, могу ли я написать эти руны не заглядывая в `man crontab`? Могу , но только если нужный порядок указан комментарием в файле.

Однажды, в очередной раз борясь с cronом я увидел то, что стало стаканом воды для иссушенного горла. Можно использовать псевдонимы времени!

```
@hourly /home/clock/coocoo.sh
@daily /home/bath/brush_teeth.sh
@weekly /home/flat/tidy_up.sh
@monthly /home/job/get_salary.sh
```

Слава богам! Так намного лучше! Теперь я использую только их. После стольких лет мучений демон подарил мне надежду - я могу писать `@daily`! Видимо потом он хочет ее разрушить, но пока - нет.

### Котел с правами или почему может задача забыла сработать

В третьем кругу ада я оказался позднее. Как-то раз, настроив скрипт бэкапа базы данных я расслабился. Ну все, теперь у меня есть ежедневная копия на специальном серваке. Могу не бояться. База в надёжных руках крона. Ага.

База рухнула. Гордым уверенным шагом я вошёл на сервер в папку с бэкапами. Оглядевшись по сторонам, я понял, что в папке - пусто.

"Надо было проверить на следующий день после настройки!" - рвал я на себе волосы. Но лысой головой не проще думать как восстановить базу.

После того, как база была вновь поднята, я решил понять, почему не работает cron. И оказалось, что crontabы у каждого пользователя свои и права на выполнение задач у них ограничены.

С тех пор только root, только системный crontab

```
sudo crontab -e
```

А всякие советы вроде "Executing cron tasks under root user is not preferred" вызывают у меня грустную ухмылку. Особенно когда читаю в новостях про проблемы с резервными копиями.

Ну и вы проверьте, стартует ли задача как надо. На всякий случай.

```
grep CRON /var/log/syslog
```

В четвертом круге ада я оказался, когда понадеялся на переменные окружения и пути. С тех пор для каждой задачи я пишу отдельный sh-скрипт, а все данные и пути указываю в нем полностью. И все примеры в этой статье я сделал со скриптами именно поэтому. Хотя у скриптов есть ещё одно преимущество - я могу править их сколько угодно и не трогать настроенный cron. Детская травма, которой вам удалось избежать. Надеюсь.

### Заключение о мануалах. Или нет

В остальные круги ада я пока не попал, но одним философским вопросом я задаюсь. Зачем делать сложно и писать мануал? Ведь если сделать просто, мануал будет лишним.
7 changes: 7 additions & 0 deletions vectors/107/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"topics": ["Cron", "Linux", "Командная строка", "Терминал"],
"category": "Linux",
"img": "/img/nodejs.png",
"type": "vector",
"name": "Linux"
}
5 changes: 5 additions & 0 deletions vectors/107/stages/00.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "Его темнейшество cron",
"type": "text",
"id": 209
}
4 changes: 4 additions & 0 deletions vectors/107/text.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Сложно заниматься разработкой и избежать работы с Linux. Эта операционная система - стандарт де-факто на многих серверах.

Поработав с этой ОС разработчики нередко выбирают ее в качестве основной - удобство использования,
огромный инструментарий, бесплатность и открытость делают свое дело.