Когато започнах пътуването си в DevOps света, една от първите неща, които разбрах, беше това: автоматизацията е всичко. Bash скриптовете са основата на тази автоматизация. Те са като швейцарско ножче за системните администратори и DevOps инженерите.
В тази статия ще споделя 13 практични Bash скрипта. Всеки от тях ще ви спести часове работа и ще подобри ефективността ви. Тези скриптове са проверени в реални проекти и са подходящи за ежедневна употреба.
Защо Bash скриптовете са толкова важни в DevOps?
Bash е навсякъде в Linux и Unix системите. Той е лесен за изучаване и мощен едновременно. За DevOps професионалистите Bash скриптовете са като дишането – нещо естествено и необходимо.
Ето защо трябва да ги овладеете:
- Скорост: Автоматизират повтарящи се задачи
- Надеждност: Намаляват човешките грешки
- Гъвкавост: Работят на всички Unix-подобни системи
- Икономия: Спестяват време и ресурси
Нека започнем с практическите примери.
1. Скрипт за проверка на системното състояние
Първият скрипт е като лекарски преглед за вашия сървър. Той проверява основните показатели за здравето на системата.
#!/bin/bash
# system_health_check.sh
echo "=== СИСТЕМНА ПРОВЕРКА ==="
echo "Дата: $(date)"
echo
# Проверка на използваната памет
echo "=== ПАМЕТ ==="
free -h | grep -E "^Mem"
# Проверка на дисковото пространство
echo -e "\n=== ДИСКОВЕ ==="
df -h | head -n 1
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
# Проверка на CPU натоварването
echo -e "\n=== CPU НАТОВАРВАНЕ ==="
uptime
# Топ 5 процеса по CPU
echo -e "\n=== ТОП ПРОЦЕСИ ==="
ps aux | head -n 1
ps aux | sort -rn -k 3 | head -n 5
echo -e "\n=== МРЕЖА ==="
ss -tuln | wc -l | xargs echo "Активни мрежови връзки:"
Този скрипт ви дава бърз преглед на състоянието на сървъра. Използвайте го всеки ден като първа проверка.
2. Автоматично архивиране на файлове
Архивирането е критично за всеки DevOps процес. Този скрипт създава архиви със времева печат.
#!/bin/bash
# backup_files.sh
SOURCE_DIR="$1"
BACKUP_DIR="$2"
if [ $# -ne 2 ]; then
echo "Използване: $0 <източник> <архив_директория>"
exit 1
fi
# Създаване на архивна директория ако не съществува
mkdir -p "$BACKUP_DIR"
# Генериране на име с времева печат
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${TIMESTAMP}.tar.gz"
# Създаване на архив
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}" -C "$(dirname $SOURCE_DIR)" "$(basename $SOURCE_DIR)"
if [ $? -eq 0 ]; then
echo "Архивът е създаден успешно: ${BACKUP_DIR}/${BACKUP_NAME}"
ls -lh "${BACKUP_DIR}/${BACKUP_NAME}"
else
echo "Грешка при създаване на архива!"
exit 1
fi
Използвайте го така: ./backup_files.sh /path/to/source /path/to/backups
3. Мониториране на дискового пространство
Този скрипт следи дисковото пространство и изпраща предупреждения.
#!/bin/bash
# disk_monitor.sh
THRESHOLD=80
EMAIL="[email protected]"
# Проверка на всички файлови системи
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read line; do
USAGE=$(echo $line | awk '{print $1}' | sed 's/%//g')
PARTITION=$(echo $line | awk '{print $2}')
if [ $USAGE -ge $THRESHOLD ]; then
echo "ПРЕДУПРЕЖДЕНИЕ: $PARTITION използва ${USAGE}% от пространството!"
# Изпращане на email (опционално)
# echo "Дискът $PARTITION е $USAGE% пълен!" | mail -s "Disk Alert" $EMAIL
fi
done
Добавете този скрипт в cron за автоматично мониториране:
# Проверка всеки час
0 * * * * /path/to/disk_monitor.sh
4. Управление на процеси
Този скрипт ви помага да управлявате процеси по име или PID.
#!/bin/bash
# process_manager.sh
ACTION="$1"
PROCESS_NAME="$2"
case $ACTION in
"start")
echo "Стартиране на $PROCESS_NAME..."
systemctl start "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" start
;;
"stop")
echo "Спиране на $PROCESS_NAME..."
systemctl stop "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" stop
;;
"restart")
echo "Рестартиране на $PROCESS_NAME..."
systemctl restart "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" restart
;;
"status")
systemctl status "$PROCESS_NAME" 2>/dev/null || service "$PROCESS_NAME" status
;;
"kill")
echo "Принудително спиране на процеси съдържащи: $PROCESS_NAME"
pkill -f "$PROCESS_NAME"
;;
*)
echo "Използване: $0 {start|stop|restart|status|kill} <име_на_процес>"
exit 1
;;
esac
5. Проверка на мрежова свързаност
Мрежовите проблеми са често срещани. Този скрипт тества свързаността с множество хостове.
#!/bin/bash
# network_check.sh
HOSTS=("google.com" "github.com" "stackoverflow.com" "8.8.8.8")
LOG_FILE="/tmp/network_check.log"
echo "Проверка на мрежовата свързаност - $(date)" | tee -a $LOG_FILE
for host in "${HOSTS[@]}"; do
if ping -c 3 -W 5 "$host" &> /dev/null; then
echo "✅ $host - достъпен" | tee -a $LOG_FILE
else
echo "❌ $host - недостъпен" | tee -a $LOG_FILE
fi
done
echo "Проверката завърши - $(date)" | tee -a $LOG_FILE
echo "Подробности в: $LOG_FILE"
6. Почистване на системни файлове
Този скрипт освобождава място чрез изтриване на временни и ненужни файлове.
#!/bin/bash
# system_cleanup.sh
echo "Започване на системно почистване..."
# Получаване на първоначално свободно място
INITIAL_SPACE=$(df / | awk 'NR==2 {print $4}')
# Почистване на APT cache (Ubuntu/Debian)
if command -v apt &> /dev/null; then
echo "Почистване на APT cache..."
sudo apt autoremove -y
sudo apt autoclean
fi
# Почистване на YUM cache (RHEL/CentOS)
if command -v yum &> /dev/null; then
echo "Почистване на YUM cache..."
sudo yum clean all
fi
# Изтриване на стари log файлове
echo "Почистване на log файлове..."
find /var/log -name "*.log" -type f -mtime +30 -delete 2>/dev/null
find /var/log -name "*.gz" -type f -mtime +30 -delete 2>/dev/null
# Почистване на temp директории
echo "Почистване на временни файлове..."
rm -rf /tmp/*
rm -rf /var/tmp/*
# Калкулиране на освободеното място
FINAL_SPACE=$(df / | awk 'NR==2 {print $4}')
FREED_SPACE=$((FINAL_SPACE - INITIAL_SPACE))
echo "Почистването завърши!"
echo "Освободени: $(($FREED_SPACE / 1024)) MB"
7. Мониториране на услуги
Този скрипт проверява дали критичните услуги работят правилно.
#!/bin/bash
# service_monitor.sh
SERVICES=("nginx" "mysql" "ssh" "docker")
LOG_FILE="/var/log/service_monitor.log"
check_service() {
local service=$1
if systemctl is-active --quiet "$service"; then
echo "$(date): ✅ $service работи" >> $LOG_FILE
return 0
else
echo "$(date): ❌ $service не работи!" >> $LOG_FILE
# Опит за автоматичен рестарт
echo "$(date): Опит за рестарт на $service..." >> $LOG_FILE
systemctl restart "$service"
sleep 5
if systemctl is-active --quiet "$service"; then
echo "$(date): ✅ $service е рестартиран успешно" >> $LOG_FILE
else
echo "$(date): ❌ Неуспешен рестарт на $service!" >> $LOG_FILE
# Тук може да добавите изпращане на email или друго уведомление
fi
fi
}
echo "$(date): Започване на проверка на услуги" >> $LOG_FILE
for service in "${SERVICES[@]}"; do
check_service "$service"
done
echo "$(date): Проверката завърши" >> $LOG_FILE
8. Синхронизиране на файлове
Този скрипт синхронизира файлове между директории или сървъри.
#!/bin/bash
# sync_files.sh
SOURCE="$1"
DESTINATION="$2"
LOG_FILE="/var/log/sync.log"
if [ $# -ne 2 ]; then
echo "Използване: $0 <източник> <дестинация>"
echo "Примери:"
echo " $0 /local/dir/ user@server:/remote/dir/"
echo " $0 /dir1/ /dir2/"
exit 1
fi
echo "$(date): Започване на синхронизация" >> $LOG_FILE
echo "Източник: $SOURCE" >> $LOG_FILE
echo "Дестинация: $DESTINATION" >> $LOG_FILE
# Използване на rsync за ефективна синхронизация
rsync -avz --delete --progress "$SOURCE" "$DESTINATION" 2>&1 | tee -a $LOG_FILE
if [ ${PIPESTATUS[0]} -eq 0 ]; then
echo "$(date): Синхронизацията завърши успешно" >> $LOG_FILE
else
echo "$(date): Грешка при синхронизация!" >> $LOG_FILE
exit 1
fi
9. Управление на потребители
Този скрипт автоматизира създаването и управлението на потребители.
#!/bin/bash
# user_manager.sh
ACTION="$1"
USERNAME="$2"
PASSWORD="$3"
create_user() {
local user=$1
local pass=$2
if id "$user" &>/dev/null; then
echo "Потребителят $user вече съществува!"
return 1
fi
# Създаване на потребител
useradd -m -s /bin/bash "$user"
# Задаване на парола
if [ -n "$pass" ]; then
echo "$user:$pass" | chpasswd
fi
echo "Потребителят $user е създаден успешно!"
}
delete_user() {
local user=$1
if ! id "$user" &>/dev/null; then
echo "Потребителят $user не съществува!"
return 1
fi
# Изтриване на потребител и домашна директория
userdel -r "$user" 2>/dev/null
echo "Потребителят $user е изтрит!"
}
case $ACTION in
"create")
if [ -z "$USERNAME" ]; then
echo "Използване: $0 create <потребител> [парола]"
exit 1
fi
create_user "$USERNAME" "$PASSWORD"
;;
"delete")
if [ -z "$USERNAME" ]; then
echo "Използване: $0 delete <потребител>"
exit 1
fi
delete_user "$USERNAME"
;;
"list")
echo "Потребители в системата:"
cut -d: -f1 /etc/passwd | sort
;;
*)
echo "Използване: $0 {create|delete|list} [потребител] [парола]"
exit 1
;;
esac
10. Мониториране на SSL сертификати
SSL сертификатите изтичат. Този скрипт ви предупреждава предварително.
#!/bin/bash
# ssl_monitor.sh
DOMAINS=("example.com" "api.example.com" "www.example.com")
THRESHOLD_DAYS=30
EMAIL="[email protected]"
check_ssl_cert() {
local domain=$1
local expiry_date
local days_until_expiry
# Получаване на датата на изтичане
expiry_date=$(openssl s_client -servername "$domain" -connect "$domain:443" </dev/null 2>/dev/null |
openssl x509 -noout -dates | grep notAfter | cut -d= -f2)
if [ -z "$expiry_date" ]; then
echo "❌ Не може да се провери $domain"
return 1
fi
# Калкулиране на дните до изтичане
expiry_timestamp=$(date -d "$expiry_date" +%s)
current_timestamp=$(date +%s)
days_until_expiry=$(( (expiry_timestamp - current_timestamp) / 86400 ))
echo "$domain: $days_until_expiry дни до изтичане"
if [ $days_until_expiry -le $THRESHOLD_DAYS ]; then
echo "⚠️ ВНИМАНИЕ: $domain изтича след $days_until_expiry дни!"
# Изпращане на email предупреждение
# echo "$domain SSL cert expires in $days_until_expiry days" | mail -s "SSL Alert" $EMAIL
fi
}
echo "Проверка на SSL сертификати - $(date)"
echo "========================================"
for domain in "${DOMAINS[@]}"; do
check_ssl_cert "$domain"
done
11. Мониториране на база данни
Този скрипт проверява състоянието на MySQL/PostgreSQL база данни.
#!/bin/bash
# database_monitor.sh
DB_TYPE="$1" # mysql или postgresql
DB_HOST="localhost"
DB_USER="monitoring_user"
DB_PASS="password"
LOG_FILE="/var/log/db_monitor.log"
check_mysql() {
# Проверка на MySQL връзка
mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e "SELECT 1;" &>/dev/null
if [ $? -eq 0 ]; then
echo "$(date): ✅ MySQL е достъпна" >> $LOG_FILE
# Проверка на активни връзки
connections=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e "SHOW STATUS LIKE 'Threads_connected';" | awk 'NR==2 {print $2}')
echo "$(date): Активни връзки: $connections" >> $LOG_FILE
# Проверка на размера на базата
db_size=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 1) AS 'DB Size in MB' FROM information_schema.tables;" | awk 'NR==2 {print $1}')
echo "$(date): Размер на БД: ${db_size}MB" >> $LOG_FILE
else
echo "$(date): ❌ MySQL не е достъпна!" >> $LOG_FILE
fi
}
check_postgresql() {
# Проверка на PostgreSQL връзка
PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -U "$DB_USER" -d postgres -c "SELECT 1;" &>/dev/null
if [ $? -eq 0 ]; then
echo "$(date): ✅ PostgreSQL е достъпна" >> $LOG_FILE
# Проверка на активни връзки
connections=$(PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -U "$DB_USER" -d postgres -t -c "SELECT count(*) FROM pg_stat_activity;")
echo "$(date): Активни връзки: $connections" >> $LOG_FILE
else
echo "$(date): ❌ PostgreSQL не е достъпна!" >> $LOG_FILE
fi
}
case $DB_TYPE in
"mysql")
check_mysql
;;
"postgresql")
check_postgresql
;;
*)
echo "Използване: $0 {mysql|postgresql}"
exit 1
;;
esac
12. Управление на Git хранилища
Този скрипт автоматизира често срещани Git операции.
#!/bin/bash
# git_manager.sh
REPO_DIR="$1"
ACTION="$2"
BRANCH="${3:-main}"
if [ ! -d "$REPO_DIR" ]; then
echo "Директорията $REPO_DIR не съществува!"
exit 1
fi
cd "$REPO_DIR" || exit 1
# Проверка дали е Git хранилище
if [ ! -d ".git" ]; then
echo "Това не е Git хранилище!"
exit 1
fi
case $ACTION in
"status")
echo "=== Git статус за $REPO_DIR ==="
git status --short
echo
git log --oneline -5
;;
"pull")
echo "Изтегляне на промени за $REPO_DIR..."
git pull origin "$BRANCH"
;;
"push")
echo "Качване на промени за $REPO_DIR..."
git add -A
git commit -m "Auto-commit: $(date)"
git push origin "$BRANCH"
;;
"backup")
echo "Създаване на архив на $REPO_DIR..."
BACKUP_NAME="backup_$(basename $REPO_DIR)_$(date +%Y%m%d_%H%M%S).tar.gz"
tar -czf "../$BACKUP_NAME" .
echo "Архивът е създаден: ../$BACKUP_NAME"
;;
"clean")
echo "Почистване на $REPO_DIR..."
git clean -fd
git reset --hard HEAD
;;
*)
echo "Използване: $0 <директория> {status|pull|push|backup|clean} [branch]"
exit 1
;;
esac
13. Централизиран скрипт за мониториране
Този финален скрипт комбинира всички проверки в едно място.
#!/bin/bash
# master_monitor.sh
LOG_DIR="/var/log/monitoring"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="$LOG_DIR/system_report_$TIMESTAMP.log"
# Създаване на log директория
mkdir -p "$LOG_DIR"
# Начало на отчета
{
echo "========================================"
echo "СИСТЕМЕН ОТЧЕТ - $(date)"
echo "========================================"
echo
# Системна информация
echo "=== СИСТЕМНА ИНФОРМАЦИЯ ==="
echo "Hostname: $(hostname)"
echo "Kernel: $(uname -r)"
echo "Uptime: $(uptime -p)"
echo "Load Average: $(uptime | awk -F'load average:' '{print $2}')"
echo
# Памет и дискове
echo "=== РЕСУРСИ ==="
echo "Памет:"
free -h | grep -E "^Mem|^Swap"
echo
echo "Дискове:"
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
echo
# Мрежа
echo "=== МРЕЖА ==="
echo "Активни връзки: $(ss -tuln | wc -l)"
echo "Мрежови интерфейси:"
ip -4 addr show | grep -E "^[0-9]|inet " | grep -v "127.0.0.1"
echo
# Топ процеси
echo "=== ТОП 5 ПРОЦЕСА ПО CPU ==="
ps aux --sort=-%cpu | head -n 6
echo
# Услуги
echo "=== КРИТИЧНИ УСЛУГИ ==="
for service in nginx mysql ssh docker; do
if systemctl is-active --quiet "$service" 2>/dev/null; then
echo "✅ $service - работи"
else
echo "❌ $service - не работи"
fi
done
echo
# Последни log записи
echo "=== ПОСЛЕДНИ СИСТЕМНИ СЪОБЩЕНИЯ ==="
journalctl --since "1 hour ago" --no-pager -n 10
echo "========================================"
echo "ОТЧЕТЪТ ЗАВЪРШИ - $(date)"
echo "========================================"
} > "$REPORT_FILE"
echo "Системният отчет е запазен в: $REPORT_FILE"
# Изпращане по email (опционално)
# mail -s "System Report $(hostname)" [email protected] < "$REPORT_FILE"
# Почистване на стари отчети (пази последните 7 дни)
find "$LOG_DIR" -name "system_report_*.log" -type f -mtime +7 -delete
Заключение
Тези 13 Bash скрипта са основата на всяка добра DevOps практика. Всеки от тях решава реален проблем и може да се адаптира според вашите нужди.
Препоръчвам ви да:
- Започнете с първите 3 скрипта – те са най-универсални
- Адаптирайте ги според вашата среда
- Тествайте внимателно преди внедряване в продукция
- Документирайте промените които правите
Помнете: автоматизацията не е цел, а средство. Целта е да имате повече време за творческа работа и по-малко време за рутинни задачи.
Какъв е следващият ви скрипт? Споделете вашия опит в коментарите и нека се учим заедно!
Статията е написана с цел споделяне на знания и опит в DevOps общността. За въпроси и предложения се свържете с мен.