Развёртывание 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
Умная работа с PID: поиск и завершение зависших процессов
Иногда процессы зависают - висят в D (disk sleep) или Z (zombie), потребляют CPU без пользы, или держат файлы, которые нужно удалить. Просто killall - грубо и может снести лишнее. Давайте сделаем это умнее.
▪️ Задача:
Найти и безопасно завершить только зависшие или чрезмерно "прожорливые" процессы, избегая случайных убийств важных задач.
▪️ Подход:
▪️ Пример скрипта:
▪️ Что умеет:
BashTex📱 #bash
Иногда процессы зависают - висят в D (disk sleep) или Z (zombie), потребляют CPU без пользы, или держат файлы, которые нужно удалить. Просто killall - грубо и может снести лишнее. Давайте сделаем это умнее.
Найти и безопасно завершить только зависшие или чрезмерно "прожорливые" процессы, избегая случайных убийств важных задач.
Сканируем ps на предмет "подозрительных" состояний.
Проверяем длительность жизни процесса.
Ограничиваем по имени, CPU или статусу.
Включаем dry-run перед действием.
#!/usr/bin/env bash
set -euo pipefail
PATTERN="python" # Имя процесса (или часть имени)
MAX_CPU=80 # Максимально допустимая загрузка CPU
MAX_AGE=3600 # В секундах: 1 час
DRY_RUN=true # Безопасный режим
echo "Поиск процессов по шаблону: $PATTERN"
ps -eo pid,etime,pcpu,comm --sort=-pcpu | awk -v pattern="$PATTERN" -v max_cpu="$MAX_CPU" -v max_age="$MAX_AGE" -v dry_run="$DRY_RUN" '
function hms_to_sec(s, t, n, h, m) {
gsub("-", "", s)
n = split(s, t, /[:-]/)
if (n == 3) { h = t[1]; m = t[2]; s = t[3] }
else if (n == 2) { h = 0; m = t[1]; s = t[2] }
else { h = 0; m = 0; s = t[1] }
return h * 3600 + m * 60 + s
}
NR>1 && $4 ~ pattern {
age = hms_to_sec($2)
cpu = $3
if (cpu > max_cpu || age > max_age) {
printf "[!] Найден подозрительный процесс: PID=%s CPU=%.1f%% AGE=%ss CMD=%s\n", $1, cpu, age, $4
if (dry_run == "false") {
system("kill -9 " $1)
print "[x] Завершен PID=" $1
} else {
print "[i] Dry run: процесс НЕ завершен"
}
}
}
Выборочно завершает процессы с перегрузкой по CPU
Проверяет "возраст" процессов по etime
Работает в dry-run режиме по умолчанию
Прост в кастомизации: ищи по имени, статусу, времени
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
☃20🫡2👨💻1
Сравнение производительности: grep / awk / sed / perl
Когда дело доходит до обработки текста в Linux, у нас есть классическая "великая четвёрка": grep, awk, sed, perl. Все они умеют искать и преобразовывать строки, но что выбрать, если важна производительность?
⭐️ Тест: кто быстрее?
Возьмём файл на 1 млн строк (logs.txt) и задачу - найти строки, содержащие "ERROR" и вывести их.
🕛 Результаты (примерные):
🌟 Что важно помнить:
🌟 Хитрости: Для поиска без регулярных выражений:
1.
2. Используй
3. Объединяй:
BashTex📱 #linux #utils
Когда дело доходит до обработки текста в Linux, у нас есть классическая "великая четвёрка": grep, awk, sed, perl. Все они умеют искать и преобразовывать строки, но что выбрать, если важна производительность?
Возьмём файл на 1 млн строк (logs.txt) и задачу - найти строки, содержащие "ERROR" и вывести их.
# 1. grep — специализируется на поиске
time grep 'ERROR' logs.txt
# 2. awk — универсален, но чуть медленнее grep
time awk '/ERROR/' logs.txt
# 3. sed — может искать, но не для этого заточен
time sed -n '/ERROR/p' logs.txt
# 4. perl - мощь и регулярки, но запускается дольше
time perl -ne 'print if /ERROR/' logs.txt
Команда Время (сек) Комментарий
grep 0.18 - Самый быстрый в чистом поиске
awk 0.25 - Универсал, чуть медленнее
sed 0.30 - Не лучший для просто поиска
perl 0.35 - 0.50 Мощно, но медленно стартует
grep - лучший выбор для быстрого поиска. Используй grep -F (fixed strings) для ещё большей скорости.
awk - когда нужна логика: фильтрация, подсчёты, агрегирование.
sed - идеально для простых замен (особенно sed -i), но не лучший инструмент для поиска.
perl - тянет даже сложнейшие регулярки и постобработку, но стоит дороже по времени запуска.
1.
grep -F "ERROR" → быстрее, чем обычный grep.2. Используй
LC_ALL=C или LANG=C для ускорения поиска (отключает локализацию):
LC_ALL=C grep 'ERROR' logs.txt
3. Объединяй:
grep 'ERROR' logs.txt | awk '{print $1}' # вытащить дату, например
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3👨💻1
Логирование доступа к файлам через auditd
Если ты хочешь знать, кто и когда открыл или изменил важные файлы на сервере - добро пожаловать в мир
⚙️ Установка:
▪️ Отслеживаем доступ к файлу. Допустим, тебе важно следить за файлом
▪️ Пример события в логе:
📱 Скрипт для анализа:
▪️ Как убрать правило:
▪️ Расширение идеи:
Нужно логировать доступ к нескольким файлам? Добавь их в список и прогоняй в цикле.
BashTex📱 #linux #utils
Если ты хочешь знать, кто и когда открыл или изменил важные файлы на сервере - добро пожаловать в мир
auditd. Это подсистема аудита Linux, а вместе с Bash она превращается в инструмент контроля безопасности.auditd - демон ядра, который пишет события доступа к ресурсам (файлам, системным вызовам, пользователям и т.д.) в лог /var/log/audit/audit.log.
sudo apt install auditd audispd-plugins # Debian/Ubuntu
sudo yum install audit -y # RHEL/CentOS
/etc/shadow:
sudo auditctl -w /etc/shadow -p rwxa -k shadow_watch
-w — путь к файлу
-p — права (read/write/execute/attribute)
-k — метка (ключ) для фильтрации логов
type=SYSCALL msg=audit(1613403003.244:516): ...
type=PATH msg=audit(1613403003.244:516): item=0 name="/etc/shadow" ...
#!/bin/bash
KEY="shadow_watch"
LOG="/var/log/audit/audit.log"
REPORT="/var/log/shadow_access_report.txt"
echo "Анализ доступа к /etc/shadow — $(date)" > "$REPORT"
ausearch -k "$KEY" | \
grep 'name="/etc/shadow"' | \
awk -F"uid=" '{print $2}' | \
awk '{print $1}' | \
sort | uniq -c | sort -nr >> "$REPORT"
cat "$REPORT"
ausearch позволяет фильтровать события по ключу. Скрипт покажет сколько раз какой UID обращался к файлу.
sudo auditctl -W /etc/shadow
Нужно логировать доступ к нескольким файлам? Добавь их в список и прогоняй в цикле.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥2
Автоматическая настройка нового пользователя и окружения на сервере
Когда ты создаёшь нового пользователя в Linux, особенно для dev/stage-серверов, каждый раз настраивать окружение вручную - трата времени. Попробуем автоматизировать процесс: скрипт добавит пользователя, настроит SSH, переменные окружения, alias'ы и даже zsh или tmux - по вкусу.
🌟 Что делает скрипт:
📱 Пример скрипта:
▪️ Расширения:
▪️ Хранение шаблонов
Для advanced-сценариев: можно использовать шаблоны с /etc/skel/ или Ansible playbooks для развёртывания целого окружения под одного пользователя.
BashTex📱 #bash
Когда ты создаёшь нового пользователя в Linux, особенно для dev/stage-серверов, каждый раз настраивать окружение вручную - трата времени. Попробуем автоматизировать процесс: скрипт добавит пользователя, настроит SSH, переменные окружения, alias'ы и даже zsh или tmux - по вкусу.
Создаёт пользователя с паролем
Добавляет в группу sudo
Копирует SSH-ключ для входа
Устанавливает alias'ы и переменные окружения
Устанавливает и настраивает Zsh/Tmux (опционально)
#!/bin/bash
USERNAME="$1"
PUBKEY_PATH="$2" # путь до публичного ключа, например ~/.ssh/id_rsa.pub
if [[ -z "$USERNAME" || -z "$PUBKEY_PATH" ]]; then
echo "Использование: $0 <имя_пользователя> <путь_до_публичного_ключа>"
exit 1
fi
# Создание пользователя
useradd -m -s /bin/bash "$USERNAME"
usermod -aG sudo "$USERNAME"
echo "$USERNAME:changeme" | chpasswd # можно заменить на генерацию пароля
# Настройка SSH
mkdir -p /home/$USERNAME/.ssh
cp "$PUBKEY_PATH" /home/$USERNAME/.ssh/authorized_keys
chmod 700 /home/$USERNAME/.ssh
chmod 600 /home/$USERNAME/.ssh/authorized_keys
chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh
# Bash-окружение
cat >> /home/$USERNAME/.bashrc <<EOF
# Custom environment
alias ll='ls -lah'
export EDITOR=nano
EOF
# Установка zsh (опционально)
if command -v zsh &>/dev/null; then
chsh -s $(which zsh) "$USERNAME"
fi
echo "Пользователь $USERNAME создан и настроен."
1. Добавить установку oh-my-zsh или tmux конфигов
2. Автоматически генерировать пароль и сохранять его в файл
3. Настраивать .vimrc, .gitconfig или Docker-окружение
4. Добавить пост-инсталляционный скрипт: установка утилит, обновления и пр.
Для advanced-сценариев: можно использовать шаблоны с /etc/skel/ или Ansible playbooks для развёртывания целого окружения под одного пользователя.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27👍1
Проверка целостности бэкапов и перезапись повреждённых архивов
Сделать бэкап - это только половина дела. Вторая - убедиться, что он рабочий. Повреждённый архив может стать критичной точкой отказа, особенно при аварийном восстановлении. Попробуем автоматизировать проверку и реагирование.
🌟 Что проверяем? Если вы делаете архивы в .tar.gz, .zip, .xz и т.п., то можно автоматически:
📱 Пример скрипта:
⭐️ Дополнительно:
❗️ Уведомления: Интеграция с TG или Email - чтобы вы знали, что пошло не так:
BashTex📱 #bash
Сделать бэкап - это только половина дела. Вторая - убедиться, что он рабочий. Повреждённый архив может стать критичной точкой отказа, особенно при аварийном восстановлении. Попробуем автоматизировать проверку и реагирование.
Проверить, читается ли архив
Отправить уведомление при ошибке
Пересоздать архив, если он битый
#!/bin/bash
BACKUP_DIR="/mnt/backups"
LOGFILE="/var/log/backup-check.log"
RETRY_SCRIPT="/usr/local/bin/backup.sh" # ваш основной бэкап-скрипт
check_tar() {
tar -tzf "$1" > /dev/null 2>&1
}
for file in "$BACKUP_DIR"/*.tar.gz; do
if [[ -f "$file" ]]; then
echo -n "Проверка $file... " >> "$LOGFILE"
if check_tar "$file"; then
echo "OK" >> "$LOGFILE"
else
echo "FAILED" >> "$LOGFILE"
echo "[$(date)] Архив повреждён: $file. Перезапуск бэкапа..." >> "$LOGFILE"
# Удалить битый архив
rm -f "$file"
# Перезапуск создания бэкапа
bash "$RETRY_SCRIPT" >> "$LOGFILE" 2>&1
fi
fi
done
1. Для .zip: unzip -t архив.zip
2. Для .xz: xz -t архив.xz
3. Можно хранить хэши (sha256sum) при создании и сверять перед восстановлением
4. Интеграция с cron — ежедневная проверка по расписанию
curl -s -X POST https://api.telegram.org/bot$TOKEN/sendMessage \
-d chat_id=$CHAT_ID -d text="Архив повреждён: $file. Запущен новый бэкап."
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍1