173 lines
9.5 KiB
Markdown
173 lines
9.5 KiB
Markdown
---
|
||
title: Automating Tasks
|
||
localeTitle: Автоматизация задач
|
||
---
|
||
### Автоматизация задач или планирование задач
|
||
|
||
Существует функция Linux, которая используется исключительно на веб-сервере, известном как CRON Поскольку мы знаем, что одна из самых привлекательных особенностей любого веб-сервера заключается в том, что это всегда включен и всегда подключен к Интернету. Это означает, что мы можем дать указание наш сервер для выполнения задач автоматически, без необходимости ввода команды в оболочку. Одна из наиболее часто используемых программ для выполнения _других программ_ с регулярной частотой называется `cron` . Давайте посмотрим, как использовать `cron` чтобы запланировать запуск программы.
|
||
|
||
Программа `cron` является частью семейства программ, называемых **демонами** . Демон это программа, которая всегда работает на фоне нашего компьютера. Первый, посмотрим, работает ли `cron` . Мы можем получить список всех запущенных программ с командой `ps` при использовании флага `-A` :
|
||
|
||
\`\` \`{r, engine = 'bash', eval = FALSE} ps -A
|
||
|
||
## PID TTY TIME CMD
|
||
|
||
## 1? 00:00:13 systemd
|
||
|
||
## 2? 00:00:00 kthreadd
|
||
|
||
## 3? 00:00:03 ksoftirqd / 0
|
||
|
||
## 5? 00:00:00 kworker / 0: 0H
|
||
|
||
## 7? 00:00:11 rcu\_sched
|
||
|
||
## 8? 00:00:00 rcu\_bh
|
||
|
||
## 9? 00:00:00 миграция / 0
|
||
|
||
## ...
|
||
```
|
||
You probably have a huge list of programs in your terminal now! Instead of
|
||
shifting through this listing line-by-line, let's pipe the output of this command
|
||
to `grep` and we'll look for `cron`:
|
||
```
|
||
|
||
{r, engine = 'bash', eval = FALSE} ps -A | grep "cron"
|
||
|
||
## 1273? 00:00:01 cron
|
||
```
|
||
# You might or might not get a `cron` running .
|
||
|
||
Looks like the `cron` daemon is running! In order to assign programs to be
|
||
executed with `cron` we need to edit a special text file called the `cron`
|
||
table. Before we edit the `cron` table we need to select the default text
|
||
editor. If you like using `nano` (the text editor we've been using throughout
|
||
this book) then enter `select-editor` into the console, type in the number
|
||
that corresponds to `nano` (usually `2`) and then press enter:
|
||
```
|
||
|
||
{r, engine = 'bash', eval = FALSE} выберите редактор
|
||
|
||
## Выберите редактор. Чтобы изменить позже, запустите «select-editor».
|
||
|
||
## 1\. / bin / ed
|
||
|
||
## 2\. / bin / nano <---- easyiest
|
||
|
||
## 3\. /usr/bin/vim.basic
|
||
|
||
## 4\. /usr/bin/vim.tiny
|
||
|
||
## Выберите 1-4 \[2\]:
|
||
```
|
||
Now that we've chosen a text editor we can edit the `cron` table using the
|
||
command `crontab -e` (**`cron`** **tab**le **e**dit) which will automatically
|
||
open `nano` with the appropriate file.
|
||
```
|
||
|
||
{r, engine = 'bash', eval = FALSE} crontab -e
|
||
|
||
# Отредактируйте этот файл, чтобы ввести задачи, которые будут выполняться cron.
|
||
|
||
#
|
||
|
||
# Команда m h dom mon dow
|
||
```
|
||
Let's go over the layout of the `cron` table. First you should notice that any
|
||
text after a pound sign (`#`) is a comment, so it's not seen by `cron` (just
|
||
like bash comments). The `cron` table has six columns:
|
||
|
||
1. Minute (`m`)
|
||
2. Hour (`h`)
|
||
3. Day of Month (`dom`)
|
||
4. Month (`mon`)
|
||
5. Day of Week (`dow`)
|
||
6. Command to be run (`command`)
|
||
|
||
Each column is separated by a single space in the table. The first five columns
|
||
allow you to specify when you want a particular command to be run. Only certain
|
||
values are valid in each column:
|
||
|
||
1. Minute: `00 - 59` (A particular minute in an hour)
|
||
2. Hour: `00 - 23` (0 is the midnight hour)
|
||
3. Day of Month: `01 - 31` (1 is the first day of the month)
|
||
4. Month: `01 - 12` (1 is January)
|
||
5. Day of Week `0 - 6` (0 is Sunday)
|
||
|
||
There are also a few other characters that are valid in the `cron` table. The
|
||
most commonly used character is a star (`*`) which represents *all* of the
|
||
possible values in a column. So a star in the Minute column means "run every
|
||
minute," and a star in the Hour column means "run during every hour."
|
||
Knowing this let's make our first entry in the `cron` table. If we want a
|
||
command to be executed every minute, during every hour, on every day of the
|
||
month, during every month, on every day of the week, then we can put stars in
|
||
all of the first five
|
||
columns, followed by the command that we want to run. In this case the command
|
||
that `cron` will run every minute will be `date >> ~/date-file.txt`, which will
|
||
append the date and time when the command is executed to a file in our home
|
||
directory called `date-file.txt`. This is what your `cron` table should look
|
||
like before you save and exit from `nano`:
|
||
```
|
||
|
||
# Отредактируйте этот файл, чтобы ввести задачи, которые будут выполняться cron.
|
||
|
||
#
|
||
|
||
# Команда m h dom mon dow
|
||
|
||
* \* \* \* \* дата >> ~ / date-file.txt
|
||
```
|
||
Save and exit `nano` just like you would for a regular text file and then wait
|
||
a little bit! After a minute has gone by use `cat` to look at `~/date-file.txt`:
|
||
```
|
||
|
||
{r, engine = 'bash', eval = FALSE} CD cat date-file.txt
|
||
|
||
## Чт 8 июн 18:50:01 UTC 2017
|
||
```
|
||
Look like our entry in the `cron` table is working! Wait another minute and then
|
||
look at the file again:
|
||
```
|
||
|
||
{r, engine = 'bash', eval = FALSE} cat date-file.txt
|
||
|
||
## Чт 8 июн 18:50:01 UTC 2017
|
||
|
||
## Чт 8 июн 18:51:01 UTC 2017
|
||
```
|
||
Unless we delete the line that we entered in the `cron` table, the output from
|
||
`date` will be appended to `date-file.txt` every minute.
|
||
|
||
The single line of bash `date >> ~/date-file.txt` is a much simpler program than
|
||
we would probably use in a `cron` table, though it's good for illustrating how
|
||
a `cron` table works. If you want to do more complex tasks with `cron` it's
|
||
better for `cron` to execute a bash script that you've written in advance. That
|
||
way you can just specify `bash /path/to/script.sh` in the last column of the
|
||
table.
|
||
|
||
Using stars in all columns is the simplest line of a `cron` table, so let's
|
||
look at some examples of more complex table entries:
|
||
```
|
||
|
||
# Команда m h dom mon dow
|
||
|
||
00 \* \* \* \* bash /path/to/script.sh # Работает каждый час в начале часа 00 12 \* \* \* bash /path/to/script.sh # Работает каждый день в полдень
|
||
|
||
* 12 \* \* \* bash /path/to/script.sh # Работает каждую минуту с 12 до 12:59. 00 00 05 \* \* bash /path/to/script.sh # Запускает 5-й день каждого месяца в полночь 00 00 \* 07 \* bash /path/to/script.sh # Работает каждый день в июле месяце в полночь 00 00 \* \* 2 bash /path/to/script.sh # Работает каждый вторник в полночь
|
||
```
|
||
Besides numbers and the star there are a few other characters that you can use
|
||
in `cron` table columns including a hyphen (`-`) for specifying ranges and a
|
||
comma (`,`) for specifying lists of items. For example `00-29` in the Minutes
|
||
column would specify the first thirty minutes of an hour, while `1,5` in the
|
||
Day of Week column would specify Monday and Friday.
|
||
|
||
Let's take a look at another example of a `cron` table that uses hyphens and
|
||
ranges so you can get a sense of how each character works.
|
||
```
|
||
|
||
# Команда m h dom mon dow
|
||
|
||
00-04 \* \* \* \* bash /path/to/script.sh # Работает каждую минуту в течение первых пяти минут каждого часа 00 00 \* \* 0,6 bash /path/to/script.sh # Работает в полночь каждую субботу и воскресенье 00 03 01-15 \* \* bash /path/to/script.sh # Работает в 3 часа ночи в течение первых пятнадцати дней каждого месяца 00,30 \* \* \* \* bash /path/to/script.sh # Работает в начале и в середине каждого часа 00 00,12 \* \* \* bash /path/to/script.sh # Работает каждый день в полночь и полдень 00 \* 01-07 01,06 \* bash /path/to/script.sh # Работает в начале каждого часа в течение первых семи дней января и июня \`\` \`
|
||
|
||
Программа, управляемая `cron` настолько же мощна, как ваше воображение можно растянуть! Если вы знакомы с социальной сетью [Twitter,](https://twitter.com/) то вы, возможно, натолкнулись на некоторые Twitter учетные записи, которые автоматически создают сообщения [Emoji Aquarium](https://twitter.com/emojiaquarium) , [Фотографии старого фрукта](https://twitter.com/pomological) или [Бесконечный крик](https://twitter.com/infinite_scream) . Многие из этих "ботов" учетные записи работают на `cron` , который использует HTTP API HTTP для отправки твитов регулярно. |