draft 1/2
This commit is contained in:
commit
64109bb35a
44
README.md
Normal file
44
README.md
Normal file
@ -0,0 +1,44 @@
|
||||
# Python-скрипт для наблюдения и разбора как служба Linux
|
||||
|
||||
|
||||
Чтобы превратить Python-скрипт в службу Linux, вы можете использовать systemd, систему инициализации, используемую в большинстве дистрибутивов Linux. Вам потребуется создать файл службы systemd, который будет запускать ваш Python-скрипт.
|
||||
|
||||
Вот шаги, которые вам нужно выполнить:
|
||||
|
||||
1. Создайте файл службы systemd. Этот файл обычно находится в каталоге `/etc/systemd/system/`. Назовите его, например, `my_python_service.service`.
|
||||
|
||||
2. В этом файле укажите следующее:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=My Python Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/python3 /path/to/your/python/script.py
|
||||
Restart=always
|
||||
User=username
|
||||
Group=groupname
|
||||
Environment=NAME=value
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
В этом файле:
|
||||
|
||||
- `Description` - это описание вашей службы.
|
||||
- `After` - это указание systemd запускать вашу службу после того, как сеть будет доступна.
|
||||
- `ExecStart` - это команда, которую systemd выполнит для запуска вашей службы. Укажите здесь путь к вашему Python-скрипту.
|
||||
- `Restart` - это указание systemd перезапустить вашу службу, если она упадет.
|
||||
- `User` и `Group` - это имя пользователя и группы, от имени которых будет запущена ваша служба.
|
||||
- `Environment` - это переменные окружения, которые будут установлены при запуске вашей службы.
|
||||
- `WantedBy` - это указание systemd, когда должна быть запущена ваша служба.
|
||||
|
||||
3. После создания файла службы systemd, вы должны обновить systemd, чтобы он знал о вашей новой службе. Вы можете сделать это с помощью команды `systemctl daemon-reload`.
|
||||
|
||||
4. Теперь вы можете запустить вашу службу с помощью команды `systemctl start my_python_service`.
|
||||
|
||||
5. Если вы хотите, чтобы ваша служба автоматически запускалась при загрузке системы, вы можете включить ее с помощью команды `systemctl enable my_python_service`.
|
||||
|
||||
Пожалуйста, замените `/path/to/your/python/script.py`, `username`, `groupname` и `NAME=value` на соответствующие значения для вашего скрипта и системы.
|
66
main.py
Normal file
66
main.py
Normal file
@ -0,0 +1,66 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import time
|
||||
import sys
|
||||
import signal
|
||||
import toml
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def print_hi(name):
|
||||
# Use a breakpoint in the code line below to debug your script.
|
||||
print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.\
|
||||
|
||||
|
||||
# Обработчик сигнала SIGTERM (сигнал остановки от systemd)
|
||||
def handler_stop(signum, frame) -> None:
|
||||
print(f'Terminate by signal: {signum}')
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
# Чтение файла конфигурации
|
||||
def read_toml(file_path):
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
data = toml.load(file)
|
||||
return data
|
||||
except FileNotFoundError:
|
||||
print(f"Config `{file_path}` not found.")
|
||||
sys.exit(1)
|
||||
except toml.decoder.TomlDecodeError as e:
|
||||
print(f"Error decoding config-file from `{file_path}`: {e}.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# Press the green button in the gutter to run the script.
|
||||
if __name__ == '__main__':
|
||||
# Установка обработчика сигнала
|
||||
signal.signal(signal.SIGTERM, handler_stop)
|
||||
# Считывание имени config-файла их аргументов командной строки
|
||||
try:
|
||||
config_file = sys.argv[1] # первый аргумент после имени скрипта
|
||||
except IndexError:
|
||||
config_file = "tacacs_watcher.conf"
|
||||
# Чтение файла конфигурации, приветствие и выставление интервала
|
||||
config = read_toml(config_file)
|
||||
if 'hello' in config:
|
||||
print(config['hello'])
|
||||
interval = config['interval'] if 'interval' in config else 1
|
||||
# получаем все группы в конфиге
|
||||
group_keys = [key for key, value in config.items() if isinstance(value, dict)]
|
||||
for group in group_keys:
|
||||
print(group)
|
||||
|
||||
# все обработчики в этом цикле
|
||||
try:
|
||||
while True:
|
||||
# вечный цикл, чтобы программа не завершилась никогда (только принудительно или через SIGTERM)
|
||||
print_hi('PyCharm')
|
||||
time.sleep(interval)
|
||||
except KeyboardInterrupt:
|
||||
print('Terminate by `KeyboardInterrupt`.')
|
||||
sys.exit(0)
|
||||
except ValueError:
|
||||
print('Error value in config-file.')
|
||||
|
16
tacacs_watcher.conf
Normal file
16
tacacs_watcher.conf
Normal file
@ -0,0 +1,16 @@
|
||||
# Это сообщение будет напечатано в консоль при старте
|
||||
hello = "Start watcher log-файлов TACACS+"
|
||||
# Количество секунд между проверками log-файлов (если не указано = 1)
|
||||
interval = 15
|
||||
|
||||
|
||||
# Группа настроек (каждая группа для одного входящего лога).
|
||||
# Хотя бы одна группа (например [default]) должна быть обязательно
|
||||
[default]
|
||||
# Log-файл, который будет мониториться
|
||||
log_in = "M:\\PRJ\\2023_tacacs_watcher\\in\\tac_1.acc"
|
||||
# Каталог, в который будут разложены log-срезы (каталог должен существовать)
|
||||
outdir = "M:\\PRJ\\2023_tacacs_watcher\\out"
|
||||
# Регулярное выражение для поиска в log-файле
|
||||
regexp = ".*"
|
||||
|
Loading…
Reference in New Issue
Block a user