Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran
Kumpulkan metrik beban, memori dan cakera serta cetuskan amaran berasaskan ambang daripada skrip berjadual
Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran ialah pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Penguasaan Baris Perintah Linux & Penskripan Bash, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Penguasaan Baris Perintah Linux & Penskripan Bash merangkumi sejumlah 4 pelajaran.
Mengapa Pemeriksaan Kesihatan Sistem Penting
Pelayan produksi boleh merosot secara senyap. Lonjakan CPU, kebocoran memori dan cakera penuh menyebabkan gangguan — tetapi hanya jika tiada siapa menyedarinya tepat pada masanya. Skrip pemeriksaan kesihatan sistem mengautomatikkan kitaran pemantauan: mengumpulkan metrik, membandingkannya dengan ambang dan mencetuskan amaran sebelum pengguna merasai kesannya.
- Dijadualkan melalui
cron, skrip ini berjalan setiap beberapa minit tanpa perhatian manusia - Skrip ini menghasilkan output bertanda masa yang konsisten dan sesuai untuk pengagregatan log
- Logik berasaskan ambang memastikan amaran kekal bermakna — bukan setiap gangguan kecil menghantar halaman kepada pasukan bertugas
Dalam pelajaran ini, anda akan membina skrip pemeriksaan kesihatan bertaraf produksi dari awal, lapisan demi lapisan, meliputi purata beban, tekanan memori dan penggunaan cakera.
Mendapatkan Purata Beban
Linux mendedahkan purata beban 1 minit, 5 minit dan 15 minit melalui /proc/loadavg dan perintah uptime. Untuk penskripan, /proc/loadavg ialah sumber yang paling bersih — tiada isu setempat dan tiada variasi penghuraian merentas distro.
Coretan di bawah membaca purata beban 1 minit dan menyimpannya dalam pemboleh ubah untuk perbandingan ambang. cut mengekstrak medan pertama; awk membuang perpuluhan untuk perbandingan integer menggunakan bc bagi pengiraan nombor nyata.
#!/usr/bin/env bash
# Read 1-minute load average from /proc/loadavg
LOAD_RAW=$(cut -d' ' -f1 /proc/loadavg)
echo "Raw load average: $LOAD_RAW"
# Number of CPU cores — used to normalise load
CPU_CORES=$(nproc)
echo "CPU cores: $CPU_CORES"
# Compute load percentage (load / cores * 100) using bc
LOAD_PCT=$(echo "scale=2; $LOAD_RAW / $CPU_CORES * 100" | bc)
echo "Load %: $LOAD_PCT"Perbandingan Ambang dengan Nilai Nombor Nyata
Bash tidak boleh membandingkan nombor titik terapung secara asli — [ 1.5 -gt 1.2 ] menghasilkan ralat. Dua penyelesaian lazim ialah:
bc— mengeluarkan1(benar) atau0(palsu) daripada ungkapan perbandinganawk— boleh menilai syarat nombor nyata dalam pipeline
Menggunakan bc menjadikan logik mudah dibaca dan mudah diuji. Corak $(echo "$A > $B" | bc) mengembalikan 1 apabila syarat dipenuhi, yang anda uji dengan [ ... -eq 1 ].
#!/usr/bin/env bash
LOAD_RAW=$(cut -d' ' -f1 /proc/loadavg)
CPU_CORES=$(nproc)
THRESHOLD=80 # alert when load % exceeds 80%
LOAD_PCT=$(echo "scale=2; $LOAD_RAW / $CPU_CORES * 100" | bc)
# bc returns 1 if the expression is true
if [ "$(echo "$LOAD_PCT > $THRESHOLD" | bc)" -eq 1 ]; then
echo "ALERT: Load is ${LOAD_PCT}% (threshold ${THRESHOLD}%)"
else
echo "OK: Load is ${LOAD_PCT}%"
fiMengumpulkan Metrik Memori
/proc/meminfo ialah sumber berautoriti untuk statistik memori pada Linux. Medan utama:
MemTotal— jumlah RAM fizikal dalam kBMemAvailable— anggaran kB yang tersedia untuk peruntukan baharu tanpa pertukaran (lebih baik daripadaMemFree)
awk dengan padanan corak ialah cara paling bersih untuk mengekstrak nilai ini. Membahagikan MemAvailable dengan MemTotal dan menolaknya daripada 100 memberikan peratusan memori yang digunakan, yang mengawal ambang amaran anda.
#!/usr/bin/env bash
# Extract memory figures from /proc/meminfo (values in kB)
MEM_TOTAL=$(awk '/^MemTotal:/ {print $2}' /proc/meminfo)
MEM_AVAIL=$(awk '/^MemAvailable:/ {print $2}' /proc/meminfo)
# Used memory percentage
MEM_USED_PCT=$(echo "scale=2; (1 - $MEM_AVAIL / $MEM_TOTAL) * 100" | bc)
echo "Total RAM : ${MEM_TOTAL} kB"
echo "Available : ${MEM_AVAIL} kB"
echo "Used : ${MEM_USED_PCT}%"Mengumpulkan Metrik Penggunaan Cakera
Perintah df melaporkan penggunaan sistem fail. Untuk penskripan, dua bendera penting ialah:
-h— saiz yang mudah dibaca manusia (untuk paparan sahaja; elakkan dalam aritmetik)--output=pcent,target— lajur yang boleh dihuraikan mesin (utiliti teras GNU)
Mengulangi semua sistem fail yang dilekapkan membolehkan skrip menandakan mana-mana partition yang hampir penuh, bukan hanya /. Tanda % dibuang dengan tr -d '%' sebelum perbandingan integer.
#!/usr/bin/env bash
DISK_THRESHOLD=85
# Skip header line with tail -n +2
# --output=pcent,target gives "85% /var" style lines
df --output=pcent,target | tail -n +2 | while read -r USED_PCT MOUNT; do
# Remove the % sign for arithmetic
USED_INT=${USED_PCT//%/}
if [ "$USED_INT" -ge "$DISK_THRESHOLD" ]; then
echo "ALERT: Disk $MOUNT is ${USED_PCT} full"
else
echo "OK : Disk $MOUNT is ${USED_PCT} full"
fi
doneOutput Amaran Berstruktur dengan Cap Masa
Mesej amaran tanpa cap masa hampir tidak berguna dalam fail log atau laporan e-mel. Awalan yang konsisten menjadikan penghuraian log mudah dengan grep atau ejen penghantaran log.
Takrifkan satu fungsi amaran ringkas di bahagian atas skrip anda. Fungsi ini menambah cap masa ISO-8601, tahap keterukan dan nama pemeriksaan pada permulaan mesej. Semua amaran ditulis ke kedua-dua stdout dan fail log melalui tee.
date -u +"%Y-%m-%dT%H:%M:%SZ"— cap masa UTC yang tidak bergantung pada setempat- Menulis ke
stderruntuk ALERT dan kestdoutuntuk OK mengasingkan isyarat daripada hingar dalam pipeline
#!/usr/bin/env bash
LOG_FILE="/var/log/healthcheck.log"
alert() {
local LEVEL="$1" # OK | WARN | ALERT
local CHECK="$2"
local MSG="$3"
local TS
TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
local LINE="[$TS] [$LEVEL] [$CHECK] $MSG"
if [ "$LEVEL" = "ALERT" ]; then
echo "$LINE" | tee -a "$LOG_FILE" >&2
else
echo "$LINE" | tee -a "$LOG_FILE"
fi
}
# Usage examples
alert "OK" "DISK" "/ is 42% full"
alert "ALERT" "DISK" "/var is 91% full"Menghantar Amaran E-mel dengan mail dan sendmail
Mekanisme amaran paling mudah pada pelayan ialah e-mel melalui MTA tempatan (postfix, sendmail atau msmtp). Perintah mail (daripada mailutils atau bsd-mailx) menggubah dan menghantar mesej dalam satu baris.
-s— baris subjek- Salurkan isi mesej melalui
stdin - Pada pelayan tanpa MTA tempatan, gantikan
maildengan panggilancurlkepada API e-mel transaksi
Lindungi penghantaran dengan kunci deduplikasi supaya satu keadaan yang bising tidak membanjiri peti masuk.
#!/usr/bin/env bash
ALERT_EMAIL="ops@example.com"
LOCK_DIR="/tmp/healthcheck_locks"
mkdir -p "$LOCK_DIR"
send_alert() {
local CHECK="$1"
local MSG="$2"
local LOCK="$LOCK_DIR/${CHECK}.lock"
# Only send if no lock exists (prevents repeated emails within the hour)
if [ ! -f "$LOCK" ]; then
echo "$MSG" | mail -s "[ALERT] $CHECK on $(hostname)" "$ALERT_EMAIL"
touch "$LOCK"
# Lock expires after 1 hour via cron or find+delete
echo "Alert sent for $CHECK"
else
echo "Alert suppressed for $CHECK (lock active)"
fi
}
send_alert "HIGH_LOAD" "Load average exceeded 80% on $(hostname) at $(date)"Menggabungkan Skrip Pemeriksaan Kesihatan Lengkap
Gabungkan ketiga-tiga pemeriksaan — beban, memori dan cakera — ke dalam satu skrip yang tersusun dengan ambang yang boleh dikonfigurasikan di bahagian atas. Inilah corak yang digunakan dalam automasi pentadbir sistem pada persekitaran produksi:
- Pemalar diisytiharkan di bahagian atas supaya mudah dilaraskan tanpa mengubah logik
- Setiap pemeriksaan diasingkan dalam fungsi supaya mudah dibaca dan diuji secara unit
- Fungsi
mainmenyelaras semua panggilan - Kod keluar
1jika sebarang amaran dicetuskan, dan0sebaliknya — ini menjadikan skrip boleh digabungkan dengan rangka kerja pemantauan seperti Nagios/Icinga
#!/usr/bin/env bash
set -euo pipefail
# ── Thresholds ───────────────────────────────────────────
LOAD_THRESHOLD=80 # percent of CPU capacity
MEM_THRESHOLD=90 # percent used
DISK_THRESHOLD=85 # percent used
ALERT_EMAIL="ops@example.com"
LOG_FILE="/var/log/healthcheck.log"
ALERT_FIRED=0
# ── Helpers ──────────────────────────────────────────────
ts() { date -u +"%Y-%m-%dT%H:%M:%SZ"; }
log() { echo "[$(ts)] $*" | tee -a "$LOG_FILE"; }
alert() { log "ALERT: $*"; echo "$*" | mail -s "[ALERT] $(hostname)" "$ALERT_EMAIL" 2>/dev/null; ALERT_FIRED=1; }
# ── Checks ───────────────────────────────────────────────
check_load() {
local raw cores pct
raw=$(cut -d' ' -f1 /proc/loadavg)
cores=$(nproc)
pct=$(echo "scale=2; $raw / $cores * 100" | bc)
if [ "$(echo "$pct > $LOAD_THRESHOLD" | bc)" -eq 1 ]; then
alert "Load ${pct}% exceeds ${LOAD_THRESHOLD}%"
else
log "OK load=${pct}%"
fi
}
check_memory() {
local total avail pct
total=$(awk '/^MemTotal:/ {print $2}' /proc/meminfo)
avail=$(awk '/^MemAvailable:/{print $2}' /proc/meminfo)
pct=$(echo "scale=2; (1 - $avail / $total) * 100" | bc)
if [ "$(echo "$pct > $MEM_THRESHOLD" | bc)" -eq 1 ]; then
alert "Memory ${pct}% used (threshold ${MEM_THRESHOLD}%)"
else
log "OK memory=${pct}%"
fi
}
check_disk() {
df --output=pcent,target | tail -n +2 | while read -r used mnt; do
local pct_int=${used//%/}
if [ "$pct_int" -ge "$DISK_THRESHOLD" ]; then
alert "Disk $mnt at ${used}"
else
log "OK disk $mnt=${used}"
fi
done
}
main() {
log "=== Health check START ==="
check_load
check_memory
check_disk
log "=== Health check END (alerts=$ALERT_FIRED) ==="
exit "$ALERT_FIRED"
}
mainMenjadualkan dengan Cron
Skrip pemeriksaan kesihatan hanya memberikan manfaat apabila dijalankan secara automatik. cron ialah penjadual Unix standard. Edit crontab seluruh sistem atau fail khusus dalam /etc/cron.d/ untuk menjadualkan skrip anda.
- Jalankan setiap 5 minit:
*/5 * * * * - Sentiasa gunakan laluan mutlak dalam cron —
$PATHadalah minimum dalam persekitaran cron - Halakan output untuk mengelakkan cron menghantar e-mel pada setiap kali dijalankan:
>> /var/log/healthcheck.log 2>&1 - Gunakan
MAILTO=""di bahagian atas crontab untuk menyenyapkan e-mel cron sendiri
# /etc/cron.d/healthcheck
# Run the health check every 5 minutes as root
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/5 * * * * root /usr/local/sbin/healthcheck.sh >> /var/log/healthcheck.log 2>&1Mencegah Banjiran Amaran dengan Kunci Tempoh Bertenang
Apabila ambang dilampaui secara berterusan, skrip naif akan mencetuskan amaran setiap 5 minit — berpuluh-puluh e-mel dihantar sebelum jurutera sempat bertindak balas. Kunci tempoh bertenang menyekat amaran berulang untuk tempoh yang boleh dikonfigurasikan.
Coraknya: tulis fail kunci apabila amaran pertama dicetuskan; langkau amaran berikutnya selagi fail itu lebih baharu daripada tempoh bertenang; find dengan -mmin menyemak usia fail secara atomik tanpa pengiraan tarikh.
#!/usr/bin/env bash
LOCK_DIR="/tmp/hc_locks"
COOLDOWN_MIN=60 # suppress repeat alerts for 60 minutes
mkdir -p "$LOCK_DIR"
should_alert() {
local check="$1"
local lock="$LOCK_DIR/${check}.lock"
if [ ! -f "$lock" ]; then
# No lock — allow alert and create lock
touch "$lock"
return 0 # true: send alert
fi
# Lock exists — check if it is older than the cooldown
# find returns the filename only if it's OLDER than COOLDOWN_MIN
local expired
expired=$(find "$lock" -mmin +"$COOLDOWN_MIN" 2>/dev/null)
if [ -n "$expired" ]; then
touch "$lock" # refresh lock timestamp
return 0 # cooldown expired — allow alert
fi
return 1 # still within cooldown — suppress
}
# Usage
if should_alert "HIGH_LOAD"; then
echo "Sending load alert..."
# mail -s "..." ops@example.com <<< "Load too high"
else
echo "Load alert suppressed (cooldown active)"
fiMenguji dan Mengesahkan Skrip Pemeriksaan Kesihatan Anda
Sebelum digunakan, sahkan skrip dengan tiga cara:
- Semakan sintaks:
bash -n healthcheck.shmengesan ralat penghuraian tanpa melaksanakan skrip - Mod jejak:
bash -x healthcheck.shmencetak setiap arahan semasa dilaksanakan — amat berguna untuk penyahpepijatan - Penggantian ambang: turunkan ambang buat sementara waktu hingga hampir sifar supaya skrip mencetuskan amaran pada hos yang sihat, sekali gus mengesahkan laluan amaran berfungsi dari hujung ke hujung
Untuk laluan e-mel, halakan mail ke fail log semasa ujian menggunakan bendera MOCK_MAIL:
#!/usr/bin/env bash
# Smoke-test the alert path without sending real email
MOCK_MAIL=true
ALERT_EMAIL="ops@example.com"
send_mail() {
local subject="$1"
local body="$2"
if [ "$MOCK_MAIL" = true ]; then
echo "[MOCK MAIL] To: $ALERT_EMAIL | Subject: $subject"
echo "[MOCK MAIL] Body: $body"
else
echo "$body" | mail -s "$subject" "$ALERT_EMAIL"
fi
}
# Override threshold to guarantee an alert fires
LOAD_THRESHOLD=0 # Any load will exceed 0%
LOAD_RAW=$(cut -d' ' -f1 /proc/loadavg)
CPU_CORES=$(nproc)
PCT=$(echo "scale=2; $LOAD_RAW / $CPU_CORES * 100" | bc)
if [ "$(echo "$PCT > $LOAD_THRESHOLD" | bc)" -eq 1 ]; then
send_mail "[ALERT] Load on $(hostname)" "Load is ${PCT}%"
fiSemakan Pengetahuan: Strategi Tempoh Bertenang
Pertimbangkan senario berikut: tugas cron pemeriksaan kesihatan anda berjalan setiap 5 minit. Penggunaan cakera pada /var melepasi 85% dan kekal begitu selama 3 jam. Anda mahu jurutera bertugas menerima amaran sekali sejam, bukannya setiap 5 minit. Strategi pelaksanaan manakah yang paling sesuai?
Ulang Kaji Pelajaran: Skrip Pemeriksaan Kesihatan Sistem
Dalam pelajaran ini, anda membina saluran paip pemeriksaan kesihatan dan pemberitahuan sistem yang lengkap serta sedia digunakan dalam produksi. Berikut ialah prinsip utama untuk diteruskan:
- Sumber kebenaran: Baca metrik daripada
/proc/loadavgdan/proc/meminfo— kedua-duanya stabil, tidak bergantung pada setempat bahasa dan tersedia pada setiap hos Linux - Aritmetik perpuluhan: Gunakan
bcuntuk perbandingan ambang titik apungan; perbandingan integer Bash (-gt) hanya berfungsi pada nombor bulat - Pengulangan cakera: Gunakan
df --output=pcent,targetuntuk memeriksa setiap sistem fail yang dipasang, bukan hanya/ - Pengelogan berstruktur: Awali setiap baris dengan cap masa UTC dan tahap keterukan supaya log mudah dicari dengan grep dan dapat dihantar dengan kemas ke sistem pengelogan berpusat
- Kunci tempoh bertenang: Fail kunci yang disemak dengan
find -mminmencegah banjiran amaran tanpa mengubah jadual cron - Keboleh gubahan: Keluar dengan kod
1apabila sebarang amaran dicetuskan supaya skrip berintegrasi dengan Nagios, Icinga atau rangka kerja pemantauan lain - Ujian: Gunakan
bash -nuntuk semakan sintaks,bash -xuntuk penyahpepijatan jejak dan benderaMOCK_MAILuntuk mengesahkan laluan amaran pada hos yang sihat
Jadualkan skrip yang telah siap melalui /etc/cron.d/ dan infrastruktur anda akan memantau dirinya secara berterusan, serta hanya memberi amaran apabila ambang dilampaui dengan ketara.
Pelajari Bash dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 22
- Pelajaran
- 88
Soalan Lazim
Adakah pelajaran “Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran” percuma?
Ya — teks penuh “Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Penguasaan Baris Perintah Linux & Penskripan Bash, tingkat taraf kepada CoddyKit PRO. Kursus Penguasaan Baris Perintah Linux & Penskripan Bash merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran”?
Kumpulkan metrik beban, memori dan cakera serta cetuskan amaran berasaskan ambang daripada skrip berjadual Anda berlatih Penguasaan Baris Perintah Linux & Penskripan Bash menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Penguasaan Baris Perintah Linux & Penskripan Bash?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Baris Perintah Linux & Penskripan Bash di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash ini?
Ya. Setiap pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengautomatikkan Penyediaan Pengguna dan Kumpulan
- Mengawal Perkhidmatan systemd dan Menulis Fail Unit
- Automasi Cakera, Sistem Fail dan Lekapan
- Membina Skrip Pemeriksaan Kesihatan Sistem dan Amaran