Управление серверами Linux ежедневно может быть увлекательным и напряженным, особенно когда вы сталкиваетесь с неожиданными простоями или сбоями в обслуживании.
Вот почему я всегда рекомендую автоматизировать ежедневные проверки состояния системы. Если вы заранее знаете, что у вас заканчивается место на диске или какая-то служба отключилась, вы сможете исправить это, прежде чем пользователи начнут жаловаться.
Создание сценария Bash#
Создайте новый файл с именем system-health.sh
в вашем предпочитаемом каталоге, например, /usr/local/bin
.
1
| $ sudo nano /usr/local/bin/system-health.sh
|
Вставьте следующие строки кода:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| #!/bin/bash
# =====================================================================
# Simple System Health Check Script
# =====================================================================
# Описание: Вы должны увидеть хорошо структурированный отчет с подробностями.
# Скрипт: ./system-health.sh [config_file]
# =====================================================================
LOGFILE="/var/log/system-health-$(date +%F).log"
HOSTNAME=$(hostname)
DATE=$(date)
{
echo "============================================"
echo " System Health Report for $HOSTNAME"
echo " Generated on: $DATE"
echo "============================================"
Disk Usage
echo -e "\nDisk Usage:"
printf "%-20s %-10s %-10s %-10s %-6s %-s\n" "Filesystem" "Size" "Used" "Avail" "Use%" "Mounted on"
df -h --output=source,size,used,avail,pcent,target | tail -n +2
CPU Load
echo -e "\nCPU Load (1/5/15 min average):"
uptime | awk -F'load average:' '{ print " " $2 }'
Memory Usage
echo -e "\nMemory Usage:"
free -h | awk 'NR==1 || /Mem|Swap/ { printf " %-10s %-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $4, $5, $6 }'
Failed Services
echo -e "\nFailed Systemd Services:"
FAILED=$(systemctl --failed --no-legend)
if [ -z "$FAILED" ]; then
echo " No failed services."
else
echo "$FAILED" | while read -r line; do
echo " $line"
done
fi
Top 5 Memory-Consuming Processes
echo -e "\nTop 5 Memory Consuming Processes:"
ps -eo user,pid,%cpu,%mem,command --sort=-%mem | head -n 6 | \
awk '{ printf " %-10s %-6s %-6s %-6s %-s\n", $1, $2, $3, $4, substr($0, index($0,$5), 60) }'
Top 5 CPU-Consuming Processes
echo -e "\nTop 5 CPU Consuming Processes:"
ps -eo user,pid,%cpu,%mem,command --sort=-%cpu | head -n 6 | \
awk '{ printf " %-10s %-6s %-6s %-6s %-s\n", $1, $2, $3, $4, substr($0, index($0,$5), 60) }'
Uptime
echo -e "\nSystem Uptime:"
echo " $(uptime -p)"
Package Updates
echo -e "\nAvailable Package Updates:"
if command -v apt &> /dev/null; then
UPDATES=$(apt list --upgradable 2>/dev/null | grep -v "Listing...")
if [ -z "$UPDATES" ]; then
echo " System is up to date."
else
echo "$UPDATES" | awk '{ print " " $0 }'
fi
elif command -v dnf &> /dev/null; then
dnf check-update || echo " System is up to date."
elif command -v yum &> /dev/null; then
yum check-update || echo " System is up to date."
else
echo " Package manager not supported."
fi
echo -e "\nEnd of Report"
} > "$LOGFILE"
Optional: Send report via mail (if mail is configured)
MAIL_TO="[email protected]"
if command -v mail > /dev/null 2>&1; then
mail -s "Daily Health Report for $HOSTNAME" "$MAIL_TO" < "$LOGFILE"
fi
|
Сохраните и закройте файл.
Основные функции сценария#
Вот ключевые проверки состояния системы, которые мы включим в сценарий:
- Использование диска – для того чтобы поймать низкое пространство перед тем, как это вызовет проблемы.
- Нагрузка на CPU – для выявления необычно высокой нагрузки на сервер.
- Использование памяти – для выявления давления на память или утечек.
- Ошибка службы – чтобы узнать, перестала ли работать какая-либо служба systemd или завершилась без уведомления.
- Топ 5 процессов, потребляющих память и ЦП – для поиска жадных приложений.
- Время работы системы – для отслеживания неожиданных перезагрузок.
- Доступные обновления пакетов (необязательно) – помогает поддерживать вашу систему в безопасности и актуальности.
Как использовать#
Сделайте сценарий исполняемым:
1
| $ sudo chmod +x /usr/local/bin/system-health.sh
|
Чтобы инициировать:
1
| $ sudo /usr/local/bin/system-health.sh
|
Вы должны увидеть хорошо структурированный отчет с подробностями о использовании диска, загрузке ЦП, статистикой памяти, сбойными сервисами и многим другим.
1
| cat /var/log/system-health-$(date +%F).log
|
Если всё выглядит хорошо, вы готовы автоматизировать это с помощью Cron.
Автоматизация с помощью Cron#
Расписания cron
хранятся в файле с именем crontab. Типичная запись crontab начинается с пяти значений (или звездочек), за которыми следует команда. Значения сообщают cron
, когда выполнять команду, а звездочка означает «все».
1
2
3
4
5
6
7
8
| * * * * * команда, которая должна быть выполнена
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (воскресенье = 0 или 7)
| | | ------- Месяц (1 - 12)
| | --------- День месяца (1 - 31)
| ----------- Час (0 - 23)
-------------- Минута (0 - 59)
|
Чтобы отредактировать crontab, выполните:
И добавьте строку:
1
| 0 3 * * * /usr/local/bin/system-health.sh >> /var/log/system-health-cron.log 2>&1
|
Это запланирует cron
для запуска команды в 3:00, каждый день любого месяца.
Убедитесь, что сценарий имеет исполняемые разрешения.
Здесь мы также перенаправляем вывод в лог-файл, чтобы отслеживать успешные и неуспешные запуски.
Настройка почты#
Если вы хотите получить отчет по электронной почте, убедитесь, что ваш сервер может отправлять почту – на большинстве систем достаточно просто установить mailutils.
1
2
| $ sudo apt install mailutils -y [On Debian/Ubuntu]
$ sudo dnf install mailx -y [On CentOS/RHEL]
|
Вам также может понадобиться настроить Postfix или SSMTP для корректной пересылки электронной почты, особенно если вы находитесь на облачной виртуальной машине.
Отображение состояния системы в MOTD (Сообщение дня)#
Краткая версия этой проверки состояния здоровья в виде MOTD при входе на ваш сервер, что является умным способом мгновенно увидеть статус здоровья системы, не используя никаких команд.
Создайте новый легкий MOTD скрипт с именем 99-system-health
в вашем каталоге /etc/update-motd.d/
.
1
| $ sudo nano /etc/update-motd.d/99-system-health
|
Вставьте следующие строки кода:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #!/bin/bash
# =====================================================================
# Lightweight System Health MOTD
# =====================================================================
# Описание: Краткая версия этой проверки состояния здоровья в виде MOTD.
# Скрипт: ./99-system-health [config_file]
# =====================================================================
echo "==== 🩺 System Health: $(hostname) ===="
echo "🕒 Uptime: $(uptime -p)"
echo "💽 Disk: $(df -h / | awk 'NR==2 {print $5 " used on " $6}')"
echo "📊 CPU Load: $(uptime | awk -F'load average:' '{print $2}' | sed 's/^ //')"
echo "🧠 Memory: $(free -m | awk '/Mem:/ {print $3 "MB used / " $2 "MB total"}')"
FAILED=$(systemctl --failed --no-legend | wc -l)
echo "🚨 Failed Services: $FAILED"
echo "====================================="
|
Сохраните и закройте файл.
Сделайте сценарий исполняемым:
1
| $ sudo chmod +x /etc/update-motd.d/99-system-health
|
Этот метод работает на Ubuntu и системах на базе Debian, где динамический MOTD включен по умолчанию. Для других дистрибутивов вы можете включить этот скрипт в .bashrc
или .bash_profile
.
Теперь каждый раз, когда вы будете подключаться к своему серверу по SSH, вы получите быстрый обзор состояния вашей системы – никаких дополнительных шагов не требуется!
1
2
3
4
5
6
7
| ==== 🩺 System Health: server01 ====
🕒 Uptime: up 17 days, 4 hours
💽 Disk: 81% used on /
📊 CPU Load: 0.23, 0.12, 0.31
🧠 Memory: 842MB used / 1987MB total
🚨 Failed Services: 0
=====================================
|
Завершение#
Эти скрипты могут показаться простыми на первый взгляд, но они выполняют критически важные задачи, которые поддерживают стабильность, безопасность и бесперебойную работу серверов.
Вы также можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья, или просто оставить комментарий ниже. Спасибо.