LINUX.ORG.RU

История изменений

Исправление rtxtxtrx, (текущая версия) :

тебе тогда нужно среднее арифметическое считать и максимумы с минимумами. Какой смысл в знании того сколько твоя говнопрога жрала 5 минут назад:

#!/bin/bash

# 1. Узнать PID по частичному имени с помощью pgrep
process_name="your_process_name"
pid=$(pgrep -f "$process_name")

if [ -z "$pid" ]; then
  echo "Process not found."
  exit 1
fi

# Массивы для хранения значений CPU и памяти
cpu_usage_array=()
mem_usage_array=()

# 2. Проверять, жив ли процесс, и выходить, если он умер
while kill -0 "$pid" 2>/dev/null; do
  # 3. Проверять, сколько процесс потребляет ресурсов
  cpu_usage=$(ps -p "$pid" -o %cpu=)
  mem_usage=$(ps -p "$pid" -o %mem=)
  echo "CPU Usage: $cpu_usage%, Memory Usage: $mem_usage%" >&2

  # Добавляем значения в массивы
  cpu_usage_array+=("$cpu_usage")
  mem_usage_array+=("$mem_usage")

  # Пауза перед следующей проверкой
  sleep 0.2
done

# 4. Записывать последний результат и время выполнения после выхода из цикла
end_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "Process $pid has terminated at $end_time."

# Функция для вычисления минимума, среднего и максимума
calculate_stats() {
  local array=("$@")
  local min=${array[0]}
  local max=${array[0]}
  local sum=0
  local count=${#array[@]}

  for value in "${array[@]}"; do
    if (( $(echo "$value < $min" | bc -l) )); then
      min=$value
    fi
    if (( $(echo "$value > $max" | bc -l) )); then
      max=$value
    fi
    sum=$(echo "$sum + $value" | bc -l)
  done

  local avg=$(echo "scale=2; $sum / $count" | bc -l)
  echo "$min $avg $max"
}

# Вычисляем статистику для CPU и памяти
cpu_stats=($(calculate_stats "${cpu_usage_array[@]}"))
mem_stats=($(calculate_stats "${mem_usage_array[@]}"))

# Выводим результаты
echo "CPU Usage: Min: ${cpu_stats[0]}%, Avg: ${cpu_stats[1]}%, Max: ${cpu_stats[2]}%"
echo "Memory Usage: Min: ${mem_stats[0]}%, Avg: ${mem_stats[1]}%, Max: ${mem_stats[2]}%"

Код я не проверял и не буду. Сам перепишешь

Исходная версия rtxtxtrx, :

тебе тогда нужно среднее арифметическое считать и максимумы с минимумами. Какой смысл в знании того сколько твоя говнопрога жрала 5 минут назад:

#!/bin/bash

# 1. Узнать PID по частичному имени с помощью pgrep
process_name="your_process_name"
pid=$(pgrep -f "$process_name")

if [ -z "$pid" ]; then
  echo "Process not found."
  exit 1
fi

# Массивы для хранения значений CPU и памяти
cpu_usage_array=()
mem_usage_array=()

# 2. Проверять, жив ли процесс, и выходить, если он умер
while kill -0 "$pid" 2>/dev/null; do
  # 3. Проверять, сколько процесс потребляет ресурсов
  cpu_usage=$(ps -p "$pid" -o %cpu=)
  mem_usage=$(ps -p "$pid" -o %mem=)
  echo "CPU Usage: $cpu_usage%, Memory Usage: $mem_usage%" >&2

  # Добавляем значения в массивы
  cpu_usage_array+=("$cpu_usage")
  mem_usage_array+=("$mem_usage")

  # Пауза перед следующей проверкой
  sleep 0.2
done

# 4. Записывать последний результат и время выполнения после выхода из цикла
end_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "Process $pid has terminated at $end_time."

# Функция для вычисления минимума, среднего и максимума
calculate_stats() {
  local array=("$@")
  local min=${array[0]}
  local max=${array[0]}
  local sum=0
  local count=${#array[@]}

  for value in "${array[@]}"; do
    if (( $(echo "$value < $min" | bc -l) )); then
      min=$value
    fi
    if (( $(echo "$value > $max" | bc -l) )); then
      max=$value
    fi
    sum=$(echo "$sum + $value" | bc -l)
  done

  local avg=$(echo "scale=2; $sum / $count" | bc -l)
  echo "$min $avg $max"
}

# Вычисляем статистику для CPU и памяти
cpu_stats=($(calculate_stats "${cpu_usage_array[@]}"))
mem_stats=($(calculate_stats "${mem_usage_array[@]}"))

# Выводим результаты
echo "CPU Usage: Min: ${cpu_stats[0]}%, Avg: ${cpu_stats[1]}%, Max: ${cpu_stats[2]}%"
echo "Memory Usage: Min: ${mem_stats[0]}%, Avg: ${mem_stats[1]}%, Max: ${mem_stats[2]}%"