Для сценария оболочки и “nvidia-smi” - нужна правильная команда/флаг!

У меня есть проблема относительно сценария оболочки и команды "nvidia-smi"!

Я сделал сценарий что как защита от ЦП, перегревающегося на моем Сервере Ubuntu 14.04.2. Сценарии работают приятно, но я должен заставить его работать над моими 4 GPU также. Я являюсь довольно зеленым когда дело доходит до сценариев удара, таким образом, я искал команды, которые помогли бы мне отредактировать сценарий. Я нашел и протестировал многие из них, но ни один, кажется, не дает мне вывод, в котором я нуждаюсь! Я покажу Вам команды и вывод ниже. И сценарии также.

То, в чем я нуждаюсь, является командой, которая перечисляет GPU тем же путем, команда "датчиков" от "lm-датчиков" делает. Так, чтобы я мог использовать "grep", чтобы выбрать GPU и установить переменную "newstring" (временный файл. две цифры). Я пробовал в течение нескольких дней, но не имел никакой удачи. Главным образом, потому что команда "nvidia-smi-lso" и/или "nvidia-smi-lsa" больше не существует. Думайте, что это была экспериментальная команда.

Вот команды, которые я нашел и протестировал и вывод:

Эта команда показывает число сокета GPU, которое я мог поместить в строку "ул.", но проблема состоит в том что временный файл. находится на следующей строке. Я играл с флагом "A 1", но не смог поместить его в сценарий:

# nvidia-smi -q -d temperature | grep GPU
Attached GPUs                       : 4
GPU 0000:01:00.0
        GPU Current Temp            : 57 C
        GPU Shutdown Temp           : N/A
        GPU Slowdown Temp           : N/A
GPU 0000:02:00.0
        GPU Current Temp            : 47 C
        GPU Shutdown Temp           : N/A
        GPU Slowdown Temp           : N/A
GPU 0000:03:00.0
        GPU Current Temp            : 47 C
        GPU Shutdown Temp           : N/A
        GPU Slowdown Temp           : N/A
GPU 0000:04:00.0
        GPU Current Temp            : 48 C
        GPU Shutdown Temp           : N/A
        GPU Slowdown Temp           : N/A

Эта команда показывает временный файл в первой строке, но нет никакого числа GPU!?

# nvidia-smi -q -d temperature | grep "GPU Current Temp"
        GPU Current Temp            : 58 C
        GPU Current Temp            : 47 C
        GPU Current Temp            : 47 C
        GPU Current Temp            : 48 C

Эта команда показывает число GPU, которое Вы выбираете, но нет все еще никакого вывода, показывающего GPU numer/socket/ID!?

# nvidia-smi -q --gpu=0 | grep "GPU Current Temp"
GPU Current Temp            : 59 C

И это управляет, показывает число GPU и результаты в той же строке!! Но, никакая температура!!

# nvidia-smi -L
GPU 0: GeForce GTX 750 Ti (UUID: GPU-9785c7c7-732f-1f51-..........)
GPU 1: GeForce GTX 750 (UUID: GPU-b2b1a4a-4dca-0c7f-..........)
GPU 2: GeForce GTX 750 (UUID: GPU-5e6b8efd-7531-777c-..........)
GPU 3: GeForce GTX 750 Ti (UUID: GPU-5b2b1a2f-3635-2a1c-..........)

И команда, которая показывает временный файл всех 4 GPU. ни с чем больше. Но тем не менее мне нужно число/сокет/ИДЕНТИФИКАТОР GPU!?

# nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader
58
47
47
48

Чего я желаю! Если я мог бы получить команду, которая сделала вывод как это, я буду самым счастливым парнем вокруг:

GPU 0: GeForce GTX 750 Ti   GPU Current Temp            : 58 C
GPU 1: GeForce GTX 750   GPU Current Temp            : 47 C
GPU 2: GeForce GTX 750   GPU Current Temp            : 47 C
GPU 3: GeForce GTX 750 Ti   GPU Current Temp            : 48 C

