Автоматизация Linux-систем: эффективные bash-скрипты для задач
Для кого эта статья:
- Системные администраторы
- Разработчики, работающие с Linux
ИТ-специалисты, желающие повысить продуктивность через автоматизацию
Если вы хоть раз просыпались в холодном поту от мысли о предстоящем дне, наполненном монотонными задачами в Linux-системах, этот материал — ваш спасательный круг. Bash-скрипты — мощнейший инструмент, превращающий часы утомительного щелканья по клавиатуре в секунды автоматического выполнения. Готовы избавиться от рутины и вывести свою продуктивность на новый уровень? Продолжайте чтение — я поделюсь скриптами, которые меняют правила игры. 🚀
Осваиваете скрипты в Linux и думаете о расширении своих навыков? Обучение Python-разработке от Skypro — естественный шаг вперёд для системных администраторов. Python идеально дополняет bash, позволяя создавать более сложные и масштабируемые решения для автоматизации. Курс предлагает практико-ориентированный подход: вы сразу применяете знания для решения реальных задач администрирования и мониторинга систем.
Основы скриптов bash в Linux: время автоматизировать
Bash-скрипты — это последовательности команд, которые интерпретатор командной строки bash выполняет так, словно они были введены вручную. Однако вместо многократного набора одних и тех же команд, вы запускаете файл, содержащий эти инструкции. Простая концепция с революционным эффектом для продуктивности.
Каждый bash-скрипт начинается с шебанга — специальной строки, указывающей системе, какой интерпретатор использовать:
#!/bin/bash
Для создания базового скрипта достаточно выполнить следующие шаги:
- Создать текстовый файл с расширением .sh (например, myscript.sh)
- Добавить шебанг в первую строку
- Написать необходимые команды
- Сделать файл исполняемым: chmod +x myscript.sh
- Запустить скрипт: ./myscript.sh
Вот пример простейшего скрипта, который выводит информацию о системе:
#!/bin/bash
echo "Привет, $(whoami)!"
echo "Сегодня $(date)"
echo "Информация о системе:"
uname -a
echo "Использование диска:"
df -h
Эффективность bash-скриптов раскрывается через использование переменных, условных конструкций и циклов. Например, переменные объявляются просто:
USERNAME="admin"
echo "Привет, $USERNAME"
Условные конструкции позволяют принимать решения:
if [ $DISK_USAGE -gt 90 ]; then
echo "Предупреждение: диск заполнен более чем на 90%"
fi
А циклы автоматизируют повторяющиеся действия:
for SERVER in server1 server2 server3; do
ssh $SERVER "uptime"
done
| Конструкция | Назначение | Пример использования |
|---|---|---|
| if/else | Условное выполнение | Проверка доступности сервиса |
| for | Итерация по списку | Обработка файлов в директории |
| while | Выполнение, пока условие истинно | Ожидание завершения процесса |
| case | Множественный выбор | Обработка аргументов командной строки |
Александр Петров, DevOps-инженер
Однажды мне поручили настройку 50 новых серверов для проекта с жесткими сроками запуска. Ручная настройка каждого заняла бы дни. Я написал bash-скрипт, который автоматически устанавливал необходимые пакеты, настраивал сетевые интерфейсы, конфигурировал службы и добавлял системы мониторинга. Скрипт включал проверки успешности каждой операции и логировал результаты.
Развертывание всей инфраструктуры заняло 3 часа вместо планируемых 2-3 дней. Клиент был в восторге, а я получил повышение. Этот случай убедил меня в необходимости автоматизировать абсолютно всё, что выполняется более одного раза.

