package linuxmodules import ( "rubric/utils" ) var LogsModule = Module{ Key: "logs", Aliases: []string{"l", "cron", "логи"}, Title: "Логирование и планировщики", Description: "Темы 36–37: rsyslog, journald, cron, at", Run: showLogs, } func showLogs() { utils.Header("Linux — Логирование и планировщики задач") // ─── 36. Логирование ────────────────────────────────────────── utils.Section("36. Логирование") utils.Println("В современных системах логирование — двухуровневое:") utils.Println("journald (systemd) + rsyslog/syslog (традиционный)") utils.Println(utils.ColorBold + "\nОсновные лог-файлы в /var/log/:" + utils.ColorReset) utils.Code(`/var/log/syslog — общий системный лог (Debian/Ubuntu) /var/log/messages — общий системный лог (RHEL/Fedora) /var/log/auth.log — аутентификация, sudo, ssh (Debian) /var/log/secure — аутентификация (RHEL) /var/log/kern.log — сообщения ядра /var/log/dmesg — сообщения при загрузке /var/log/boot.log — процесс загрузки /var/log/cron — задания cron /var/log/mail.log — почтовый сервер /var/log/nginx/ — access.log, error.log /var/log/apache2/ — access.log, error.log /var/log/mysql/ — error.log /var/log/dpkg.log — установка пакетов (Debian) /var/log/dnf.log — установка пакетов (RHEL) /var/log/wtmp — история входов (last для чтения) /var/log/btmp — неудачные попытки входа (lastb) /var/log/lastlog — последний вход каждого пользователя`) utils.Println(utils.ColorBold + "Работа с логами:" + utils.ColorReset) utils.Command("tail -f /var/log/syslog", "следить за системным логом") utils.Command("tail -n 100 /var/log/auth.log", "последние 100 строк лога входов") utils.Command("grep 'ERROR' /var/log/nginx/error.log", "ошибки nginx") utils.Command("grep -i 'failed' /var/log/auth.log", "неудачные входы") utils.Command("zcat /var/log/syslog.1.gz", "читать сжатый архивный лог") utils.Command("zgrep 'error' /var/log/syslog.*.gz", "поиск в архивных логах") utils.Command("last", "история входов в систему") utils.Command("lastb", "неудачные попытки входа (root)") utils.Command("lastlog", "последний вход каждого пользователя") utils.Println(utils.ColorBold + "\nrsyslog — конфигурация:" + utils.ColorReset) utils.Code(`# Конфиг: /etc/rsyslog.conf и /etc/rsyslog.d/*.conf # Формат правил: facility.priority назначение # Facility (источник): auth, authpriv — аутентификация cron — планировщик daemon — системные демоны kern — ядро mail — почта user — пользовательские программы local0..local7 — зарезервированы для своего использования * — все # Priority (уровень, по возрастанию важности): debug, info, notice, warning, err, crit, alert, emerg # Примеры правил: *.info;mail.none;authpriv.none /var/log/messages # всё кроме mail и auth authpriv.* /var/log/secure # всё от authpriv mail.* /var/log/maillog # почта cron.* /var/log/cron # cron *.emerg :omusrmsg:* # критичное — всем пользователям local1.* /var/log/myapp.log # своё приложение # Перезапустить rsyslog: sudo systemctl restart rsyslog`) utils.Println(utils.ColorBold + "logrotate — ротация логов:" + utils.ColorReset) utils.Code(`# Конфиг: /etc/logrotate.conf и /etc/logrotate.d/* # Пример /etc/logrotate.d/nginx: /var/log/nginx/*.log { daily # каждый день missingok # не ошибаться если файл отсутствует rotate 14 # хранить 14 архивов compress # сжимать gzip delaycompress # не сжимать текущий архив notifempty # не ротировать пустые файлы create 0640 nginx adm # создать новый файл с правами sharedscripts postrotate nginx -s reopen # сообщить nginx открыть новый файл endscript } # Ручная ротация (тест): sudo logrotate -d /etc/logrotate.d/nginx # -d = dry run`) // ─── 37. Планировщики ───────────────────────────────────────── utils.Section("37. Планировщики задач: cron и at") utils.Println(utils.ColorBold + "cron — периодические задачи:" + utils.ColorReset) utils.Code(`# Редактировать crontab текущего пользователя: crontab -e # Посмотреть: crontab -l # Удалить все задачи: crontab -r # Для root: sudo crontab -e # Формат строки crontab: # мин час день_месяца месяц день_недели команда # 0-59 0-23 1-31 1-12 0-7(0,7=воскресенье) # Примеры: * * * * * /script.sh # каждую минуту 0 * * * * /script.sh # каждый час в 0 минут 0 2 * * * /backup.sh # каждый день в 02:00 0 2 * * 0 /weekly.sh # каждое воскресенье в 02:00 0 2 1 * * /monthly.sh # 1-го числа каждого месяца */5 * * * * /check.sh # каждые 5 минут 0 9-17 * * 1-5 /work.sh # по будням с 9 до 17 0 2 * * * root /root/backup.sh # в /etc/crontab с указанием пользователя # Специальные строки: @reboot /script.sh # при каждой загрузке @daily /script.sh # раз в день (= 0 0 * * *) @weekly /script.sh # раз в неделю @monthly /script.sh # раз в месяц @yearly /script.sh # раз в год`) utils.Println(utils.ColorBold + "Системные cron-директории:" + utils.ColorReset) utils.Code(`/etc/crontab — системный crontab (с полем user) /etc/cron.d/ — отдельные файлы crontab /etc/cron.hourly/ — скрипты, запускаемые каждый час /etc/cron.daily/ — каждый день /etc/cron.weekly/ — каждую неделю /etc/cron.monthly/ — каждый месяц # Поместить скрипт в /etc/cron.daily/: sudo cp backup.sh /etc/cron.daily/ sudo chmod +x /etc/cron.daily/backup.sh`) utils.Println(utils.ColorBold + "at — однократные задачи:" + utils.ColorReset) utils.Code(`# Выполнить команду однократно в указанное время: at 14:30 # в 14:30 сегодня at 14:30 tomorrow # завтра в 14:30 at 14:30 July 15 # 15 июля at now + 1 hour # через час at now + 30 minutes # через 30 минут # Ввод команд (Ctrl+D для завершения): at 02:00 > /usr/local/bin/backup.sh > Ctrl+D # Список задач: atq at -l # Удалить задачу: atrm 5 # удалить задачу №5 # Посмотреть содержимое задачи: at -c 5`) utils.Footer() }