Извлечение выходных данных датчиков в отсортированный массив - PullRequest
0 голосов
/ 03 октября 2018

этот вопрос является продолжением Извлечение команды датчиков Ubuntu с использованием сценариев

Поскольку вопрос был написан плохо, я переписываю вопрос в форме нового вопроса.

В основном я хочу извлечь информацию о температуре графических процессоров, используя команду датчиков и такие скрипты, как gawk и bash.

Пример вывода датчиков будет следующим:

amdgpu-pci-0c00
Adapter: PCI adapter
fan1:        1972 RPM
temp1:        +50.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

amdgpu-pci-0600
Adapter: PCI adapter
fan1:        1960 RPM
temp1:        +47.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

amdgpu-pci-0200
Adapter: PCI adapter
fan1:        1967 RPM
temp1:        +52.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

pch_skylake-virtual-0
Adapter: Virtual device
temp1:        +33.0°C

amdgpu-pci-0900
Adapter: PCI adapter
fan1:        1893 RPM
temp1:        +51.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

amdgpu-pci-0300
Adapter: PCI adapter
fan1:        1992 RPM
temp1:        +53.0°C  (crit =  +0.0°C, hyst =  +0.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +24.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:        +23.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:        +21.0°C  (high = +80.0°C, crit = +100.0°C)

Информация о температуре графического процессора помечена как amdgpu-pci- "BUS_ID", поэтому нам не нужны другие схемы надписей (skylake-Виртуальный, ни Coretemp-Иса).Необходимо выполнить следующие действия:

  1. Извлечение информации о температуре графического процессора, например, amdgpu-pci-0c00 имеет 50 градусов, и вставку в массив.
  2. Индекс массива долженначинаться с 0 и возрастать в порядке идентификатора шины.

Если использовать вышеуказанные данные, массив, предполагающий, что имя является именем, будет:

a[0] = 52 ;amdgpu-pci-0200
a[1] = 53 ;amdgpu-pci-0300
a[2] = 47 ;amdgpu-pci-0600
a[3] = 51 ;amdgpu-pci-0900
a[4] = 50 ;amdgpu-pci-0c00

Что мне нужно для вывода, так это бесконечный цикл, который постоянно обновляет массивindex со своим значением:

0 => 52
1 => 53
2 => 47
3 => 51
4 => 57

Новое значение должно печататься поверх старого значения, чтобы оно не тянулось.Обновление должно иметь задержку в 1 секунду, чтобы оператор мог легко оценить значения.

Извлечение и сортировка могут быть выполнены с помощью GAwk, но мне нужно, чтобы оно сохранялось в массиве в bash, чтобы я мог его использоватьдля другого процесса.

привет

1 Ответ

0 голосов
/ 03 октября 2018

Повторное использование частей из вашего сценария и ответа Эда Мортона. Я думаю, это может сработать для вас:

#!/bin/bash

while true
do
  while read -r i temp ; do
    echo -en  "GPU $i temp is $temp \r "
    sleep 1
  done < <(
    sensors | gawk '
      !NF {name=""}
      /amdgpu/ {
        name=$1
      }
      /^temp1:/ && name {
        temps[name]=gensub(/^[^0-9]*([0-9]+).*/,"\\1",1,$2);
      }
      END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        ctr=0;
        for (i in temps) {
          print ctr++,temps[i]
        }
      } '
  )
done

Редактировать: если вам нужно сохранить значения в массиве (как указано в вопросе) для другихДля этого вы можете сделать это следующим образом:

temps=( $( sensors | gawk '...' ) )

В этом случае измените команду печати в awk только на print temps [i].Мой подход может быть легко расширен для включения других значений с выхода датчиков (например, меток графического процессора или скорости вращения вентилятора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...