Page 1 of 1
Automatisera med Cron och Bash
Posted: Fri Mar 17, 2023 9:45 am
by PHermansson
En av tankarna med att ha en datorkopplad sändare var i alla fall för mig att låta datorn slå av och på ljuset själv. Har testat lite olika varianter, för tillfället provar jag enklast möjliga variant.
I Linuxsystem finns ju oftast Cron, så för att slå av alla lampor kör jag ett cron-jobb.
MEN - som Tony skulle ha sagt - det är ju dumt att skicka signaler om lamporna redan är av. Därför används detta script:
Code: Select all
#!/bin/bash
#Find rfcmd
rfcmd=`which rfcmd`
echo $rfcmd
#Check if lamps are off
onoff=`cat /tmp/onoff`
echo $onoff
if [ "$onoff" = "on" ]; then
#Lamps on, shut 'em off
$rfcmd /dev/ttyUSB0 NEXA A 1 0
echo "off" > /tmp/onoff
fi
För att slå på lamporna vill jag ha lite mer finess, så här använder jag ljussensorn från mitt 1-wireprojekt som sitter strategiskt i ett fönster. Jag använder sedan ett bash-script som kollar hur ljust det är innan ljuset slås på.
Code: Select all
#!/bin/bash
#Find rfcmd
rfcmd=`which rfcmd`
echo $rfcmd
#Get light value
light=`cat /mnt/owfs/20.745305000000/volt.D`
echo $light
#Check if it's dark
if [ "$light" > "3" ]; then
#Check if light already on
onoff=`cat /tmp/onoff`
if [ "$onoff" = "off" ]; then
#Light is off, turn on lights
`$rfcmd /dev/ttyUSB0 NEXA A 1 1`
#Set onoff to on
`echo "on" > /tmp/onoff`
fi
fi
Visst ser det bra ut? Funkar perfekt när det körs manuellt, kör jag via cron vill det sig inte...

Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
Kan det vara rättighetsproblem? Som vilken användare kör du scriptet och vilken körs cronjobbet från?
Testa med detta först i filen:
Så ser du om scriptet verkligen körs
Posted: Fri Mar 17, 2023 9:45 am
by PHermansson
Det var det jag fundera på också, Men:
-Jag lade till date-raden och väntade lite, då hittar jag lastrun i /tmp:
-rw-r--r-- 1 root root 29 26 feb 22.26 lastrun
Cron körs som root:
Code: Select all
ps aux|grep cron
root 7501 0.0 0.4 3024 1040 ? Ss 11:27 0:00 /usr/sbin/cron
Och jag kör det manuellt som root. Brukar göra så när jag testar, rättigheter kan vara jobbiga...
Code: Select all
ls -l /usr/local/bin/rfcmd
-rwxr-xr-x 1 root root 12513 31 jan 23.59 /usr/local/bin/rfcmd
cat /var/log/cron.log
...
Feb 26 22:27:01 FilserverAlpha cron[27419]: (root) CMD (/usr/local/bin/rfcmdoff)
Feb 26 22:28:01 FilserverAlpha cron[27434]: (root) CMD (/usr/local/bin/rfcmdoff)
Feb 26 22:29:01 FilserverAlpha cron[27453]: (root) CMD (/usr/local/bin/rfcmdoff)
Sen lade jag till detta sist i scriptet:
Jag väntar lite, sedan finns filen /tmp/network, men den är tom? Kör jag manuellt funkar det som det ska...
Code: Select all
#ls -l /tmp
...
-rw-r--r-- 1 root root 1 26 feb 22.43 network
#cat /tmp/network
#
Hmm

Posted: Fri Mar 17, 2023 9:45 am
by micke.prag
Vilken distrubution kör du?
Kan det vara så att crons PATH inte innehåller t.ex. /sbin.
Testa isåfall:
Posted: Fri Mar 17, 2023 9:45 am
by PHermansson
Tack, det var en tanke! Kör Gentoo på en Alphamaskin. Här någonstans borde felet kunna ligga:
Code: Select all
cat /tmp/lastrun
Mon Feb 26 23:33:01 CET 2007
/usr/bin:/bin
FilserverAlpha ~ # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/alpha-unknown-linux-gnu/gcc-bin/3.4.6
Stämmer med mitt ifconfig-försök också.... Fast det verkar ändå som att det är min kod som strular, har lärt mig något nytt om bash-script nu:
Code: Select all
rfcmd=`which rfcmd`
`$rfcmd /dev/ttyUSB0 NEXA A 1 0`
Funkar inte.
Code: Select all
`/usr/local/bin/rfcmd /dev/ttyUSB0 NEXA A 1 0`
Funkar!
Tack för hjälpen, du fick mig på rätt spår, även om jag inte förstår varför min första variant inte funkar...
Posted: Fri Mar 17, 2023 9:45 am
by adent
Jag vill minnas att man har ingen eller någon extremt simpel path i cron-job (säkert nån säkerhetsgrej) och which söker nog igenom path:en så då funkar förstås inte det heller.
Jag har iaf märkt att man verkar behöva ange absoluta sökvägar för cron-job för att det ska fungera.
Posted: Fri Mar 17, 2023 9:45 am
by Jaxån
adent wrote:Jag vill minnas att man har ingen eller någon extremt simpel path i cron-job (säkert nån säkerhetsgrej) och which söker nog igenom path:en så då funkar förstås inte det heller.
Jag har iaf märkt att man verkar behöva ange absoluta sökvägar för cron-job för att det ska fungera.
Du har rätt, cron har ett ytterst litet PATH, som vi ser i utmatningen från PHermanssons testkörning (/usr/bin:/bin). Kommandot which letar bara kommandon i de kataloger som räknas upp i PATH.
Så vill man köra saker som inte ligger i katalogerna /usr/bin eller /bin så måste man
antingen ange hela sökvägen till kommandot
eller utöka PATH i det skript som man kör i cron. Bäst är att ange hela sökvägen till kommandot.
Posted: Fri Mar 17, 2023 9:45 am
by gusse02
Alternativt att lägga in en rad överst i sin crontab (mha crontab -e förstås) som anger vilken PATH man vill ha:
PATH=/sbin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11
Se vidare "man 5 crontab".
Posted: Fri Mar 17, 2023 9:45 am
by Jaxån
gusse02 wrote:Alternativt att lägga in en rad överst i sin crontab (mha crontab -e förstås) som anger vilken PATH man vill ha:
PATH=/sbin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11
Se vidare "man 5 crontab".
Varför vill man ha /usr/bin/X11 i den path som programmen får när cron startar dem? De har ju ändå inte någon grafisk terminal att ansluta sig till?
Enklast, med minst potentiella problem är att fixa problemet i de shell-skript (program) som man startar från cron om ändrad PATH behövs. Samt anger fullständiga sökvägen till det program som man startar.
Men din lösning fungerar ju iofs...