Esse script afetará toda a árvore de processos com raiz no processo executado.
Você pode facilmente testá-lo, executando-o em um terminal e verificando as temperaturas em outro terminal usando watch -n 1 'sensors -u | grep -Po "^ temp[0-9]+_input: \K.*"'
.
Neste exemplo, os limites são definidos como 50
e 75
e a execução do processo é stress -c 3
: eles são codificados no script, mas é fácil modificar o script para lê-los a partir dos argumentos. / p>
Assim que todas as temperaturas estiverem abaixo de 50 ° C stress
será iniciado; contanto que todas as temperaturas permaneçam abaixo de 75 ° C stress
continuará; assim que uma temperatura estiver acima de 75 ° C, ostress
irá parar; assim que todas as temperaturas estiverem abaixo de 50 ° C, novamente stress
continuará novamente:
#!/bin/bash
function n_t_exceeding {
sensors -u | awk -v x=0 -v temp=$1 '$1~/^temp[0-9]+_input:/{if($2 > temp){x++}}END{print x}'
}
set -m # Enables job control
mintemp=50 # First threshold
maxtemp=75 # Second threshold
while true; do
if [ $(n_t_exceeding $mintemp) -eq 0 ]; then
stress -c 3 & pid=$! # Starts the process, backgrounds it and stores the process' PID
printf 'Started\n'
break
fi
sleep 1 & wait $!
done
trap 'pkill -g $pid; exit' 2 # Upon SIGINT, sends SIGTERM to the process group and exits
while true; do
if [ $(n_t_exceeding $maxtemp) -gt 0 ]; then
pkill -19 -g $pid # Sends SIGSTOP to the process group
printf 'Stopped\n'
while true; do
if [ $(n_t_exceeding $mintemp) -eq 0 ]; then
pkill -18 -g $pid # Sends SIGCONT to the process group
printf 'Resumed\n'
break
fi
sleep 1 & wait $!
done
fi
sleep 1 & wait $!
done
-
function n_t_exceeding { sensors -u | awk -v x=0 -v temp=$1 '$1~/^temp[0-9]+_input:/{if($2 > temp){x++}}END{print x}'; }
analisa a saída desensors -u
e imprime o número de temperaturas acima de$1
(que é o primeiro argumento passado para a função):% sensors -u acpitz-virtual-0 Adapter: Virtual device temp1: temp1_input: 45.000 temp1_crit: 108.000 asus-isa-0000 Adapter: ISA adapter cpu_fan: fan1_input: 2200.000 temp1: temp1_input: 45.000 coretemp-isa-0000 Adapter: ISA adapter Physical id 0: temp1_input: 47.000 temp1_max: 87.000 temp1_crit: 105.000 temp1_crit_alarm: 0.000 Core 0: temp2_input: 46.000 temp2_max: 87.000 temp2_crit: 105.000 temp2_crit_alarm: 0.000 Core 1: temp3_input: 47.000 temp3_max: 87.000 temp3_crit: 105.000 temp3_crit_alarm: 0.000 % sensors -u | awk -v x=0 -v temp=46 '$1~/^temp[0-9]+_input:/{if($2 > temp){x++}}END{print x}' 2
-
set -m
ativa o controle de tarefas; -
mintemp=50; maxtemp=75
conjuntos$mintemp
e$maxtemp
a50
e75
respectivamente; estes são os limites 1) abaixo dos quais o processo deve começar na primeira vez e continuar novamente após ter excedido$maxtemp
2) acima do qual o processo deve parar; -
trap 'pkill -g $pid; exit' 2
garante que o script terminará todos os processos no grupo de processos e sairá em CTRL + C ; -
O primeiro loop
while
fica ocioso indefinidamente até o número de temperaturas acima de$mintemp
ser0
; quando o número de temperaturas acima de$mintemp
é0
inicia o processo, coloca-o em segundo plano e interrompe o loop; -
O segundo loop
while
fica ocioso indefinidamente até que o número de temperaturas acima de$maxtemp
seja maior que0
; quando o número de temperaturas acima de$maxtemp
for maior que0
envia um SIGSTOP para o grupo de processos e inicia um terceirowhile
loop; o terceiro loopwhile
fica ocioso indefinidamente até que o número de temperaturas acima de$mintemp
seja0
; quando o número de temperaturas acima de$mintemp
for0
envia um SIGCONT para o grupo de processos e sai do loop.