Вот является вывод этим "датчики" от "lm-датчиков". Поскольку Вы видите информацию о единице, и временный файл находится в той же строке:

# -----------------------------------------------------------
# coretemp-isa-0000
# Adapter: ISA adapter
# Physical id 0:  +56.0°C  (high = +80.0°C, crit = +100.0°C)
# Core 0:         +56.0°C  (high = +80.0°C, crit = +100.0°C)
# Core 1:         +54.0°C  (high = +80.0°C, crit = +100.0°C)
# Core 2:         +54.0°C  (high = +80.0°C, crit = +100.0°C)
# Core 3:         +52.0°C  (high = +80.0°C, crit = +100.0°C)
# -----------------------------------------------------------

Вот часть сценария, для которого нужно изменение. Как упомянуто в вершине, это работает с помощью команды "датчики" из приложения "lm-датчики". "lm-датчики" не показывают временный файл GPU. когда выполнение CUDA и присоединенного драйвера, таким образом, нам нужна другая команда для получения GPU, перечислило и временный файл. показанный. Можно знать другой способ решить мою проблему, если, покажите мне.:

[...]
echo "JOB RUN AT $(date)"
echo "======================================="

echo ''
echo 'CPU Warning Limit set to => '$1
echo 'CPU Shutdown Limit set to => '$2
echo ''
echo ''

sensors

echo ''
echo ''

for i in 0 1 2 3
do

  str=$(sensors | grep "Core $i:")
  newstr=${str:17:2}

  if [ ${newstr} -ge $1 ]
  then
    echo '===================================================================='         >>/home/......../logs/watchdogcputemp.log
    echo $(date)                                                                        >>/home/......../logs/watchdogcputemp.log
    echo ''                                                                             >>/home/......../logs/watchdogcputemp.log
    echo ' STATUS WARNING - NOTIFYING : TEMPERATURE CORE' $i 'EXCEEDED' $1 '=>' $newstr >>/home/......../logs/watchdogcputemp.log
    echo ' ACTION : EMAIL SENT'                                                         >>/home/......../logs/watchdogcputemp.log
    echo ''                                                                             >>/home/......../logs/watchdogcputemp.log
    echo '===================================================================='         >>/home/......../logs/watchdogcputemp.log

# Status Warning Email Sending Code
# WatchdogCpuTemp Alert! Status Warning - Notifying!"

/usr/bin/msmtp -d --read-recipients </home/......../shellscripts/messages/watchdogcputempwarning.txt

    echo 'Email Sent.....'
  fi
[...]

Я надеюсь, что там существует гуру сценария удара, готовый решить эту проблему Имеют хорошие выходные!

С наилучшими пожеланиями, Dan Hansen Дания

.

1
задан 19 June 2015 в 17:57

5 ответов

awk является большим универсальным инструментом, идеально подходящим для этого. Для каждой входной строки это выполняет все команды, которые соответствуют. Здесь я передаю вывод по каналу от двух из Ваших команд в awk. Когда это соответствует началу строк GPU 0: это разделяет строку на 2 части в" (" символ и сохраняет первую часть (x [1]) в массиве, индексированном gpu числом, полученным от поля 2 (2$: поля разделяются пробелом).

Когда это соответствует строкам GPU 0000:01:00.0 это разделяет поле 2 на 3 части в ":" символ и сохраняет 2-ю часть минус 1 как gpu число.

Когда это соответствует строкам GPU Current Temp это сохраняет 5-е и 6-е поля (связанный с пространством) в другой массив, индексированный "глобальной" переменной gpu установленный предыдущей строкой.

В конце входа (КОНЕЦ) мы печатаем массивы, теперь у них есть вся информация.