Управление файлами: скрипты bash для работы с данными
Управление файлами — одна из самых распространенных задач системного администратора. Bash предоставляет мощные инструменты для работы с файлами и каталогами, которые можно объединить в эффективные скрипты. 📂
Вот скрипт для организации файлов по типам, который автоматически сортирует файлы в указанной директории по расширениям:
#!/bin/bash
SOURCE_DIR="$1"
if [ -z "$SOURCE_DIR" ]; then
SOURCE_DIR="."
fi
# Создаем директории для разных типов файлов
mkdir -p "$SOURCE_DIR/images" "$SOURCE_DIR/documents" "$SOURCE_DIR/videos" "$SOURCE_DIR/archives" "$SOURCE_DIR/other"
# Перемещаем файлы по соответствующим директориям
find "$SOURCE_DIR" -maxdepth 1 -type f | while read file; do
case "$file" in
*.jpg|*.jpeg|*.png|*.gif|*.bmp)
mv "$file" "$SOURCE_DIR/images/"
;;
*.doc|*.docx|*.txt|*.pdf|*.odt)
mv "$file" "$SOURCE_DIR/documents/"
;;
*.mp4|*.avi|*.mov|*.mkv)
mv "$file" "$SOURCE_DIR/videos/"
;;
*.zip|*.tar|*.gz|*.rar)
mv "$file" "$SOURCE_DIR/archives/"
;;
*)
# Игнорируем сам скрипт
if [ "$file" != "./$0" ]; then
mv "$file" "$SOURCE_DIR/other/"
fi
;;
esac
done
echo "Файлы успешно отсортированы!"
Для поиска дубликатов файлов можно использовать следующий скрипт:
#!/bin/bash
DIRECTORY="$1"
if [ -z "$DIRECTORY" ]; then
DIRECTORY="."
fi
echo "Поиск дубликатов в $DIRECTORY..."
find "$DIRECTORY" -type f -exec md5sum {} \; | sort | uniq -w32 -d --all-repeated=separate
А этот скрипт массово переименовывает файлы, заменяя пробелы на подчеркивания:
#!/bin/bash
DIRECTORY="$1"
if [ -z "$DIRECTORY" ]; then
DIRECTORY="."
fi
find "$DIRECTORY" -type f -name "* *" | while read file; do
newname=$(echo "$file" | tr ' ' '_')
if [ "$file" != "$newname" ]; then
mv "$file" "$newname"
echo "Переименован: $file -> $newname"
fi
done
Один из моих любимых скриптов — очистка директории от старых файлов:
#!/bin/bash
DIRECTORY="$1"
DAYS="$2"
if [ -z "$DIRECTORY" ] || [ -z "$DAYS" ]; then
echo "Использование: $0 <директория> <количество_дней>"
exit 1
fi
echo "Удаление файлов старше $DAYS дней из $DIRECTORY..."
find "$DIRECTORY" -type f -mtime +$DAYS -exec rm {} \;
echo "Готово!"
Для анализа размера директорий можно использовать:
#!/bin/bash
DIRECTORY="$1"
if [ -z "$DIRECTORY" ]; then
DIRECTORY="."
fi
echo "Топ 10 самых больших директорий в $DIRECTORY:"
du -h --max-depth=1 "$DIRECTORY" | sort -hr | head -n 10
- Преимущества автоматизации файловых операций: – Сокращение времени на рутинные операции – Минимизация человеческих ошибок – Возможность запуска по расписанию (через cron) – Единообразная обработка файлов – Возможность легко масштабировать операции на большое количество файлов
Мониторинг системы: bash-скрипты для контроля ресурсов
Мониторинг — критически важный аспект администрирования Linux-систем. Своевременное обнаружение проблем с ресурсами может предотвратить сбои в работе сервисов. Bash-скрипты позволяют создать простые, но эффективные системы мониторинга. 📊
Вот универсальный скрипт для мониторинга основных параметров системы:
#!/bin/bash
LOG_FILE="/var/log/system_monitor.log"
MAIL_TO="admin@example.com"
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# Проверка использования CPU
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
# Проверка использования ОЗУ
MEMORY_USAGE=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')
MEMORY_FREE=$(free -m | awk 'NR==2{print $4}')
# Проверка использования диска
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}')
DISK_FREE=$(df -h / | awk 'NR==2{print $4}')
# Проверка загрузки системы
LOAD=$(uptime | awk -F'[a-z]:' '{ print $2}' | sed 's/,//g')
# Запись в лог
echo "$DATE – CPU: $CPU_USAGE%, RAM: $MEMORY_USAGE (Free: $MEMORY_FREE MB), Disk: $DISK_USAGE (Free: $DISK_FREE), Load: $LOAD" >> $LOG_FILE
# Проверка на превышение пороговых значений
if (( $(echo "$CPU_USAGE > 80" | bc -l) )) || [[ ${DISK_USAGE%?} -gt 90 ]] || [[ ${MEMORY_USAGE%?} -gt 90 ]]; then
echo "ALERT: High resource usage on $HOSTNAME at $DATE
CPU: $CPU_USAGE%
RAM: $MEMORY_USAGE (Free: $MEMORY_FREE MB)
Disk: $DISK_USAGE (Free: $DISK_FREE)
Load: $LOAD" | mail -s "System Alert: High Resource Usage on $HOSTNAME" $MAIL_TO
fi
Для мониторинга работоспособности критичных сервисов подойдет такой скрипт:
#!/bin/bash
# Список сервисов для проверки
SERVICES=("nginx" "mysql" "apache2" "postgresql" "ssh")
LOG_FILE="/var/log/service_monitor.log"
MAIL_TO="admin@example.com"
check_service() {
local service=$1
systemctl is-active $service >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') – КРИТИЧЕСКАЯ ОШИБКА: Сервис $service не запущен!" >> $LOG_FILE
echo "Сервис $service на сервере $(hostname) не запущен! Требуется вмешательство." | mail -s "ALERT: $service DOWN on $(hostname)" $MAIL_TO
# Попытка перезапуска сервиса
systemctl restart $service
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') – ИНФОРМАЦИЯ: Сервис $service успешно перезапущен" >> $LOG_FILE
else
echo "$(date '+%Y-%m-%d %H:%M:%S') – ОШИБКА: Не удалось перезапустить сервис $service!" >> $LOG_FILE
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') – ИНФОРМАЦИЯ: Сервис $service работает нормально" >> $LOG_FILE
fi
}
for service in "${SERVICES[@]}"; do
if systemctl list-unit-files | grep -q "$service"; then
check_service $service
else
echo "$(date '+%Y-%m-%d %H:%M:%S') – ИНФОРМАЦИЯ: Сервис $service не установлен на этой системе" >> $LOG_FILE
fi
done
Для мониторинга сетевых подключений и выявления аномальной активности:
#!/bin/bash
LOG_FILE="/var/log/network_monitor.log"
THRESHOLD=100 # Порог числа подключений для уведомления
echo "=== Проверка сетевых подключений $(date) ===" >> $LOG_FILE
# Подсчет активных соединений по портам
echo "Топ 10 портов по числу соединений:" >> $LOG_FILE
netstat -ant | awk '{print $4}' | grep -o ":[0-9]\+" | cut -d: -f2 | sort | uniq -c | sort -nr | head -n 10 >> $LOG_FILE
# Проверка числа соединений в состоянии ESTABLISHED
ESTABLISHED=$(netstat -ant | grep ESTABLISHED | wc -l)
echo "Количество установленных соединений: $ESTABLISHED" >> $LOG_FILE
# Проверка числа соединений в состоянии CLOSE_WAIT
CLOSE_WAIT=$(netstat -ant | grep CLOSE_WAIT | wc -l)
echo "Количество соединений в состоянии CLOSE_WAIT: $CLOSE_WAIT" >> $LOG_FILE
# Проверка на подозрительно большое число соединений
if [ $ESTABLISHED -gt $THRESHOLD ] || [ $CLOSE_WAIT -gt $THRESHOLD ]; then
echo "ВНИМАНИЕ: Обнаружено большое количество соединений!" >> $LOG_FILE
# Вывод информации о подозрительных соединениях
echo "Подробная информация о соединениях:" >> $LOG_FILE
netstat -anp | head -n 50 >> $LOG_FILE
# Здесь можно добавить отправку уведомления
fi
| Параметр мониторинга | Команда для проверки | Безопасный порог | Критический порог | |
|---|---|---|---|---|
| Использование CPU | top -bn1 | grep "Cpu(s)" | < 70% | > 90% |
| Использование ОЗУ | free -m | < 75% | > 90% | |
| Использование диска | df -h / | < 80% | > 95% | |
| Средняя загрузка (Load Average) | uptime | < число ядер | > 2 * число ядер | |
| IOWAIT | iostat | < 10% | > 25% |
Одним из наиболее полезных скриптов для повседневного мониторинга является комплексный анализ производительности:
#!/bin/bash
echo "==== Анализ производительности системы ===="
echo "Дата: $(date)"
echo "Хост: $(hostname)"
echo
echo "--- Общая информация ---"
uptime
echo
echo "--- Загрузка CPU ---"
mpstat 1 5
echo
echo "--- Топ процессов по CPU ---"
ps aux --sort=-%cpu | head -n 6
echo
echo "--- Использование памяти ---"
free -m
echo
echo "--- Топ процессов по памяти ---"
ps aux --sort=-%mem | head -n 6
echo
echo "--- Использование диска ---"
df -h
echo
echo "--- Активность диска ---"
iostat -dx 1 5
echo
echo "--- Сетевая активность ---"
netstat -s | grep -E 'segments received|segments send'
echo
echo "--- Открытые порты ---"
ss -tuln
echo
echo "=== Анализ завершен ==="
Резервное копирование: автоматизация с помощью bash
Михаил Сорокин, Системный администратор
Ночь пятницы. Я готовился к заслуженным выходным, когда раздался звонок от директора по развитию. Их команда случайно удалила каталог с данными за три месяца работы — проект находился на грани срыва.
Я мог бы паниковать, но за месяц до этого настроил автоматическое инкрементное резервное копирование с помощью bash-скрипта. Скрипт каждую ночь упаковывал изменившиеся данные, шифровал их и отправлял на удаленное хранилище. Более того, каждое воскресенье делался полный бэкап.
Я зашел на сервер резервных копий, нашел последний инкрементный архив и восстановил данные за 15 минут. Директор был в шоке, команда — в восторге. С тех пор скрипты резервного копирования я внедрил во всех проектах компании. Это был тот случай, когда несколько часов работы над автоматизацией спасли недели труда целой команды.
Резервное копирование — фундаментальный аспект управления системами. Bash-скрипты делают этот процесс надежным и полностью автоматизированным. 💾
Вот скрипт для создания полного резервного копирования директории с датированием и ротацией:
#!/bin/bash
# Конфигурация
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/backup/www"
MAX_BACKUPS=7 # Хранить не более 7 резервных копий
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_DIR/www_backup_$DATE.tar.gz"
LOG_FILE="/var/log/backup.log"
# Создаем директорию для резервных копий, если она не существует
mkdir -p $BACKUP_DIR
# Запись в лог
echo "$(date): Начало резервного копирования $SOURCE_DIR в $BACKUP_FILE" >> $LOG_FILE
# Создание резервной копии
tar -czf $BACKUP_FILE $SOURCE_DIR
# Проверка результата
if [ $? -eq 0 ]; then
echo "$(date): Резервное копирование успешно завершено" >> $LOG_FILE
# Удаление старых резервных копий
ls -1t $BACKUP_DIR/www_backup_*.tar.gz | tail -n +$((MAX_BACKUPS+1)) | xargs -r rm
echo "$(date): Старые резервные копии удалены, оставлено последних $MAX_BACKUPS" >> $LOG_FILE
else
echo "$(date): ОШИБКА при создании резервной копии!" >> $LOG_FILE
fi
# Вывод статистики
BACKUP_SIZE=$(du -h $BACKUP_FILE | cut -f1)
echo "$(date): Размер резервной копии: $BACKUP_SIZE" >> $LOG_FILE
echo "$(date): Список актуальных резервных копий:" >> $LOG_FILE
ls -lh $BACKUP_DIR | grep www_backup | tail -n $MAX_BACKUPS >> $LOG_FILE
echo "------------------------------------" >> $LOG_FILE
Для создания инкрементных резервных копий, сохраняющих только изменения с последнего бэкапа:
#!/bin/bash
# Конфигурация
SOURCE_DIR="/home/user/documents"
BACKUP_DIR="/backup/incremental"
LAST_BACKUP_FILE="$BACKUP_DIR/last_backup.tar.gz"
SNAPSHOT_DIR="$BACKUP_DIR/snapshots"
LAST_SNAPSHOT="$SNAPSHOT_DIR/last_snapshot.dat"
CURRENT_SNAPSHOT="$SNAPSHOT_DIR/snapshot_$(date +"%Y%m%d").dat"
LOG_FILE="/var/log/incremental_backup.log"
# Создание необходимых директорий
mkdir -p $BACKUP_DIR $SNAPSHOT_DIR
# Запись в лог
echo "$(date): Начало инкрементного резервного копирования $SOURCE_DIR" >> $LOG_FILE
# Если это первое резервное копирование
if [ ! -f "$LAST_SNAPSHOT" ]; then
echo "$(date): Создание полного резервного копирования (первый запуск)" >> $LOG_FILE
# Создание снимка текущего состояния
find $SOURCE_DIR -type f -print0 | xargs -0 sha1sum > $CURRENT_SNAPSHOT
# Создание полного бэкапа
tar -czf "$BACKUP_DIR/full_backup_$(date +"%Y%m%d").tar.gz" $SOURCE_DIR
# Копирование снимка как последний
cp $CURRENT_SNAPSHOT $LAST_SNAPSHOT
echo "$(date): Полное резервное копирование завершено" >> $LOG_FILE
exit 0
fi
# Создание снимка текущего состояния
find $SOURCE_DIR -type f -print0 | xargs -0 sha1sum > $CURRENT_SNAPSHOT
# Нахождение измененных файлов
CHANGED_FILES=$(diff $LAST_SNAPSHOT $CURRENT_SNAPSHOT | grep ">" | awk '{print $3}')
# Если нет изменений
if [ -z "$CHANGED_FILES" ]; then
echo "$(date): Изменений не обнаружено, резервное копирование не требуется" >> $LOG_FILE
exit 0
fi
# Создание временного файла со списком изменений
TEMP_FILE=$(mktemp)
echo "$CHANGED_FILES" > $TEMP_FILE
# Создание инкрементного бэкапа
INCREMENTAL_BACKUP="$BACKUP_DIR/incremental_$(date +"%Y%m%d_%H%M%S").tar.gz"
tar -czf $INCREMENTAL_BACKUP -T $TEMP_FILE
# Очистка
rm $TEMP_FILE
# Обновление последнего снимка
cp $CURRENT_SNAPSHOT $LAST_SNAPSHOT
echo "$(date): Инкрементное резервное копирование завершено. Создан файл $INCREMENTAL_BACKUP" >> $LOG_FILE
echo "$(date): Количество измененных файлов: $(echo "$CHANGED_FILES" | wc -l)" >> $LOG_FILE
Для автоматического резервного копирования базы данных MySQL/MariaDB:
#!/bin/bash
# Конфигурация
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y-%m-%d")
MYSQLDUMP_OPTS="--single-transaction --quick --lock-tables=false"
LOG_FILE="/var/log/mysql_backup.log"
# Создание директории для бэкапов
mkdir -p $BACKUP_DIR
# Запись в лог
echo "$(date): Начало резервного копирования баз данных MySQL" >> $LOG_FILE
# Получение списка всех баз данных, исключая системные
databases=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)")
# Резервное копирование каждой базы данных
for db in $databases; do
# Имя файла бэкапа
BACKUP_FILE="$BACKUP_DIR/${db}_${DATE}.sql.gz"
echo "$(date): Создание резервной копии базы данных $db" >> $LOG_FILE
# Создание бэкапа и сжатие на лету
mysqldump -u$DB_USER -p$DB_PASS $MYSQLDUMP_OPTS $db | gzip > $BACKUP_FILE
if [ $? -eq 0 ]; then
echo "$(date): Резервное копирование базы данных $db успешно завершено" >> $LOG_FILE
# Установка прав доступа
chmod 600 $BACKUP_FILE
else
echo "$(date): ОШИБКА при создании резервной копии базы данных $db!" >> $LOG_FILE
fi
done
# Удаление бэкапов старше 30 дней
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "$(date): Удалены резервные копии старше 30 дней" >> $LOG_FILE
echo "$(date): Резервное копирование баз данных MySQL завершено" >> $LOG_FILE
Интегрируйте эти скрипты с cron для полной автоматизации процесса резервного копирования:
- Ежедневное инкрементное резервирование: 0 1 * /path/to/incremental_backup.sh
- Еженедельное полное резервирование: 0 2 0 /path/to/full_backup.sh
- Ежедневное резервирование базы данных: 0 3 * /path/to/mysql_backup.sh
Оптимизация рабочего процесса: продвинутые скрипты bash
Продвинутые скрипты bash способны существенно оптимизировать рабочий процесс, позволяя автоматизировать комплексные задачи и интегрировать различные системы. Рассмотрим несколько мощных примеров, которые поднимут ваш уровень автоматизации. 🔄
Вот скрипт для автоматического развертывания веб-приложения:
#!/bin/bash
# Конфигурация
APP_NAME="myapp"
GIT_REPO="git@github.com:username/repo.git"
DEPLOY_DIR="/var/www/$APP_NAME"
BACKUP_DIR="/backup/deployments"
LOG_FILE="/var/log/deployment.log"
SLACK_WEBHOOK="https://hooks.slack.com/services/your/webhook/url"
# Функция для отправки уведомлений в Slack
send_notification() {
local message="$1"
local status="$2" # success или failure
curl -s -X POST --data-urlencode "payload={\"text\": \"$message\", \"username\": \"DeployBot\", \"icon_emoji\": \":rocket:\"}" $SLACK_WEBHOOK
}
# Логирование
log() {
local message="$1"
echo "$(date '+%Y-%m-%d %H:%M:%S') – $message" >> $LOG_FILE
echo "$message"
}
# Начало развертывания
log "Начало развертывания $APP_NAME из репозитория $GIT_REPO"
send_notification "🚀 Начато развертывание $APP_NAME" "success"
# Создание резервной копии текущей версии
if [ -d "$DEPLOY_DIR" ]; then
BACKUP_FILE="$BACKUP_DIR/${APP_NAME}_$(date +"%Y%m%d_%H%M%S").tar.gz"
mkdir -p $BACKUP_DIR
log "Создание резервной копии текущей версии в $BACKUP_FILE"
tar -czf $BACKUP_FILE $DEPLOY_DIR
if [ $? -ne 0 ]; then
log "ОШИБКА: Не удалось создать резервную копию!"
send_notification "❌ Ошибка развертывания $APP_NAME: сбой при создании резервной копии" "failure"
exit 1
fi
fi
# Клонирование репозитория во временную директорию
TEMP_DIR=$(mktemp -d)
log "Клонирование репозитория во временную директорию $TEMP_DIR"
git clone $GIT_REPO $TEMP_DIR
if [ $? -ne 0 ]; then
log "ОШИБКА: Не удалось клонировать репозиторий!"
send_notification "❌ Ошибка развертывания $APP_NAME: сбой при клонировании репозитория" "failure"
rm -rf $TEMP_DIR
exit 1
fi
# Запуск тестов
log "Запуск тестов"
cd $TEMP_DIR
if [ -f "./run_tests.sh" ]; then
bash ./run_tests.sh
if [ $? -ne 0 ]; then
log "ОШИБКА: Тесты не пройдены!"
send_notification "❌ Ошибка развертывания $APP_NAME: тесты не пройдены" "failure"
rm -rf $TEMP_DIR
exit 1
fi
fi
# Сборка проекта (если требуется)
if [ -f "./build.sh" ]; then
log "Запуск процесса сборки"
bash ./build.sh
if [ $? -ne 0 ]; then
log "ОШИБКА: Сборка не удалась!"
send_notification "❌ Ошибка развертывания $APP_NAME: сборка не удалась" "failure"
rm -rf $TEMP_DIR
exit 1
fi
fi
# Обновление кода
log "Обновление кода в $DEPLOY_DIR"
mkdir -p $DEPLOY_DIR
rsync -av --delete $TEMP_DIR/ $DEPLOY_DIR/ --exclude='.git'
if [ $? -ne 0 ]; then
log "ОШИБКА: Не удалось обновить код!"
send_notification "❌ Ошибка развертывания $APP_NAME: не удалось обновить код" "failure"
rm -rf $TEMP_DIR
exit 1
fi
# Обновление зависимостей
if [ -f "$DEPLOY_DIR/requirements.txt" ]; then
log "Обновление Python зависимостей"
pip install -r $DEPLOY_DIR/requirements.txt
elif [ -f "$DEPLOY_DIR/package.json" ]; then
log "Обновление Node.js зависимостей"
cd $DEPLOY_DIR && npm install
fi
# Перезапуск сервисов
log "Перезапуск сервисов"
if [ -f "$DEPLOY_DIR/restart.sh" ]; then
bash $DEPLOY_DIR/restart.sh
else
# Стандартный перезапуск для популярных сервисов
systemctl restart nginx
[ -f "/etc/systemd/system/$APP_NAME.service" ] && systemctl restart $APP_NAME
fi
# Очистка
rm -rf $TEMP_DIR
# Завершение
log "Развертывание $APP_NAME успешно завершено"
send_notification "✅ Развертывание $APP_NAME успешно завершено" "success"
Скрипт для автоматического обновления системы с проверкой и уведомлением:
#!/bin/bash
LOG_FILE="/var/log/system_update.log"
EMAIL="admin@example.com"
HOSTNAME=$(hostname)
# Функция для логирования
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') – $1" >> $LOG_FILE
}
log "Начало процесса обновления системы"
# Проверка, запущен ли скрипт от имени root
if [ "$(id -u)" != "0" ]; then
log "Этот скрипт должен быть запущен от имени root"
exit 1
fi
# Создание снимка системы перед обновлением (если используется LVM)
if command -v lvcreate &> /dev/null && lvs | grep -q "root"; then
log "Создание LVM-снимка перед обновлением"
SNAPSHOT_NAME="rootvol_snapshot_$(date +%Y%m%d%H%M)"
lvcreate -L 2G -s -n $SNAPSHOT_NAME /dev/mapper/vg-root
if [ $? -eq 0 ]; then
log "LVM-снимок $SNAPSHOT_NAME успешно создан"
else
log "ОШИБКА: Не удалось создать LVM-снимок"
fi
fi
# Обновление списка пакетов
log "Обновление списка пакетов"
apt-get update
if [ $? -ne 0 ]; then
log "ОШИБКА: Не удалось обновить список пакетов"
echo "Ошибка обновления списка пакетов на сервере $HOSTNAME" | mail -s "Ошибка обновления системы на $HOSTNAME" $EMAIL
exit 1
fi
# Получение списка пакетов, которые будут обновлены
UPDATES=$(apt-get -s upgrade | grep -P '^Inst' | wc -l)
SECURITY_UPDATES=$(apt-get -s upgrade | grep -P '^Inst.*security' | wc -l)
log "Доступно обновлений: $UPDATES (из них обновлений безопасности: $SECURITY_UPDATES)"
if [ $UPDATES -eq 0 ]; then
log "Нет доступных обновлений. Завершение работы."
exit 0
fi
# Создание списка пакетов для обновления
PACKAGE_LIST=$(apt-get -s upgrade | grep -P '^Inst' | awk '{print $2}')
log "Список пакетов для обновления:<br>$PACKAGE_LIST"
# Обновление системы
log "Начало процесса обновления пакетов"
apt-get -y upgrade
if [ $? -ne 0 ]; then
log "ОШИБКА: Процесс обновления завершился с ошибками"
echo "Ошибка при обновлении системы на сервере $HOSTNAME" | mail -s "Ошибка обновления системы на $HOSTNAME" $EMAIL
exit 1
fi
# Проверка необходимости перезагрузки
if [ -f /var/run/reboot-required ]; then
log "Требуется перезагрузка системы"
echo "Система $HOSTNAME обновлена, но требуется перезагрузка." | mail -s "Обновление системы $HOSTNAME: требуется перезагрузка" $EMAIL
else
log "Перезагрузка системы не требуется"
echo "Система $HOSTNAME успешно обновлена. Установлено $UPDATES обновлений (из них $SECURITY_UPDATES обновлений безопасности)." | mail -s "Система $HOSTNAME успешно обновлена" $EMAIL
fi
# Очистка
log "Удаление ненужных пакетов"
apt-get -y autoremove
apt-get -y autoclean
log "Процесс обновления системы успешно завершен"
Скрипты bash превосходны для создания комплексных сценариев автоматизации, которые охватывают несколько систем и сервисов. Вот примеры задач, которые можно эффективно автоматизировать:
- Автоматическое развертывание приложений с настройкой окружения
- Обновление множества серверов с контролем процесса
- Интеграция с системами CI/CD для автоматической доставки обновлений
- Создание комплексных систем мониторинга и оповещения
- Автоматизированное тестирование инфраструктуры и безопасности
- Миграция данных между системами с валидацией результатов
Для оптимизации рабочих процессов рекомендую следующие практики:
- Разделяйте скрипты на модули для повторного использования функций
- Используйте версионный контроль для скриптов (Git)
- Документируйте назначение и параметры скриптов
- Добавляйте логирование и механизмы обработки ошибок
- Внедряйте механизмы уведомления об успешном/неуспешном выполнении
Использование скриптов bash для автоматизации рутинных задач — не просто экономия времени, а полноценная стратегия управления инфраструктурой. Автоматизация минимизирует человеческие ошибки, обеспечивает стабильность работы систем и позволяет вам сосредоточиться на действительно важных задачах. Помните: если вы делаете что-то более двух раз — это кандидат на автоматизацию. Превратите скрипты в свою суперсилу, и ваша система будет работать как отлаженный механизм, требующий минимума вмешательства.
Читайте также
- Как стать гейм-дизайнером: от геймера до создателя игр – путь
- Настройка Git в Visual Studio: интеграция и основные преимущества
- Искусственный интеллект в Сбербанке: технологическая революция банка
- Примеры настройки мониторинга: Практическое руководство
- Сравнение Cypress, Selenium и Playwright
- Git и GitHub: руководство для начинающих разработчиков
- Инфографика: 5 шагов создания визуального контента для новичков
- Управление ключевыми рисками проекта: стратегии и методологии
- Git и GitLab: полное руководство по системе контроля версий кода
- AWS DevOps Engineer: путь к сертификации, практические советы