summaryrefslogtreecommitdiff
path: root/PYTHON/DAEMON на Python.md
blob: 94416cc356d5d178dc4acde5ac430c4cd65c76f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

Демон — это процесс, который работает в фоновом режиме, обычно без прямого взаимодействия с пользователем. Демоны часто запускаются системой при старте и продолжают работать независимо от пользовательских сеансов.

### Разница между демоном и обычным процессом

Отличие демона от обычного процесса состоит в том, что демон отделён от терминала, не имеет своего интерфейса ввода-вывода и продолжает работать в фоновом режиме, даже когда пользователь завершает свою сессию.

### Области применения демонов

- Проверка состояния серверов и служб.
- Автоматическая фоновая обработка данных.
- Выполнение периодических задач, таких как обновление баз данных или отправка отчетов.

## Основные библиотеки для создания демонов

Для создания демонов на языке Python существует несколько популярных библиотек:

- `daemon`: Простая и удобная библиотека для создания демонов.
- `systemd`: Более продвинутый инструмент для управления демонами, интегрированный с системой и использующий все её возможности.
- `multiprocessing`: Позволяет создавать многопроцессорные приложения с функциональностью демонов.

### Преимущества и недостатки каждой библиотеки

- **daemon**:
- Преимущества: Простота использования.
- Недостатки: Ограниченные возможности конфигурации и интеграции с системой.
    
- **systemd**:
- Преимущества: Глубокая интеграция с системой, мощные возможности конфигурации.
- Недостатки: Требует знания специфики конфигурации systemd.
    
- **multiprocessing**:
- Преимущества: Поддержка многопроцессорных задач.
- Недостатки: Сложность в настройке и управлении демонами.

## Подготовка окружения Python

Перед тем как начать писать код демона, необходимо установить необходимые библиотеки и настроить окружение Python.

### Установка необходимых библиотек

```plain
pip install daemon
```

## Написание базового демона

Создадим базовую структуру демона, уделяя внимание функции `run_as_daemon()`.

### Создание базовой структуры демон-программы

```python
import daemon
import time

def run() -> None:
    """Основная функция работы демона."""
    while True:
        print('Демон работает...')
        time.sleep(5)

if __name__ == '__main__':
    with daemon.DaemonContext():
        run()
```

## Логирование и какие библиотеки использовать

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

### Примеры настройки логирования

```python
import logging

logging.basicConfig(level=logging.INFO, filename='daemon.log')

def run() -> None:
    """Основная функция работы демона с логированием."""
    while True:
        logging.info('Демон работает...')
        time.sleep(5)
```

## Обработка сигналов

Сигналы позволяют управлять работой демона, например, корректно завершить его работу.

### Объяснение, что такое сигналы и как их обработка помогает управлять демоном

Сигналы — это механизмы межпроцессного взаимодействия, позволяющие одному процессу посылать уведомления другому.

### Примеры обработки сигналов, таких как SIGTERM и SIGINT

```python
import signal

def handle_signal(signum: int, frame) -> None:
    """Обработка сигнала завершения."""
    logging.info('Демон завершает работу...')
    exit(0)

signal.signal(signal.SIGTERM, handle_signal)
signal.signal(signal.SIGINT, handle_signal)
```

### Создание systemd юнита для автоматического запуска демона
```sh
[Unit]
Description=Мой Демон

[Service]
ExecStart=/path/to/your/daemon

[Install]
WantedBy=multi-user.target
```

### Как управлять демоном с помощью системных команд
```sh
sudo systemctl start my-daemon.service
sudo systemctl stop my-daemon.service
sudo systemctl enable my-daemon.service
sudo systemctl disable my-daemon.service
```