Eu tenho um problema com relação a um shell script e ao comando "nvidia-smi"!
Eu fiz um script que protege contra o superaquecimento da CPU no meu Ubuntu Server 14.04.2. Os scripts funcionam muito bem, mas também preciso que funcione nas minhas 4 GPUs.
Eu sou bastante verde quando se trata de scripts bash, então eu tenho procurado por comandos que tornariam mais fácil para mim editar o script. Eu encontrei e testei muitos deles, mas nenhum parece me dar a saída que eu preciso! Eu vou te mostrar os comandos e a saída abaixo. E os scripts também.
O que eu preciso é de um comando que liste as GPUs da mesma forma que o comando "sensors" de "lm-sensors" faz. Para que eu possa usar "grep" para selecionar uma GPU e definir a variável "newstring" (a temperatura de dois dígitos). Eu tenho tentado por um par de dias, mas não tive sorte. Principalmente porque o comando "nvidia-smi -lso" e / ou "nvidia-smi -lsa" não existe mais. Acho que foi um comando experimental.
Aqui estão os comandos que encontrei e testei & amp; a saída:
Este comando mostra o número do soquete da GPU que eu poderia colocar na string "str", mas o problema é que a temp. está na próxima linha. Eu tenho mexido na bandeira "A 1", mas não consegui colocar no script:
# 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
Este comando mostra a temperatura na primeira linha, mas não há um número de 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
Este comando mostra o número da GPU que você selecionou, mas ainda não há saída mostrando o numer / socket / ID da GPU!?
# nvidia-smi -q --gpu=0 | grep "GPU Current Temp"
GPU Current Temp : 59 C
E este comando mostra o número da GPU e os resultados na mesma linha !! Mas sem temperatura !!
# 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-..........)
E um comando que mostra todas as 4 temp. da GPU. sem mais nada. Mas ainda preciso do número / socket / ID da GPU!?
# nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader
58
47
47
48
O que eu estou desejando! Se eu conseguisse um comando que fizesse uma saída como essa, seria o cara mais feliz do mundo:
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
Aqui está a saída que "sensores" de "lm-sensors". Como você pode ver a informação da unidade e a temperatura está na mesma linha:
# -----------------------------------------------------------
# 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)
# -----------------------------------------------------------
Aqui está a parte do script que precisa ser alterada. Como mencionado no topo, isso funciona usando o comando "sensores" da aplicação "lm-sensors". "lm-sensors" não mostra a temperatura da GPU. Ao executar o CUDA e o driver anexado, precisamos de outro comando para obter a GPU listada e a temp. mostrando. Você pode saber outra maneira de corrigir o meu problema, se por favor não hesite em me mostrar.:
[...]
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
[...]
Espero que exista um guru do script, pronto para resolver este problema
Tenham um ótimo final de semana!
Atenciosamente,
Dan Hansen
Dinamarca
.