mynvidia(){

 ( nvidia-smi -L
   nvidia-smi -q -d temperature | grep GPU
 ) | 
 awk '
 /^GPU [0-9]:/     { gpu=0+$2; split($0,x,"("); gputype[gpu]=x[1]; }
 /^GPU 00/         { split($2,x,":"); gpu=x[2]-1; }
 /GPU Current Temp/{ temperature[gpu] = $5 " " $6; }
 END               { for(gpu=0;gpu<99;gpu++)
                     if(gputype[gpu]!="")
                      printf "%-30s GPU Current Temp: %s\n",gputype[gpu],temperature[gpu]
                   }'
}

str=$(mynvidia | grep "GPU $i:")
newstr=${str:49:2}
# ... echo "$str"

Вот вывод функции mynvidia в сценарии:

GPU 0: GeForce GTX 750 Ti      GPU Current Temp: 57 C
GPU 1: GeForce GTX 750         GPU Current Temp: 47 C
GPU 2: GeForce GTX 750         GPU Current Temp: 47 C
GPU 3: GeForce GTX 750 Ti      GPU Current Temp: 48 C
1
ответ дан 7 December 2019 в 13:56

Возможно, у Вас есть ноу-хау для фиксации этого. Я протестировал свой переоборудованный сценарий, но я борюсь с 2 переменными. Я должен определить номер GPU в "str" и температуру в "newstr". Это, кажется, идет очень хорошо с первой строкой, и "grep" работает, но когда дело доходит до второго это останавливается. Я считал пробелы 101 раз. Вы знаете, является ли это проблемой. Пробелы должны "считаться" в другом отношении?

Вот мой сценарий:

#!/bin/bash

# --- WatchdogGpuTemp.sh v.0.1.2 ---
# Author: DanHansen[at]Denmark
# Thanks to "Terdon" Ubuntu Forums
# Application: nvidia-smi
# Filename: watchdoggputemp.sh
# Logfile: watchdoggputemp.log
# Message file for status warning: watchdoggputempwarning.txt
# Message file for status critical: watchdoggputempcritical.txt
# Work directory: /home/username/shellscripts/
# Log directory: /home/username/logs/
# Message directory: /home/username/shellscripts/messages/
#
# --- WatchdogGpuTemp.sh v.0.1.2 ---

echo "JOB RUN AT $(date)"
echo "======================================="

echo ''
echo 'CPU Warning Limit set to => '$1
echo 'CPU Shutdown Limit set to => '$2
echo ''
echo ''

nvidia-smi -q -d temperature | grep GPU | perl -pe '/^GPU/ && s/\n//' | grep ^GPU

echo ''
echo ''

for i in 1 2 3 4
do

  str=$(nvidia-smi -q -d temperature | grep GPU | perl -pe '/^GPU/ && s/\n//' | grep ^GPU "GPU 0000:0$i:00.0")
  newstr=${str:54:2}

  if [ ${newstr} -ge $1 ]
  then
    echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log
    echo $(date)                                                                       >>/home/username/logs/watchdoggputemp.log
    echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
    echo ' STATUS WARNING - NOTIFYING : TEMPERATURE GPU' $i 'EXCEEDED' $1 '=>' $newstr >>/home/username/logs/watchdoggputemp.log
    echo ' ACTION : EMAIL SENT'                                                        >>/home/username/logs/watchdoggputemp.log
    echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
    echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log

# Status Warning Email Sending Code 
# WatchdogGpuTemp Alert! Status Warning - Notifying!"

/usr/bin/msmtp -d --read-recipients </home/username/shellscripts/messages/watchdoggputempwarning.txt

    echo 'Email Sent.....'
  fi

  if [ ${newstr} -ge $2 ]
  then
    echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log
    echo $(date)                                                                       >>/home/username/logs/watchdoggputemp.log
    echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
    echo ' STATUS CRITICAL - SHUTDOWN : TEMPERATURE GPU' $i 'EXCEEDED' $2 '=>' $newstr >>/home/username/logs/watchdoggputemp.log
    echo ' ACTION : EMAIL SENT & SYSTEM SHUTDOWN'                                      >>/home/username/logs/watchdoggputemp.log
    echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
    echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log

