Bash / trap сигнал барих
trap сигнал барих
Script ажиллаж байхад хэрэглэгч Ctrl+C дарах, алдаа гарах, script дуусах зэрэг үйл явдал тохиолддог. trap команд нь эдгээр үйл явдлыг барьж, тодорхой код ажиллуулах боломж олгодог. Түр файлуудыг цэвэрлэх, лог бичих, алдааны мессеж харуулах зэрэгт маш хэрэгтэй.
trap гэж хэрхэн ажилладаг вэ?
bash
# trap [команд] [сигнал]
# Жишээ:
trap "echo 'Script зогслоо!'" EXIT
echo "Script ажиллаж байна..."
sleep 2
echo "Дуусав"
# Script дуусахад (хэрхэн ч дуусаагүй) "Script зогслоо!" хэвлэгдэнэ
Хамгийн түгээмэл сигналууд:
bash
# EXIT — script дурын шалтгаанаар дуусахад
# INT — Ctrl+C дарахад (SIGINT)
# TERM — kill командаар зогсоохад (SIGTERM)
# ERR — команд алдаатай гарахад (exit code != 0)
# HUP — terminal хаагдахад (SIGHUP)
Түр файлыг цэвэрлэх
trap-н хамгийн нийтлэг хэрэглээ бол script дуусахад түр файлуудыг арилгах:
bash
#!/bin/bash
# Түр файлын нэр
TEMP_FILE=$(mktemp /tmp/myapp.XXXXXX)
# Script дуусахад (амжилттай ч, алдаатай ч) цэвэрлэх
cleanup() {
echo "Цэвэрлэж байна..."
rm -f "$TEMP_FILE"
echo "Түр файл устгагдлаа: $TEMP_FILE"
}
trap cleanup EXIT
# Script-ийн үндсэн ажил
echo "Боловсруулж байна..." > "$TEMP_FILE"
cat "$TEMP_FILE"
# Энд алдаа гарсан ч cleanup ажиллана
echo "Ажил дууслаа"
mktemp нь давхардахгүй түр файлын нэр үүсгэдэг. XXXXXX нь санамсаргүй тэмдэгтүүдээр солигддог.
Ctrl+C-г барих (INT сигнал)
bash
#!/bin/bash
# Ctrl+C дарахад гарах мессеж
trap 'echo ""; echo "Ctrl+C дарагдлаа — гарч байна..."; exit 130' INT
echo "Ctrl+C дарахад зогсоно. Ажиллаж байна..."
count=0
while true; do
count=$((count + 1))
echo "Давталт: $count"
sleep 1
done
ERR — алдаа бүрт барих
bash
#!/bin/bash
# Алдаа гарах бүрт мөрийн дугаар харуулах
error_handler() {
local exit_code=$?
local line_number=$1
echo "──────────────────────────────" >&2
echo "АЛДАА: мөр $line_number, exit code: $exit_code" >&2
echo "──────────────────────────────" >&2
}
trap 'error_handler $LINENO' ERR
echo "Алхам 1: эхэллээ"
ls /байхгүй-зам # Энд алдаа гарна → handler ажиллана
echo "Алхам 2: хэзээ ч хүрэхгүй"
Олон сигналыг нэг дор барих
bash
#!/bin/bash
TEMP_DIR=$(mktemp -d /tmp/deploy.XXXXXX)
LOG_FILE="$TEMP_DIR/deploy.log"
# Нэг функцийг олон сигналд холбох
cleanup() {
local signal=$1
echo ""
echo "[$signal] Сигнал хүлээн авлаа — цэвэрлэж байна..."
rm -rf "$TEMP_DIR"
echo "Цэвэрлэгдлаа. Гарч байна."
exit 1
}
trap 'cleanup INT' INT
trap 'cleanup TERM' TERM
trap 'cleanup EXIT' EXIT
echo "Deploy эхэллээ. Log: $LOG_FILE"
echo "$(date): эхэллээ" >> "$LOG_FILE"
# Үндсэн ажлууд
echo "Файлуудыг хуулж байна..."
sleep 3
echo "$(date): дууслаа" >> "$LOG_FILE"
echo "Deploy амжилттай боллоо!"
Trap-г цуцлах
bash
# Тухайн сигналын trap-г арилгах
trap - EXIT
trap - INT
# Жишээ — зарим хэсгийн дараа trap хэрэггүй болвол
trap cleanup EXIT
# ... ажил хийгдлээ ...
# Амжилттай дуусвал cleanup хэрэггүй — trap-г арилгана
trap - EXIT
echo "Амжилттай!"
exit 0
trap нь script-ийг найдвартай, цэвэрхэн болгодог. Түр файл үүсгэх, нөөц ашиглах бүх script-д trap cleanup EXIT заавал нэмэх хэрэгтэй — энэ нь мэргэжлийн хөгжүүлэгчийн тэмдэг юм.
Дараагийн хичээлд:
Bash дахь тогтмол илэрхийлэл (regex) — =~ оператор ашиглан утгуудыг шалгах, pattern тааруулах, текст задлах арга.