探测脚本

探测端口脚本

#!/bin/bash
# 循环使用curl检测xxx服务端口连通性,不通/超时触发日志输出

# 配置参数
TARGET_HOST="192.172.1.2"        # 目标主机
TARGET_PORT="9100"               # 目标端口
NC_TIMEOUT="5"                   # curl超时时间(秒)
LOOP_INTERVAL="2"                # 循环检测间隔(秒)
LOG_DIR="/tmp/connect_log"  # 日志保存目录
LOG_FILE="${LOG_DIR}/nova_connect_$(date +'%Y%m%d').log"  # 按日期生成日志文件

# 创建日志目录(不存在则创建)
mkdir -p "$LOG_DIR"

# 脚本启动信息
echo "=== 脚本启动:$(date +'%Y-%m-%d %H:%M:%S') ===" | tee -a "$LOG_FILE"
echo "目标检测:${TARGET_HOST}:${TARGET_PORT}" | tee -a "$LOG_FILE"
echo "NC超时时间:${NC_TIMEOUT}s" | tee -a "$LOG_FILE"
echo "循环间隔:${LOOP_INTERVAL}s" | tee -a "$LOG_FILE"
echo "日志保存路径:$LOG_FILE" | tee -a "$LOG_FILE"
echo "==========================================" | tee -a "$LOG_FILE"

# 无限循环检测
while true; do
    # 记录当前时间(含毫秒)
    CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
    CURRENT_TIME_MS=$(date +'%Y-%m-%d %H:%M:%S,%3N')  # 带毫秒的时间格式(匹配原报错格式)
    
    # 执行nc检测:-z 只检测端口连通性,-v 详细输出,-w 指定超时时间
    #nc -zv -w "$NC_TIMEOUT" "$TARGET_HOST" "$TARGET_PORT" > /dev/null 2>&1
    curl "${TARGET_HOST}:${TARGET_PORT}" > /dev/null 2>&1
    NC_EXIT_CODE=$?  # 捕获nc退出码(0=连通,非0=不通/超时)

    # 判断检测结果
    if [ $NC_EXIT_CODE -ne 0 ]; then
        # 不通/超时:输出详细错误日志(模拟原报错格式)
        ERROR_LOG="${CURRENT_TIME_MS} - ERROR: TIMEOUT/UNREACHABLE (超过${NC_TIMEOUT}秒) | Target: ${TARGET_HOST}:${TARGET_PORT} | Timeout setting: ${NC_TIMEOUT}s | Error detail: TCPConnectionPool(host='${TARGET_HOST}', port=${TARGET_PORT}): Max retries exceeded (Caused by ConnectTimeoutError/ConnectionRefusedError: 'Connection to ${TARGET_HOST}:${TARGET_PORT} timed out or unreachable.')"
        echo "$ERROR_LOG" | tee -a "$LOG_FILE"
    else
        # 连通:输出普通INFO日志(可按需关闭)
        INFO_LOG="${CURRENT_TIME} - INFO: service ${TARGET_HOST}:${TARGET_PORT} 连通正常"
        echo "$INFO_LOG" | tee -a "$LOG_FILE"
    fi

    # 间隔指定时间后继续循环
    sleep "$LOOP_INTERVAL"
done

抓包脚本

#!/bin/bash
while true; do
  ts=$(date +%Y%m%d_%H%M%S)
  timeout 10 tcpdump -i any port 9100 -w "/tmp/9100_${ts}.pcap" > /dev/null 2>&1
  sleep 2
done

系统检查脚本

#!/bin/bash

# 系统检查脚本
# 检查系统内核、CPU、内存、负载和进程数
# 使用方法: ./system_checker.sh [log_file]
# 如果指定了日志文件,输出将同时写入日志文件

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 日志相关变量
LOG_FILE=""
LOG_ENABLED=false