# Status Critical Email Sending Code:
# WatchdogGpuTemp Alert! Status Critical - Shutdown!"

/usr/bin/msmtp -d --read-recipients </home/username/shellscripts/messages/watchdoggputempcritical.txt

    echo 'Email Sent.....'
    echo 'System will now shutdown.....'
    /sbin/shutdown -h now
    exit

  else
    echo ' Temperature GPU '$i' OK at =>' $newstr
    echo ''
  fi
done

echo 'Status - All GPUs are within critical temperature limits'
echo ''

Вот вывод при выполнении сценария:

# ./watchdoggputemp.sh 55 60
JOB RUN AT Sun Jun 28 10:13:57 CEST 2015
=======================================

CPU Warning Limit set to => 55
CPU Shutdown Limit set to => 60


GPU 0000:01:00.0        GPU Current Temp            : 49 C
GPU 0000:02:00.0        GPU Current Temp            : 46 C
GPU 0000:03:00.0        GPU Current Temp            : 52 C
GPU 0000:04:00.0        GPU Current Temp            : 51 C


grep: GPU 0000:01:00.0: No such file or directory
./watchdoggputemp.sh: line 68: [: -ge: unary operator expected
./watchdoggputemp.sh: line 86: [: -ge: unary operator expected
 Temperature GPU 1 OK at =>

grep: GPU 0000:02:00.0: No such file or directory
./watchdoggputemp.sh: line 68: [: -ge: unary operator expected
./watchdoggputemp.sh: line 86: [: -ge: unary operator expected
 Temperature GPU 2 OK at =>

grep: GPU 0000:03:00.0: No such file or directory
./watchdoggputemp.sh: line 68: [: -ge: unary operator expected
./watchdoggputemp.sh: line 86: [: -ge: unary operator expected
 Temperature GPU 3 OK at =>

grep: GPU 0000:04:00.0: No such file or directory
./watchdoggputemp.sh: line 68: [: -ge: unary operator expected
./watchdoggputemp.sh: line 86: [: -ge: unary operator expected
 Temperature GPU 4 OK at =>

Status - All GPUs are within critical temperature limits

я попробовал 4'th предложение, команда сценария, но при тестировании его вывод похож на это снова. Никакое число GPU. Поэтому я думаю, что Ваше первое предложение является лучшим для меня, но я все еще борюсь с температурной переменной "newstr".:

# nvidia-smi -q -d temperature | while read line; do [[ $line =~ C$ ]] && printf "%s : %s\n" "$last" "$line"; last="$line"; done
Temperature : GPU Current Temp            : 51 C
Temperature : GPU Current Temp            : 46 C
Temperature : GPU Current Temp            : 53 C
Temperature : GPU Current Temp            : 50 C

Так, Terdon, если существует какой-либо способ, которым можно помочь мне через финишную черту здесь, я буду очень благодарен. Как поместить температуру в "newstr". Это, кажется, лучшее решение в моем небольшом сценарии.

Взгляд так передают для получения известия от Вас;)

0
ответ дан 10 November 2019 в 10:51

Все, что действительно необходимо сделать, должно удалить новую строку из всех строк, запускающихся с GPU. Вы могли использовать этот жемчуг один лайнер, который удаляет новые строки из строк, чьи сначала три символа GPU:

$ nvidia-smi -q -d temperature | grep GPU | perl -pe '/^GPU/ && s/\n//' | grep ^GPU
GPU 0000:01:00.0        GPU Current Temp            : 57 C
GPU 0000:02:00.0        GPU Current Temp            : 47 C
GPU 0000:03:00.0        GPU Current Temp            : 47 C
GPU 0000:04:00.0        GPU Current Temp            : 48 C

С другой стороны, можно выполнить во всем этом awk:

$ nvidia-smi -q -d temperature | awk '{if(/C$/){print last,$0};last=$0};' 
GPU 0000:01:00.0         GPU Current Temp            : 57 C
GPU 0000:02:00.0         GPU Current Temp            : 47 C
GPU 0000:03:00.0         GPU Current Temp            : 47 C
GPU 0000:04:00.0         GPU Current Temp            : 48 C

Это просто проверяет если текущие концы строки с a C и, если это делает, это печатает его ($0) наряду с предыдущей строкой. last=$0 сохраняет текущую строку как last сделать это доступным, когда следующая строка обрабатывается.

Вот та же логика, реализованная в Perl:

$ nvidia-smi -q -d temperature | perl -lne 'print "$last $_" if /C$/; $last=$_' file 
GPU 0000:01:00.0         GPU Current Temp            : 57 C
GPU 0000:02:00.0         GPU Current Temp            : 47 C
GPU 0000:03:00.0         GPU Current Temp            : 47 C
GPU 0000:04:00.0         GPU Current Temp            : 48 C

Наконец, так как Вы делаете это в сценарии оболочки так или иначе, Вы могли также получить желаемый вывод непосредственно от удара:

$ nvidia-smi -q -d temperature | while read line; do 
    [[ $line =~ C$ ]] && printf "%s : %s\n" "$last" "$line";
    last="$line"; done
GPU 0000:01:00.0 : GPU Current Temp            : 57 C
GPU 0000:02:00.0 : GPU Current Temp            : 47 C
GPU 0000:03:00.0 : GPU Current Temp            : 47 C
GPU 0000:04:00.0 : GPU Current Temp            : 48 C
1
ответ дан 7 December 2019 в 13:56

Спасибо за Ваш ответ!! Это, кажется, решает мою проблему!! Второе предложение с помощью awk не выглядело одинаково, путь здесь в моей системе, но первом предложении был просто прекрасен! Я повторяюсь ПРЕКРАСНЫЙ!! Большое спасибо за того моего друга. Это действительно помогает мне. Я должен сказать, что Вы решаете проблему очень приятно, и я сохраню другие предложения для дальнейшего использования!! Снова, большое спасибо за Вашу справку мой друг!

Чтобы другие видели, что я буду и узнавать об этом, вот результаты на моем Сервере Ubuntu 14.04

Этот похож на это в моей системе:

# nvidia-smi -q -d temperature | awk '{if(/C$/){print last,$0};last=$0};'
    Temperature         GPU Current Temp            : 53 C
    Temperature         GPU Current Temp            : 45 C
    Temperature         GPU Current Temp            : 52 C
    Temperature         GPU Current Temp            : 51 C

И этот, который является просто ИДЕАЛЬНЫМИ взглядами как это в моей системе:

# nvidia-smi -q -d temperature | grep GPU | perl -pe '/^GPU/ && s/\n//' | grep ^GPU
GPU 0000:01:00.0        GPU Current Temp            : 53 C
GPU 0000:02:00.0        GPU Current Temp            : 45 C
GPU 0000:03:00.0        GPU Current Temp            : 52 C
GPU 0000:04:00.0        GPU Current Temp            : 51 C

Здесь у меня есть текст GPU к "grep" в моем сценарии. У меня есть идентификатор сокета GPU, и наконец, что не менее важно, у меня есть температура в той же строке! Точно, что я попросил. Я кротко кланяюсь ;)

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

С наилучшими пожеланиями, Dan

0
ответ дан 7 December 2019 в 13:56

Я попробовал новый "выпуск" Вашего предложения, и это работает приятно! Большие взгляды. Но я пытаюсь заставить его работать в сценарии, и это, кажется, трудно...

Вот хороший вывод, когда выполнено как сценарий:

# ./getgputemp.sh
GPU 0: GeForce GTX 750 Ti      GPU Current Temp: 49 C
GPU 1: GeForce GTX 750         GPU Current Temp: 39 C
GPU 2: GeForce GTX 750         GPU Current Temp: 42 C
GPU 3: GeForce GTX 750 Ti      GPU Current Temp: 51 C

Покажите мне, как использовать его в моем сценарии. Я попробовал несколько путей, и наклон заставляют его работать. Я должен к переменным заставить сценарий работать. Мне нужна "ул.", которая является GPUnumber, и мне нужен "newstr", который является температурой". Какие-либо идеи??

Сценарий, как это прямо сейчас:

    #!/bin/bash

    # --- WatchdogGpuTemp.sh v.0.1.6 ---
    # Author: DanHansen[at]Denmark
    # Application: nvidia-smi
    # Filename: watchdoggputemp.sh
    # Logfile: watchdoggputemp.log
    # Message file for status warning: watchdoggputempwarning.txt
    # Message file for status critical: watchdoggputempcritical.txt
    # Work directory: /home/username/shellscripts/
    # Log directory: /home/username/logs/
    # Message directory: /home/username/shellscripts/messages/
    #
    # --- WatchdogGpuTemp.sh v.0.1.6 ---

    echo "JOB RUN AT $(date)"
    echo "======================================="

    echo ''
    echo 'CPU Warning Limit set to => '$1
    echo 'CPU Shutdown Limit set to => '$2
    echo ''
    echo ''


( nvidia-smi -L
  nvidia-smi -q -d temperature | grep GPU
) | 
awk '
/^GPU [0-9]:/     { gpu=0+$2; split($0,x,"("); gputype[gpu]=x[1]; }
/^GPU 00/         { split($2,x,":"); gpu=x[2]-1; }
/GPU Current Temp/{ temperature[gpu] = $5 " " $6; }
END               { for(gpu=0;gpu<4;gpu++)
                      printf "%-30s GPU Current Temp: %s\n",gputype[gpu],temperature[gpu]
                  }'


    echo ''
    echo ''

    for i in 1 2 3 4
    do


      str=$( YOUR STUFF AND GREP "GPU $i:)  <------- SET "STR" TO GPU NUMBER
      newstr=${str:49:2}  <------------------------- SET "NEWSTR" TO TEMPERATURE



      if [ ${newstr} -ge $1 ]
      then
        echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log
        echo $(date)                                                                       >>/home/username/logs/watchdoggputemp.log
        echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
        echo ' STATUS WARNING - NOTIFYING : TEMPERATURE GPU' $i 'EXCEEDED' $1 '=>' $newstr >>/home/username/logs/watchdoggputemp.log
        echo ' ACTION : EMAIL SENT'                                                        >>/home/username/logs/watchdoggputemp.log
        echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
        echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log

    # Status Warning Email Sending Code 
    # WatchdogGpuTemp Alert! Status Warning - Notifying!"

    /usr/bin/msmtp -d --read-recipients </home/username/shellscripts/messages/watchdoggputempwarning.txt

        echo 'Email Sent.....'
      fi

      if [ ${newstr} -ge $2 ]
      then
        echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log
        echo $(date)                                                                       >>/home/username/logs/watchdoggputemp.log
        echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
        echo ' STATUS CRITICAL - SHUTDOWN : TEMPERATURE GPU' $i 'EXCEEDED' $2 '=>' $newstr >>/home/username/logs/watchdoggputemp.log
        echo ' ACTION : EMAIL SENT & SYSTEM SHUTDOWN'                                      >>/home/username/logs/watchdoggputemp.log
        echo ''                                                                            >>/home/username/logs/watchdoggputemp.log
        echo '===================================================================='        >>/home/username/logs/watchdoggputemp.log

    # Status Critical Email Sending Code:
    # WatchdogGpuTemp Alert! Status Critical - Shutdown!"

    /usr/bin/msmtp -d --read-recipients </home/username/shellscripts/messages/watchdoggputempcritical.txt

        echo 'Email Sent.....'
        echo 'System will now shutdown.....'
        /sbin/shutdown -h now
        exit

      else
        echo ' Temperature GPU '$i' OK at =>' $newstr
        echo ''
      fi
    done

    echo 'Status - All GPUs are within critical temperature limits'
    echo ''
0
ответ дан 7 December 2019 в 13:56

Другие вопросы по тегам:

Похожие вопросы: