Gå till innehåll

Bashprogrammering


Gå till lösning Löst av Cecilia,

Recommended Posts

Lite "taggad" av framgången i denna tråd tänkte jag kolla på nästan samma sak men då för/med min "rätta" dator, med Linux Mint.

Här vill jag nu använda samma usb-relä som i den andra tråden. Det är här det reläet är ansluten normalt men styrs på annat sätt. Nu vill jag inte använda en extern tempgivare utan de sensorer som så att säga redan finns i datorn.

Här tyckte jag det blev knepigare att söka då det finns trådar som beskriver hur man övervakar temperaturen och övervakar (intern)fläktvarvtal osv. Inte där man vill styra en extern fläkt. Då hamnar träffarna "tillbaks" till Raspberry Pi, som i den andra tråden.

Python verkar vara väldigt kinkigt vad gäller 'indent' - det är inte bara för att få en snyggt uppställd kod, tydligen, utan ett måste för att koden ska kunna köras?
BASH verkar då lite "enklare". Men sökträffarna är lika dåliga, som jag ser det.

Jag har hittat ett skript som ska stänga av datorn vid för hög temperatur. Där har jag lyckats lägga in start av fläkten som åtgärd och det fungerar. Skriptet är ju tänkt att stänga av datorn och därmed också stänga skriptet. Jag vill att det ska snurra på hela tiden och jag vill kunna lägga in en till IF.
Om jag lägger in en till IF bråkas det om att det är ett felaktigt slut på filen?

Koden, som gör jobbet men bara en gång ser ut så här nu:

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print $2}')
   max="+36.0"
   if [[ "$val" > "$max" ]]; then
       ./usb1.sh
   fi
   sleep 2
   clear
   sensors

done
exit 0

och det är på rad 6 jag startar reläet. Jag vill peta in

 if [[ "$val" < "$max" ]]; then
       ./usb0.sh

jo jag är medveten om hysteresen men tänkte då ha en min="+35.0" 

Hur gör man?

Redigerad av Mikael63
Länk till kommentar
Dela på andra webbplatser

  • 2 veckor senare...
On 2022-10-23 at 14:48, Mikael63 sade:

Hur gör man?

Ja man ger tusan i att anropa ett annat skript och i stället påverkar reläet direkt...

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print $2}')
   max="39.0"
   if [[ "$val" > "$max" ]]; then
       usbrelay HW348_1=1
   else
		usbrelay HW348_1=0
	fi
	sleep 30
done	
exit 0

 

  • Thanks 1
Länk till kommentar
Dela på andra webbplatser

  • 1 år senare...
Postad (redigerade)

Hmm..
Vet inte om "det" skiljer sig åt nu med LMDE 6 mot tidigare "vanliga" Linux Mint, eller ej men oavsett:

Idag ser koden annorlunda ut. (ja särskilt just nu när jag testar lite extra, värdena 34 & 31 är nu endast för att liksom bekräfta min fundering.

#!/bin/bash
while true; do
   val=$(sensors | awk '/temp1/ {print $2}')
   max="34.0"
   min="31.0"
   if [[ "$val" > "$max" ]]; then
		printf "$val"
        usbrelay HW348_1=1
   elif [[ "$val" < "$min" ]]; then
		printf "$val"
		usbrelay HW348_1=0
        
	fi
	sleep 5
done	
exit 0

På rad 3 återfinns temp1 och det stämmer med en av sensorerna enligt detta:

image.png.e35c3bdaab7b798db76371fb76966a51.png

Utdatat, nu när jag lagt till printf, ser ut så här:

image.png.b8a04f76cc116b838f118ce8972f20da.png

Det finns alltså två stycken som heter temp1 och det är i mitt fall den första/översta som skriptet använder sig av. (Har jag testat mig fram till)

Jag skulle vilja använda den andra temp1 eller ex. Package id 0. Hur ska koden se ut då?
Att bara använda texten Package id 0 fungerar inte. Det verkar som mellanslagen i namnet inte gillas.

Tillägg:

Kanske att man kan ange typ det högsta värdet av temp1 eller summan av dem?

Redigerad av Mikael63
Länk till kommentar
Dela på andra webbplatser

On 2022-10-23 at 14:48, Mikael63 sade:

Jag har hittat ett skript

Jag borde givetvis ha haft en källhänvisning, framför allt som cred men då även att jag ev. skulle kunna hitta mer nytta där, för min egen skull.

Inte säker men mycket talar för att det var här jag hittade det:
https://askubuntu.com/questions/206214/bash-script-to-sleep-at-given-cpu-temperature-update-for-16-04

Dock fanns där inget som förklarade hur man skulle kunna byta ut temp1 till något annat.

  • Thanks 1
Länk till kommentar
Dela på andra webbplatser

Om man hade idas lära sig något hade jag kanske förstått hur det hänger ihop men nu är det som det är 🤪.

Den här raden i koden ovan fungerar men det är då temp1 som övervakas och det verkar vara tempen på det trådlösa nätverkskortet:

val=$(sensors | awk '/temp1/ {print $2}')

om jag byter ut till
val=$(sensors | awk '/Core 1/ {print $2}')
fungerar det inte men om jag ändrar till
val=$(sensors | awk '/Core 1/ {print $3}')
fungerar det med temp på kärna 1
$0, $1 fungerar inte heller och jag har inte testat med $4 och uppåt.

Om jag använder
val=$(sensors | awk '/Package id 0/ {print $4}')
fungerar det också. Där kan jag inte ha $0, $1, $2, $3 och har inte testat med $5 och uppåt.

Vad dessa argument till print betyder/innebär vet jag alltså inte. Jag ser endast olika resultat från printf och det slutliga resultatet när reläet växlar.

Länk till kommentar
Dela på andra webbplatser

  • Lösning

På sidan https://unix.stackexchange.com/questions/99535/print-command-instead-of-echo-in-linux står det att awk är ett eget programspråk så det som kommer efteråt på raden har egentligen inget med Bash att göra. Det är därför som "print" står inom klamrar.

Utskrift med "print" i awk beskrivs på sidan https://www.gnu.org/software/gawk/manual/html_node/Print-Examples.html och $1 och uppåt står tydligen för fälten i en inläst "record". Så allt verkar bero på vad "sensors" ger för utvärde, hur det ser ut. Har du någon information om det?

  • Thanks 1
Länk till kommentar
Dela på andra webbplatser

Tack!

Om jag kör mitt skript med nuvarande $4 får jag värden som

+36.0°C+37.0°C+37.0°C+36.0°C+36.0°C+36.0°C+38.0°C^C
alltså på en rad

med $3 får jag

0:HW348_1=0
0:HW348_1=0

 

Där verkar det vara 0: som jag får och det verkar vara från namnet, se nedan. HW348_1=0 är status på mitt relä

med $2 får jag

idHW348_1=1
idHW348_1=1


Där verkar det som id från namnet på sensorn skrivs ut. Det tolkas som mer än den maxtemp jag satt då reläet växlar.

med $1 får jag

PackageHW348_1=1
PackageHW348_1=1

 

helt utan $, alltså inte ens $0 får jag

Package id 0:  +32.0°C  (high = +105.0°C, crit = +105.0°C)HW348_1=1
 

Nu verkar det ju helt logiskt ju!

Om man inte anger något argument får man hela textsträngen (och den kan man ju vilja ha om man ex. ska skicka infon vidare men det kan bli svårt att göra beräknande villkor)

Väljer man en siffra är det de olika textsträngarna som visas och om jag väljer att ange $5 får jag mycket riktigt 

(highHW348_1=1
(highHW348_1=1

 

Detta stämmer ju även om jag backar till när jag kollade på sensor temp1. Där användes $2 eftersom den första textsträngen är just temp1 och den andra är mitt eftersökta värde.

Lite imponerande i sammanhanget är att textsträngen +36.0°C är beräkningsbart som värdet 36.0

 

  • Like 1
Länk till kommentar
Dela på andra webbplatser

Delta i dialogen

Du kan skriva svaret nu och registrera dig senare, Om du har ett konto, logga in nu för att svara på inlägget.

Gäst
Svara i detta ämne...

×   Du har klistrat in innehåll med formatering.   Ta bort formatering

  Only 75 emoji are allowed.

×   Din länk har automatiskt bäddats in.   Visa som länk istället

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Skapa nytt...