# 日志函数
log_init() {
    if [ $# -eq 1 ]; then
        LOG_FILE="$1"
        LOG_ENABLED=true
        # 创建日志文件并添加头部
        echo "=== 系统检查日志 ===" > "$LOG_FILE"
        echo "检查时间: $(date)" >> "$LOG_FILE"
        echo "================================" >> "$LOG_FILE"
        echo "" >> "$LOG_FILE"
    fi
}

# 输出函数 - 同时支持终端输出和日志记录
log_output() {
    local message="$1"
    local color="$2"
    
    # 终端输出
    if [ -n "$color" ] && [ "$color" != "NO_COLOR" ]; then
        echo -e "${color}${message}${NC}"
    else
        echo -e "$message"
    fi
    
    # 日志记录(去除颜色代码)
    if [ "$LOG_ENABLED" = true ]; then
        local clean_message=$(echo "$message" | sed 's/\x1b\[[0-9;]*m//g')
        echo "$clean_message" >> "$LOG_FILE"
    fi
}

# 检查内核版本  
check_kernel() {
    log_output "=== 系统内核信息 ===" "$BLUE"
    log_output "内核版本: $(uname -r)" "$GREEN"
    log_output "系统名称: $(uname -s)" "$GREEN"
    log_output "主机名: $(hostname)" "$GREEN"
    log_output "架构: $(uname -m)" "$GREEN"
    log_output "" "NO_COLOR"
}

# 检查CPU信息
check_cpu() {
    log_output "=== CPU信息 ===" "$BLUE"
    
    # CPU型号
    if [ -f /proc/cpuinfo ]; then
        CPU_MODEL=$(grep "model name" /proc/cpuinfo | head -1 | cut -d':' -f2 | sed 's/^ *//')
        CPU_CORES=$(grep "cpu cores" /proc/cpuinfo | head -1 | awk '{print $4}')
        CPU_THREADS=$(grep "siblings" /proc/cpuinfo | head -1 | awk '{print $3}')
        log_output "CPU型号: $CPU_MODEL" "$GREEN"
        log_output "物理核心数: $CPU_CORES" "$GREEN"
        log_output "逻辑线程数: $CPU_THREADS" "$GREEN"
    fi
    
    # CPU使用率
    if command -v top >/dev/null 2>&1; then
        CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
        log_output "当前CPU使用率: ${CPU_USAGE}%" "$GREEN"
    fi
    
    log_output "" "NO_COLOR"
}

# 检查内存信息
check_memory() {
    log_output "=== 内存信息 ===" "$BLUE"
    
    if [ -f /proc/meminfo ]; then
        TOTAL_MEM=$(grep "MemTotal" /proc/meminfo | awk '{print $2}')
        FREE_MEM=$(grep "MemFree" /proc/meminfo | awk '{print $2}')
        AVAILABLE_MEM=$(grep "MemAvailable" /proc/meminfo | awk '{print $2}')
        
        # 转换单位
        TOTAL_GB=$(echo "scale=2; $TOTAL_MEM/1024/1024" | bc -l)
        FREE_GB=$(echo "scale=2; $FREE_MEM/1024/1024" | bc -l)
        AVAILABLE_GB=$(echo "scale=2; $AVAILABLE_MEM/1024/1024" | bc -l)
        USED_GB=$(echo "scale=2; $TOTAL_GB-$FREE_GB" | bc -l)
        
        # 计算使用率
        if [ $TOTAL_MEM -gt 0 ]; then
            MEM_USAGE_PERCENT=$(echo "scale=1; ($TOTAL_MEM-$AVAILABLE_MEM)*100/$TOTAL_MEM" | bc -l)
        else
            MEM_USAGE_PERCENT="0.0"
        fi
        
        log_output "总内存: ${TOTAL_GB} GB" "$GREEN"
        log_output "已使用: ${USED_GB} GB (${MEM_USAGE_PERCENT}%)" "$GREEN"
        log_output "可用内存: ${AVAILABLE_GB} GB" "$GREEN"
    fi
    
    log_output "" "NO_COLOR"
}

# 检查系统负载
check_load() {
    log_output "=== 系统负载 ===" "$BLUE"
    
    if [ -f /proc/loadavg ]; then
        LOAD_AVG=$(cat /proc/loadavg)
        log_output "负载平均值: $LOAD_AVG" "$GREEN"
        
        # 解释负载
        CORES=$(nproc 2>/dev/null || echo "1")
        ONE_MIN_LOAD=$(echo $LOAD_AVG | awk '{print $1}')
        
        # 简单判断负载状态
        if (( $(echo "$ONE_MIN_LOAD < $CORES" | bc -l) )); then
            log_output "负载状态: 正常" "$GREEN"
        elif (( $(echo "$ONE_MIN_LOAD < $CORES*2" | bc -l) )); then
            log_output "负载状态: 轻度繁忙" "$YELLOW"
        else
            log_output "负载状态: 高负载" "$RED"
        fi
    fi
    
    log_output "" "NO_COLOR"
}

# 检查进程数
check_processes() {
    log_output "=== 进程信息 ===" "$BLUE"
    
    if command -v ps >/dev/null 2>&1; then
        TOTAL_PROCS=$(ps aux | wc -l)
        # 减去标题行
        TOTAL_PROCS=$((TOTAL_PROCS - 1))
        
        # 获取运行中的进程数
        RUNNING_PROCS=$(ps aux | grep -c " R " || echo "0")
        SLEEPING_PROCS=$(ps aux | grep -c " S " || echo "0")
        
        log_output "总进程数: $TOTAL_PROCS" "$GREEN"
        log_output "运行中进程: $RUNNING_PROCS" "$GREEN"
        log_output "睡眠中进程: $SLEEPING_PROCS" "$GREEN"
    fi
    
    # 获取系统最大PID
    if [ -f /proc/sys/kernel/pid_max ]; then
        MAX_PID=$(cat /proc/sys/kernel/pid_max)
        log_output "系统最大PID: $MAX_PID" "$GREEN"
    fi
    
    log_output "" "NO_COLOR"
}

# 主函数
main() {
    log_output "系统检查报告" "$BLUE"
    log_output "================" "$BLUE"
    log_output "检查时间: $(date)" "$GREEN"
    log_output "" "NO_COLOR"
    
    check_kernel
    check_cpu
    check_memory
    check_load
    check_processes
    
    log_output "系统检查完成" "$BLUE"
    log_output "================" "$BLUE"
    
    # 日志完成提示
    if [ "$LOG_ENABLED" = true ]; then
        log_output "日志已保存到: $LOG_FILE" "$GREEN"
    fi
}

# 确保脚本具有可执行权限
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    # 初始化日志
    log_init "$@"
    
    main
fi
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容