Shell script & amp; & Ldquo; SMI-NVIDIA & Rdquo; - нужна правильная команда / флаг!

Статья должна помочь вам.

https://help.ubuntu.com/community/AppleKeyboard

Я вставил эти две эхо-строки в /etc/rc.local:

echo 2 > /sys/module/hid_apple/parameters/fnmode
echo 2 > /sys/module/apple/parameters/fnmode

вставлен непосредственно перед строкой «выход 0».

1
задан 20 June 2015 в 03:57

4 ответа

Все, что вам действительно нужно сделать, это удалить новую строку из всех строк, начиная с GPU. Вы можете использовать этот perl один лайнер, который удаляет новые строки из строк, первые три символа которых 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

Это просто проверяет, заканчивается ли текущая строка с помощью 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

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

$ 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
ответ дан 23 May 2018 в 19:39
  • 1
    Привет, Тердон, спасибо за ваш ответ! Это, кажется, решает мою проблему !! Второе предложение, использующее awk, не выглядело так же, как в моей системе, но ваше первое предложение было просто идеальным! Я повторяю СОВЕРШЕННО !! – user246252 28 June 2015 в 07:11
  • 2
    @ user246252, вы очень желанны. Если это или какой-либо другой ответ разрешил вашу проблему, пожалуйста, уделите минутку и примите ее , нажав на галочку слева. Это ответит на вопрос как ответ, и именно так выражаются на сайтах Stack Exchange. – terdon♦ 28 June 2015 в 11:11
  • 3
    Привет, Тердон. Команда работала как шарм. Но у меня много проблем с его использованием в моем скрипте. Первая часть, чтобы установить строку "str" поскольку число GPU работает! Но тогда мне нужна температура, помещенная в строку «newstr». Это я просто не могу сделать работу. Я показал вывод и полный скрипт с вашим предложением. Не могли бы вы взглянуть на него? Может быть, вы можете увидеть эту проблему. Обратите внимание, что есть 2 ответа / сообщения, потому что "meau" пришел с предложением. Либо, боюсь сказать, работает на данный момент;) С уважением, Дэн – user246252 28 June 2015 в 13:40

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

Для других посмотреть, что я буду и узнаю об этом, вот результаты на моем Ubuntu Server 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

И этот, который просто PERFECT выглядит так в моей системе:

# 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

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

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

С уважением, Дэн

0
ответ дан 23 May 2018 в 19:39

Я попробовал новое «издание» вашего предложения, и он работает красиво! Выглядит отлично. Но я пытаюсь заставить его работать в скрипте, и это кажется трудным ...

Вот хороший вывод при запуске как скрипт:

# ./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

Пожалуйста, покажите мне как использовать его в моем скрипте. Я пробовал несколько способов и не могу заставить его работать. Мне нужно переменные, чтобы заставить скрипт работать. Мне нужно «str», которое является 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
ответ дан 23 May 2018 в 19:39
  • 1
    Самый простой способ - поместить весь новый код ( nvidia...awk '...') inside a function, then use that function as just another command you can put inside your str = $ (...) . To do that simply wrap the code in mynvidia () {`и }. Я отредактирую свой ответ, чтобы показать вам. – meuh 28 June 2015 в 14:14
  • 2
    Спасибо meuh !! Но обратите внимание, что есть 2 строки. & Quot; ул & Quot; (Номер GPU) и "newstr" (температура). Ну, я думаю, вы знаете, на самом деле, я уверен, что;) – user246252 28 June 2015 в 14:25
  • 3
    Привет, спасибо, спасибо. он отлично работает как скрипт для себя, и все это помещается в переменную mynvidia, завернутую в функцию «str». Я могу эхо " str " нет проблем, но все же, как вы могли бы видеть. Это не решает проблему. Если вы посмотрите на скрипт, он помещает "новый" Гнездо / номер GPU в строке "str" для каждого цикла, и он одновременно поднимает температуру. Ну, это может быть мой способ сделать это, но было бы неплохо заставить его работать, как и с моим скриптом управления процессором с использованием lm-датчиков. Просто нужен способ установить " str " к числу GPU и "newstr" к температуре. Спасибо за вашу помощь – user246252 28 June 2015 в 14:39

Возможно, у вас есть ноу-хау, чтобы исправить это. Я протестировал мой отредактированный скрипт, но я борюсь с двумя переменными. Мне нужно установить число 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-е предложение, команду сценария, но при тестировании результат снова выглядит. Нет номера графического процессора. Поэтому я думаю, что ваше первое предложение для меня самое лучшее, но я все еще борюсь с температурной переменной «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

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

Глядя так много, чтобы услышать от вас;)

0
ответ дан 23 May 2018 в 19:39

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

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