Оптимизация времени загрузки системы с systemd-analyze
Когда Linux загружается слишком долго, то сначала необходимо определить, какие службы тормозят процесс. Для этого в
1️⃣ Анализ общего времени загрузки
Вывод покажет время, затраченное на:
прошивку (firmware)
загрузчик (bootloader)
ядро (kernel)
службы systemd (userspace)
Пример вывода:
2️⃣ Поиск медленных сервисов
Этот список покажет службы, которые загружаются дольше всего:
Самый медленный - networkd-wait-online.service. Его можно отключить, если он не нужен:
3️⃣ Граф зависимостей сервисов. Чтобы увидеть все зависимости и их время загрузки, используйте:
Этот граф покажет какие службы блокируют запуск других.
📌 Если какая-то служба загружается слишком долго, её можно отключить или перевести в "ленивый" запуск:
4️⃣ Визуализация загрузки в SVG. Чтобы построить график загрузки системы, выполните:
Откройте boot.noscript в браузере - увидите наглядную диаграмму загрузки сервисов.
5️⃣ Ускорение загрузки с systemctl
Отключите ненужные службы
Включите параллельную загрузку. В файле
на
Затем примените изменения:
BashTex📱 #linux
Когда Linux загружается слишком долго, то сначала необходимо определить, какие службы тормозят процесс. Для этого в
systemd есть инструмент - systemd-analyze, который помогает выявить узкие места при старте системы.
systemd-analyze
Вывод покажет время, затраченное на:
прошивку (firmware)
загрузчик (bootloader)
ядро (kernel)
службы systemd (userspace)
Пример вывода:
Startup finished in 3.2s (kernel) + 5.1s (userspace) = 8.3s
systemd-analyze blame
Этот список покажет службы, которые загружаются дольше всего:
10.543s networkd-wait-online.service
3.213s apt-daily.service
1.145s snapd.service
Самый медленный - networkd-wait-online.service. Его можно отключить, если он не нужен:
sudo systemctl disable --now networkd-wait-online.service
systemd-analyze critical-chain
Этот граф покажет какие службы блокируют запуск других.
sudo systemctl disable имя_сервиса
sudo systemctl mask имя_сервиса
systemd-analyze plot > boot.noscript
Откройте boot.noscript в браузере - увидите наглядную диаграмму загрузки сервисов.
Отключите ненужные службы
sudo systemctl disable --now service_name
Включите параллельную загрузку. В файле
/etc/default/grub замените строку:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
на
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.legacy_boot=false"
Затем примените изменения:
sudo update-grub
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥4
Запись и воспроизведение сессий терминала
Если вам нужно показать работу команды в терминале, но скриншоты не передают всей динамики, попробуйте
В отличие от обычного видео, записи
▪️ Установка
📍 Запись терминальной сессии. Просто запустите:
Теперь всё, что вы вводите в терминале, записывается.
📌 Чтобы остановить запись: Ctrl + D или exit.
📌 После остановки asciinema предложит сохранить локально или загрузить в облако.
📂 Сохранение записи в файл:
▪️ Воспроизведение записи. Если запись сохранена в файл, проиграйте её так:
▪️ Публикация и расшаривание. Если нужно поделиться записью:
▪️ Запись с паузами между командами:
(это замедлит вывод, чтобы было комфортнее читать)
▪️ Конвертация записи в GIF-анимацию. Для этого можно использовать утилиту
BashTex📱 #linux #utils
Если вам нужно показать работу команды в терминале, но скриншоты не передают всей динамики, попробуйте
asciinema. Это инструмент для записи и воспроизведения терминальных сессий.В отличие от обычного видео, записи
asciinema:➕ занимают всего несколько килобайт➕ позволяют копировать команды прямо из записи➕ легко встраиваются в сайты и документацию
brew install asciinema -- MacOS
sudo apt install asciinema -- Ubuntu/Debian
sudo pacman -S asciinema -- Arch Linux
asciinema rec
Теперь всё, что вы вводите в терминале, записывается.
asciinema rec demo.cast
asciinema play demo.cast
asciinema upload demo.cast
asciinema rec -t 2
(это замедлит вывод, чтобы было комфортнее читать)
agg:
agg demo.cast demo.gif
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
Продвинутый cat с подсветкой кода
Если вы часто используете
🌟 Почему bat лучше cat?
⚙️ Установка
Windows:
▪️ Как использовать?
📍 Простая замена cat:
📍 Нумерация строк:
📍 Отображение различий с последним коммитом (если файл в git-репозитории):
📍 Использование как cat:
📍 Вывод с определённой темой оформления:
(Темы можно посмотреть через bat --list-themes)
📍 Интеграция с less и man. Сделать bat основным просмотрщиком для man:
Использовать bat с less:
bat - это альтернатива cat, которая делает работу с файлами удобнее. Отлично подходит для просмотра кода, конфигов и текстовых файлов.
BashTex📱 #linux #utils
Если вы часто используете
cat для просмотра файлов, попробуйте bat - улучшенную версию с подсветкой синтаксиса, номерами строк и встроенной пагинацией.Подсветка кода для более чем 500 языков
Номера строк прямо в выводе
Интеграция с git (показывает изменённые строки)
Встроенный пейджинг (автоматически передаёт вывод в less)
sudo pacman -S bat -- Arch Linux
brew install bat -- MacOS
sudo apt install bat -- Ubuntu/Debian
Windows:
scoop install bat
choco install bat
bat noscript.sh
bat -n myfile.txt
bat --diff myfile.py
bat --paging=never file.txt
bat --theme=Dracula config.yaml
(Темы можно посмотреть через bat --list-themes)
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
Использовать bat с less:
export BAT_PAGER="less -RF"
bat - это альтернатива cat, которая делает работу с файлами удобнее. Отлично подходит для просмотра кода, конфигов и текстовых файлов.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26😁7🤨1🗿1
Автоматическое переключение Wi-Fi на самый сильный сигнал
Если у вас несколько точек доступа с одним SSID, но система не переключается на точку с лучшим сигналом, можно автоматизировать этот процесс с помощью простого скрипта.
🌟 Как узнать текущий сигнал Wi-Fi?
Где wlan0 - имя вашего Wi-Fi-интерфейса.
Важен параметр Signal level, измеряется в dBm (чем ближе к 0, тем лучше).
📱 Автоматическое переключение Wi-Fi. Создадим скрипт
▪️ Как запустить скрипт в фоновом режиме?
1️⃣ Дать права на выполнение:
2️⃣ Запустить в фоне:
3️⃣ Добавить в автозапуск:
BashTex📱 #bash #utils
Если у вас несколько точек доступа с одним SSID, но система не переключается на точку с лучшим сигналом, можно автоматизировать этот процесс с помощью простого скрипта.
iwconfig wlan0 | grep -i --color signal
Где wlan0 - имя вашего Wi-Fi-интерфейса.
Важен параметр Signal level, измеряется в dBm (чем ближе к 0, тем лучше).
wifi-switch.sh, который будет мониторить сигнал и при необходимости переподключаться:
#!/bin/bash
INTERFACE="wlan0" # Название Wi-Fi интерфейса
SSID="HomeWiFi" # Имя вашей сети (SSID)
THRESHOLD=-70 # Порог переключения (в dBm)
while true; do
# Получаем текущий уровень сигнала
SIGNAL=$(iwconfig $INTERFACE | grep -i --color signal | awk '{print $4}' | cut -d '=' -f2)
# Если сигнал слабый, перезапускаем Wi-Fi
if [[ $SIGNAL -lt $THRESHOLD ]]; then
echo "Слабый сигнал ($SIGNAL dBm), переподключение..."
nmcli device wifi rescan
nmcli device disconnect $INTERFACE
nmcli device connect $INTERFACE
fi
sleep 10 # Проверяем каждые 10 секунд
done
chmod +x wifi-switch.sh
nohup ./wifi-switch.sh > /dev/null 2>&1 &
echo "@reboot /path/to/wifi-switch.sh" | crontab -
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
Чтение файлов в массив без cat
Часто при работе с файлами в Bash используют
🌟 Почему mapfile удобнее?
🌟 Как это работает? Допустим, у нас есть файл users.txt:
Теперь можно обращаться к строкам по индексам:
Первый пользователь: Vanya
Второй пользователь: Anna```
🌟 mapfile vs cat | while read. Обычный способ через while read ломает строки с пробелами:
Если строка "Vanya Ivanov",
🌟 Применение mapfile в реальных задачах
1️⃣ Удаление пустых строк из файла
2️⃣ Чтение вывода команды в массив
3️⃣ Чтение первых N строк
BashTex📱 #linux #utils
Часто при работе с файлами в Bash используют
cat и while read, но есть более элегантное решение - команда mapfile (она же readarray).Читает файл целиком в массив.
Избавляет от проблем с разбиением строк по пробелам.
Работает быстрее cat | while read.
Поддерживает фильтрацию и постобработку данных.
Vanya
Anna
Roman
Читаем его в массив одной командой:
```bash
mapfile -t users < users.txt
Теперь можно обращаться к строкам по индексам:
echo "Первый пользователь: ${users[0]}"
echo "Второй пользователь: ${users[1]}"
Первый пользователь: Vanya
Второй пользователь: Anna```
while read user; do
echo "$user"
done < users.txt
Если строка "Vanya Ivanov",
while read разобьёт её на "Vanya" и "Ivanov". А mapfile сохранит строку целиком.
mapfile -t lines < <(grep -v '^$' users.txt)
mapfile -t processes < <(ps aux)
mapfile -t -n 5 top_lines < users.txt
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍1
Интеграция Bash с Telegram для удалённого управления сервером
Хотите удалённо управлять сервером через телеграмм? С помощью простого bash-скрипта можно получать статусы, логи и даже перезагружать сервер прямо из чата.
🌟 Как это работает?
Для этого потребуется:
TG-бот + API-токен
curl или wget для отправки запросов
Скрипт на Bash
1️⃣ Создаём TG-бота
Открываем @BotFather.
Отправляем команду: /newbot.
Даем боту имя и получаем токен API.
Токен будет вида:
Сохраняем его.
2️⃣ Получаем свой Chat ID. Запросим ID нашего чата:
Ищем "chat":{"id":...} - это и есть наш Chat ID.
3️⃣ Отправка сообщений в телеграмм. Bash-скрипт для отправки сообщения:
Запускаем и получаем сообщение в TG.
4️⃣ Обработка команд. Теперь научим бота принимать команды.
Скрипт для проверки команд от пользователя:
Теперь отправляем
5️⃣ Автоматизация. Добавим этот скрипт в cron для регулярного выполнения:
Теперь бот сам проверяет новые сообщения и реагирует на команды.
🌟 Это базовая конфигурация с помощью которой можно значительно расширить управление сервером через телеграмм под свои конкретные потребности.
BashTex📱 #bash #utils
Хотите удалённо управлять сервером через телеграмм? С помощью простого bash-скрипта можно получать статусы, логи и даже перезагружать сервер прямо из чата.
Бот принимает команды от владельца.
Сервер обрабатывает запросы и отправляет ответ.
Ответ возвращается в телеграмм.
Для этого потребуется:
TG-бот + API-токен
curl или wget для отправки запросов
Скрипт на Bash
Открываем @BotFather.
Отправляем команду: /newbot.
Даем боту имя и получаем токен API.
Токен будет вида:
123456789:ABCdefGHIjklMNO123456xyz
Сохраняем его.
curl "https://api.telegram.org/bot<ТОКЕН>/getUpdates"
Ищем "chat":{"id":...} - это и есть наш Chat ID.
#!/bin/bash
TOKEN="123456789:ABCdefGHIjklMNO123456xyz"
CHAT_ID="123456789"
MESSAGE="Привет, сервер на связи!"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=$MESSAGE"
Запускаем и получаем сообщение в TG.
Скрипт для проверки команд от пользователя:
#!/bin/bash
TOKEN="123456789:ABCdefGHIjklMNO123456xyz"
CHAT_ID="123456789"
URL="https://api.telegram.org/bot$TOKEN"
# Получаем последнее сообщение
UPDATE=$(curl -s "$URL/getUpdates")
LAST_MESSAGE=$(echo "$UPDATE" | grep -o '"text":"[^"]*' | cut -d':' -f2 | tr -d '"')
if [[ "$LAST_MESSAGE" == "/status" ]]; then
RESPONSE="Сервер работает!"
elif [[ "$LAST_MESSAGE" == "/uptime" ]]; then
RESPONSE=$(uptime)
elif [[ "$LAST_MESSAGE" == "/disk" ]]; then
RESPONSE=$(df -h | grep '/$')
else
RESPONSE="Неизвестная команда"
fi
# Отправляем ответ в TG
curl -s -X POST "$URL/sendMessage" -d "chat_id=$CHAT_ID" -d "text=$RESPONSE"
Теперь отправляем
/status, /uptime или /disk и получаем ответ!
*/1 * * * * /path/to/telegram_bot.sh
Теперь бот сам проверяет новые сообщения и реагирует на команды.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Развёртывание Linux по сети с PXE
Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.
🌟 Как это работает?
🌟 Что нужно для развертывания PXE?
1️⃣ Устанавливаем нужные пакеты. На PXE-сервере установим DHCP, TFTP и Apache (для раздачи образов):
2️⃣ Настраиваем DHCP для PXE. Редактируем
Перезапускаем DHCP:
3️⃣ Настраиваем TFTP-сервер. Указываем папку для загрузки PXE-файлов в
Перезапускаем:
4️⃣ Загружаем PXELINUX. Скачиваем файлы для PXE:
Создаём каталог для меню:
5️⃣ Создаём загрузочное меню PXE. Создаём файл
6️⃣ Готовим установочные файлы. Загружаем образы на веб-сервер:
Перезапускаем Apache:
7️⃣ Запускаем установку по сети. Теперь включаем клиентский компьютер, в BIOS включаем PXE-загрузку и выбираем сетевой интерфейс в качестве загрузочного устройства.
Клиент загрузится и начнёт установку Linux прямо из сети.
BashTex📱 #linux #utils
Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.
Компьютер включается и запрашивает сетевой загрузчик по DHCP.
Сервер отвечает и передаёт загрузочный образ через TFTP.
Клиент загружает ядро Linux и переходит к установке системы.
DHCP-сервер (для раздачи PXE-загрузчика)
TFTP-сервер (для передачи загрузочных файлов)
HTTP/NFS-сервер (для хранения установочных файлов)
sudo apt update && sudo apt install isc-dhcp-server tftpd-hpa apache2
/etc/dhcp/dhcpd.conf:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
next-server 192.168.1.10; # PXE-сервер
filename "pxelinux.0";
}
Перезапускаем DHCP:
sudo systemctl restart isc-dhcp-server
/etc/default/tftpd-hpa:
TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure"
Перезапускаем:
sudo systemctl restart tftpd-hpa
sudo mkdir -p /srv/tftp
cd /srv/tftp
sudo apt install syslinux pxelinux
sudo cp /usr/lib/PXELINUX/pxelinux.0 .
sudo cp /usr/lib/syslinux/modules/bios/* .
Создаём каталог для меню:
mkdir -p /srv/tftp/pxelinux.cfg
/srv/tftp/pxelinux.cfg/default:
DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install
LABEL install
MENU LABEL Install Ubuntu 22.04
KERNEL ubuntu/vmlinuz
APPEND initrd=ubuntu/initrd.gz netboot=http://192.168.1.10/ubuntu/
sudo mkdir -p /var/www/html/ubuntu
cd /var/www/html/ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzf netboot.tar.gz
Перезапускаем Apache:
sudo systemctl restart apache2
Клиент загрузится и начнёт установку Linux прямо из сети.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Please open Telegram to view this post
VIEW IN TELEGRAM
😁37👍2🔥2
Cтраховка от неожиданных ошибок в скриптах
При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование
❓ Что делает эта магическая строка?
Разберём на примерах.
🚫 Скрипт без set -euo pipefail (пропустит ошибки)
Итог: скрипт продолжает работать, даже если что-то пошло не так.
✔️ Скрипт с set -euo pipefail (контроль ошибок)
Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.
⭐️ Где это особенно полезно?
❗️ Когда set -euo pipefail может мешать? Иногда ошибки могут быть ожидаемыми и не критичными.
Например, если файл может отсутствовать, но это не должно останавливать выполнение:
Или если команда в пайпе не всегда должна возвращать код 0:
BashTex📱 #linux #utils
При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование
set -euo pipefail помогает защитить скрипты от ошибок и упростить отладку.
set -euo pipefail
-e (exit on error) — прерывает скрипт при ошибке любой команды (кроме в if, &&, ||).
-u (unset variables) — ошибка при попытке использовать неинициализированную переменную.
-o pipefail — ошибка в пайпах, если любая из команд завершится с ошибкой (обычно учитывается только последняя команда).
Разберём на примерах.
#!/bin/bash
echo "Начинаем работу..."
rm /несуществующий_файл # Ошибка, но скрипт продолжит работу
echo "Удалили файл (на самом деле нет)"
VAR=$(cat $UNKNOWN_VAR) # Неинициализированная переменная (ошибка, но не критично)
ls | grep myfile | awk '{print $1}' # Ошибка в grep или awk не остановит выполнение
echo "Скрипт завершён"
Итог: скрипт продолжает работать, даже если что-то пошло не так.
#!/bin/bash
set -euo pipefail
echo "Начинаем работу..."
rm /несуществующий_файл # Скрипт сразу прервётся из-за ошибки
echo "Удалили файл"
VAR=$(cat $UNKNOWN_VAR) # Ошибка: переменная не объявлена
ls | grep myfile | awk '{print $1}' # Ошибка в любой команде пайпа приведёт к остановке
echo "Скрипт завершён"
Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.
Бэкап-скрипты (чтобы не создать пустой бэкап, если команда провалилась).
Скрипты развёртывания (чтобы не получить систему в непредсказуемом состоянии).
Автоматизация обновлений (чтобы обновление не зависло в неизвестном месте).
Например, если файл может отсутствовать, но это не должно останавливать выполнение:
rm myfile.txt || true # Явно игнорируем ошибку
Или если команда в пайпе не всегда должна возвращать код 0:
set +o pipefail # Отключаем pipefail временно
ls | grep myfile | awk '{print $1}'
set -o pipefail # Включаем обратно
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥1
Ограничение ресурсов процессов прямо из терминала
В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда
🌟 Что такое ulimit?
🌟 Что можно ограничить? Команда
🌟 Часто используемые лимиты
▪️ Примеры использования
📍 Увеличить лимит открытых файлов:
📍 Ограничить процесс в использовании CPU временем:
(После 60 секунд использования CPU - процесс будет убит)
📍 Запретить создание файлов > 10 МБ:
▪️ Мягкие и жёсткие лимиты
Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root
📍 Посмотреть:
📍 Установить:
📍 Постоянные настройки. Чтобы лимиты сохранялись после перезагрузки:
Убедитесь, что PAM обрабатывает лимиты:
Добавьте:
⭐️ Когда пригодится?
BashTex📱 #linux #utils
В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда
ulimit.ulimit - это встроенная команда оболочки, которая позволяет устанавливать ограничения на использование ресурсов для текущего сеанса оболочки и всех дочерних процессов.
ulimit -a покажет текущие лимиты:
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 15635
Параметр Назначение
-n Количество открытых файлов (очень важно для веб-серверов и баз данных)
-u Кол-во пользовательских процессов
-f Максимальный размер создаваемого файла
-v Максимальный объём виртуальной памяти
-s Размер стека
-t Максимальное время CPU, сек
ulimit -n 65535
ulimit -t 60
(После 60 секунд использования CPU - процесс будет убит)
ulimit -f $((10 * 1024)) # 10 МБ в блоках по 1K
Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root
ulimit -Sn # soft
ulimit -Hn # hard
ulimit -Sn 4096
ulimit -Hn 65535
/etc/security/limits.conf:
youruser hard nofile 65535
youruser soft nofile 65535
Убедитесь, что PAM обрабатывает лимиты:
/etc/pam.d/common-session
Добавьте:
session required pam_limits.so
Высоконагруженные сервисы (nginx, PostgreSQL, Elasticsearch)
CI/CD-сборки, которые могут упереться в лимит памяти или процессов
Безопасность: ограничение прав скриптов или сторонних процессов
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
Настройка автообновления сертификатов Let’s Encrypt
Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.
1️⃣ Установка Certbot. Certbot - официальный клиент для работы с Let's Encrypt.
Для Ubuntu/Debian:
Для Apache:
2️⃣ Получение сертификата. Пример для Nginx:
Для Apache:
Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.
3️⃣ Проверка автоматического обновления. После установки certbot создает cron или systemd job, которая автоматически проверяет и обновляет сертификаты.
Проверить вручную:
Если тест успешен — автообновление работает.
4️⃣ Кастомный крон (если нужен). Если хочешь сделать всё под себя:
Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.
5️⃣ Обновление через hook (если веб-сервер кастомный)
Хук сработает только если сертификат реально обновился - не будет лишних рестартов.
🌟 Как узнать дату истечения сертификата?
BashTex📱 #linux #utils
Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.
Для Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx # для Nginx
Для Apache:
sudo apt install certbot python3-certbot-apache
sudo certbot --nginx -d example.com -d www.bashtex.com
Для Apache:
sudo certbot --apache -d bashtex.com
Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.
Проверить вручную:
sudo certbot renew --dry-run
Если тест успешен — автообновление работает.
sudo crontab -e
Добавь строку:
```bash
0 3 * * * certbot renew --quiet && systemctl reload nginx
Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.
certbot renew --deploy-hook "systemctl reload myserver"
Хук сработает только если сертификат реально обновился - не будет лишних рестартов.
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21👍5🔥2🫡1
Простая работа с фоновыми процессами через пайпы
🌟 Зачем нужен coproc?
Иногда тебе нужно запустить процесс в фоне, при этом:
1. Посылать ему данные (stdin)
2. Читать от него результат (stdout)
3. Не колхозить с mkfifo, & и exec
Вот тут и заходит coproc.
▪️ Синтаксис
После этого у тебя появятся:
▪️ Пример 1: диалог с bc
bc запустился в фоне, мы отправили ему выражение, получили результат - красиво, без лишних файлов и форков.
▪️ Пример 2: интерактивный grep
▪️ Пример 3: асинхронная обработка большого файла
BashTex📱 #bash #utils
coproc - один из недооценённых инструментов в Bash. Он позволяет создавать фоновые процессы с доступом к их вводу/выводу через переменные. То есть, ты получаешь легкий способ запускать команды асинхронно и при этом взаимодействовать с ними.Иногда тебе нужно запустить процесс в фоне, при этом:
1. Посылать ему данные (stdin)
2. Читать от него результат (stdout)
3. Не колхозить с mkfifo, & и exec
Вот тут и заходит coproc.
coproc ИМЯ { команда; }
После этого у тебя появятся:
${ИМЯ[0]} - дескриптор для чтения (stdout команды)${ИМЯ[1]} - дескриптор для записи (stdin команды)
coproc CALC { bc -l; }
echo "2^10" >&"${CALC[1]}"
read -r result <&"${CALC[0]}"
echo "Результат: $result"
bc запустился в фоне, мы отправили ему выражение, получили результат - красиво, без лишних файлов и форков.
coproc GREPPER { grep --line-buffered "error"; }
# Пишем в grep
echo "all ok" >&"${GREPPER[1]}"
echo "fatal error!" >&"${GREPPER[1]}"
# Читаем вывод (будет только строка с error)
read -r matched <&"${GREPPER[0]}"
echo "Найдено: $matched"
coproc SORTER { sort > sorted.txt; }
# Пишем данные на сортировку
cat bigfile.csv >&"${SORTER[1]}"
# Ждём завершения
wait "${SORTER_PID}"
echo "Готово!"
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1
Удобное копирование файлов в облако
Если ты хочешь работать с Google Drive, Yandex.Disk, Dropbox, S3 и десятками других облаков так, будто это обычная файловая система - тебе нужен
Поддерживает более 60 облаков, включая: Google Drive, OneDrive, Яндекс Диск, FTP/SFTP и даже локальные диски.
⚙️ Установка
▪️ Быстрая настройка (на примере Google Drive)
n - создать новое подключение
1. Введи имя, например gdrive
2. Выбери тип (drive для Google Drive)
3. Авторизуй через браузер
Готово!
▪️ Основные команды
📍 Копировать файлы в облако:
📍 Синхронизация (удаляет на целевой стороне лишнее):
📍 Копирование из облака:
📍 Просмотр файлов в облаке:
▪️ Продвинутые фишки
📍 Шифрование:
Создай новый remote с типом crypt, укажи как базу - существующий gdrive:encrypted/
Теперь все файлы будут шифроваться на лету, прямо перед отправкой.
📍 Сжатие + передача:
📍 Тест пропускной способности:
📍 Мониторинг через Web UI:
🌟 Зачем использовать rclone?
Rclone = rsync для облаков.
BashTex📱 #linux #utils
Если ты хочешь работать с Google Drive, Yandex.Disk, Dropbox, S3 и десятками других облаков так, будто это обычная файловая система - тебе нужен
rclone. Это утилита для синхронизации, копирования, шифрования и резервного копирования файлов в облачные хранилища.Поддерживает более 60 облаков, включая: Google Drive, OneDrive, Яндекс Диск, FTP/SFTP и даже локальные диски.
sudo apt install rclone #Ubuntu/Debian
Или вручную:
```bash
curl https://rclone.org/install.sh | sudo bash
rclone config
n - создать новое подключение
1. Введи имя, например gdrive
2. Выбери тип (drive для Google Drive)
3. Авторизуй через браузер
Готово!
rclone copy ./backup gdrive:/my_backups
rclone sync ./media gdrive:/media --progress
rclone copy gdrive:/media ./local_copy
rclone ls gdrive:/my_backups
Создай новый remote с типом crypt, укажи как базу - существующий gdrive:encrypted/
Теперь все файлы будут шифроваться на лету, прямо перед отправкой.
tar cz folder | rclone rcat gdrive:archive.tar.gz
rclone bench
rclone rcd --rc-web-gui
Удобный CLI-стиль как у rsync
Работает с почти любым облаком
Поддержка крипты, логирования, многопоточности
Можно использовать в скриптах, cron, backup-сценариях
Идеален для сервера без GUI
Rclone = rsync для облаков.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Циклический дамп баз данных и удаление старых бэкапов
Резервные копии баз данных - вещь критически важная. Но без автоматизации быстро превращаются в хаос. Сегодня про то, как настроить скрипт, который:
делает дамп базы с меткой времени
сохраняет в указанный каталог
удаляет старые бэкапы по заданной политике (например, старше 7 дней)
▪️ Пример для PostgreSQL:
Для MySQL/MariaDB подойдёт mysqldump "$DB_NAME"
▪️ Дополнительно, добавить исполнение скрипта в cron:
BashTex📱 #bash #utils
Резервные копии баз данных - вещь критически важная. Но без автоматизации быстро превращаются в хаос. Сегодня про то, как настроить скрипт, который:
делает дамп базы с меткой времени
сохраняет в указанный каталог
удаляет старые бэкапы по заданной политике (например, старше 7 дней)
#!/bin/bash
set -euo pipefail
DB_NAME="mydb"
BACKUP_DIR="/var/backups/postgres"
DAYS_TO_KEEP=7
DATE_SUFFIX=$(date +%Y-%m-%d_%H-%M-%S)
FILENAME="$BACKUP_DIR/${DB_NAME}_$DATE_SUFFIX.sql.gz"
# Создание дампа
pg_dump "$DB_NAME" | gzip > "$FILENAME"
# Удаление старых бэкапов
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$DAYS_TO_KEEP -delete
Для MySQL/MariaDB подойдёт mysqldump "$DB_NAME"
0 3 * * * /path/to/backup.sh — ежедневный бэкап в 3:00
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Массивы и ассоциативные массивы
Если ты до сих пор используешь только переменные в Bash, пора прокачаться - массивы и ассоциативные массивы дают прокачку в области автоматизации.
▪️ Обычные массивы. Когда нужен список значений, например, список баз данных:
▪️ Ассоциативные массивы. Когда нужно сопоставить
▪️ Реальное применение
📍 Мониторинг процессов:
📍 Распределённая отправка по email:
BashTex📱 #linux #utils
Если ты до сих пор используешь только переменные в Bash, пора прокачаться - массивы и ассоциативные массивы дают прокачку в области автоматизации.
databases=("db1" "db2" "db3")
for db in "${databases[@]}"; do
echo "Делаю бэкап $db..."
pg_dump "$db" > "$db.sql"
done
ключ → значение, например: сервис и его порт.
declare -A services
services=(
[nginx]=80
[ssh]=22
[postgres]=5432
)
for service in "${!services[@]}"; do
port=${services[$service]}
echo "$service работает на порту $port"
done
declare -A procs=( [nginx]="nginx" [db]="postgres" [ssh]="sshd" )
for name in "${!procs[@]}"; do
pgrep -x "${procs[$name]}" > /dev/null || echo "$name не работает!"
done
emails=(user1@example.com user2@example.com user3@example.com)
for email in "${emails[@]}"; do
echo "Привет!" | mail -s "Уведомление" "$email"
done
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍4🫡2
Сканирование сети и вывод в CSV с nmap
Когда нужно быстро получить список активных хостов и открытых портов в сети - nmap, то что нужно. Особенно, если нужно сохранить результаты в CSV для анализа или импорта куда-нибудь (например, в Excel, LibreOffice, Grafana и т.д)
📱 Пример скрипта:
▪️ Что делает скрипт:
BashTex📱 #bash #utils
Когда нужно быстро получить список активных хостов и открытых портов в сети - nmap, то что нужно. Особенно, если нужно сохранить результаты в CSV для анализа или импорта куда-нибудь (например, в Excel, LibreOffice, Grafana и т.д)
#!/bin/bash
NETWORK="192.168.1.0/24"
OUTPUT="scan_result.csv"
# Заголовок CSV
echo "IP,Hostname,Ports" > "$OUTPUT"
# Сканируем сеть
nmap -sP "$NETWORK" -oG - | awk '/Up$/{print $2}' | while read ip; do
HOST=$(nmap -sL "$ip" | grep "Nmap scan report" | awk '{print $NF}')
PORTS=$(nmap -Pn -p- --min-rate=1000 --open "$ip" | awk '/^[0-9]+\/tcp/ {printf "%s; ", $1}')
echo "$ip,$HOST,\"$PORTS\"" >> "$OUTPUT"
done
сканирует активные устройства в сети 192.168.1.0/24
для каждого IP делает порт-скан
сохраняет IP, hostname и список открытых портов в CSV
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24🫡8😁5
Фоновая очередь задач на Bash с контролем параллелизма
Когда вы автоматизируете инфраструктуру, часто приходится запускать десятки или сотни задач - но неконтролируемый параллелизм может уронить систему. Вместо этого - реализуем контролируемую очередь, ограничивающую количество одновременных процессов.
▪️ Идея:
▪️ Пример:
▪️ Объяснение:
jobs -rp выводит только PID'ы активных фоновых процессов.
run_task() логирует начало, завершение и статус команды.
Используем eval - аккуратно, если команды приходят из недоверённого источника.
🌟 Такой подход можно использовать в:
BashTex📱 #bash
Когда вы автоматизируете инфраструктуру, часто приходится запускать десятки или сотни задач - но неконтролируемый параллелизм может уронить систему. Вместо этого - реализуем контролируемую очередь, ограничивающую количество одновременных процессов.
Создаём продвинутую фоновую очередь на Bash, с:
ограничением на количество параллельных задач;
логированием статуса выполнения;
возможностью динамически подставлять команды.
#!/usr/bin/env bash
set -euo pipefail
MAX_PARALLEL=4
LOGFILE="./queue.log"
TASKS=(
"sleep 3 && echo task1"
"sleep 2 && echo task2"
"sleep 1 && echo task3"
"sleep 4 && echo task4"
"sleep 5 && echo task5"
"sleep 2 && echo task6"
)
run_task() {
local cmd="$1"
local id=$(date +%s%N)
echo "[$id] START: $cmd" >> "$LOGFILE"
eval "$cmd"
local status=$?
echo "[$id] END: $cmd (exit=$status)" >> "$LOGFILE"
return $status
}
active_jobs() {
jobs -rp | wc -l
}
for task in "${TASKS[@]}"; do
run_task "$task" &
# Ждём, если число фоновых задач превысило лимит
while (( $(active_jobs) >= MAX_PARALLEL )); do
sleep 0.2
done
done
wait
echo "Все задачи завершены. Лог: $LOGFILE"
jobs -rp выводит только PID'ы активных фоновых процессов.
run_task() логирует начало, завершение и статус команды.
Используем eval - аккуратно, если команды приходят из недоверённого источника.
CI/CD пайплайнах без внешних тулов;
миграции данных или резервном копировании;
массовой обработке видео/изображений;
сетевом сканировании и мониторинге.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👨💻2
Создание своего systemd-сервиса для скрипта
Если у тебя есть полезный скрипт, который должен запускаться как сервис (например, при старте системы или по крону не подходит) - самое время подружить его с systemd.
1️⃣ Подготовка скрипта. Убедись, что скрипт исполняемый и логирует всё в файл:
И не забудь дать права:
2️⃣ Юнит-файл systemd. Создай сервис:
Пример содержимого:
3️⃣ Активация и запуск
Проверка:
🌟 Зачем это вообще?
🌟 Советы:
BashTex📱 #linux #utils
Если у тебя есть полезный скрипт, который должен запускаться как сервис (например, при старте системы или по крону не подходит) - самое время подружить его с systemd.
#!/bin/bash
echo "$(date): Скрипт запущен" >> /var/log/mynoscript.log
# Здесь твоя логика
Сохрани его, например, в /usr/local/bin/mynoscript.sh
И не забудь дать права:
chmod +x /usr/local/bin/mynoscript.sh
sudo nano /etc/systemd/system/mynoscript.service
Пример содержимого:
[Unit]
Denoscription=Мой кастомный скрипт
After=network.target
[Service]
ExecStart=/usr/local/bin/mynoscript.sh
Restart=on-failure
User=root
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable mynoscript.service
sudo systemctl start mynoscript.service
Проверка:
systemctl status mynoscript.service
Скрипт запускается при старте
Контролируется systemd (перезапуск, статус, логи)
Удобная интеграция в системную инфраструктуру
Нужен таймер? Используйmynoscript.timer
Хочешь лог в journalctl? - уже встроено
Скрипт должен зависеть от другого сервиса? Укажи в After= и Requires=
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3