Загрузка данных


#!/usr/bin/env bash
# collect-info.sh — сбор диагностики для технической поддержки

set -uo pipefail

OUT="sysinfo-$(hostname)-$(date +%F-%H%M).txt"
: >"$OUT"

say() { printf '%s\n' "$*" >&2; }

run() {
    local title=$1 tmo=$2 cmd=$3 rc
    printf '\n===== %s =====\n' "$title" >>"$OUT"

    if ! command -v "${cmd%% *}" >/dev/null 2>&1; then
        printf '(команда %s недоступна)\n' "${cmd%% *}" >>"$OUT"
        return 0
    fi

    timeout "$tmo" bash -c "$cmd" >>"$OUT" 2>&1
    rc=$?
    if [ "$rc" -eq 124 ]; then
        printf '(команда не уложилась в %s с — таймаут)\n' "$tmo" >>"$OUT"
    elif [ "$rc" -ne 0 ]; then
        printf '(команда завершилась с кодом %s)\n' "$rc" >>"$OUT"
    fi
    return 0
}

main() {
    say "Собираю общие сведения..."
    run "Система"           5 'uname -a'
    run "Аптайм"            5 'uptime'
    run "ОС (os-release)"   5 'cat /etc/os-release'
    run "Процессор (lscpu)" 5 'lscpu'

    say "Снимаю замеры нагрузки..."
    run "Нагрузка за 5 секунд" 10 'vmstat 1 5'
    run "Топ-10 по CPU"    5 'ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | head -11'
    run "Топ-10 по памяти" 5 'ps -eo pid,user,%mem,%cpu,comm --sort=-%mem | head -11'

    say "Собираю сведения о дисках..."
    run "Свободное место (df -h)" 5 'df -h'
    run "Inode (df -i)"           5 'df -i'

    printf '%s\n' "$PWD/$OUT"
}

main "$@"