Automatisera med Cron och Bash

Moderator: Telldus

Post Reply
PHermansson
Posts: 27
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Automatisera med Cron och Bash

Post 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... :roll:
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post 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:

Code: Select all

 echo `date` > /tmp/lastrun 
Så ser du om scriptet verkligen körs
Micke Prag
Software
Telldus Technologies
PHermansson
Posts: 27
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post 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:

Code: Select all

echo `ifconfig` > /tmp/network
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 :roll: :roll:
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Vilken distrubution kör du?

Kan det vara så att crons PATH inte innehåller t.ex. /sbin.
Testa isåfall:

Code: Select all

 echo $PATH >> /tmp/lastrun 
Micke Prag
Software
Telldus Technologies
PHermansson
Posts: 27
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post 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...
adent
Posts: 5
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post 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.
Jaxån
Posts: 199
Joined: Fri Mar 17, 2023 9:45 am

Post 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.
gusse02
Posts: 4
Joined: Fri Mar 17, 2023 9:45 am

Post 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".
Jaxån
Posts: 199
Joined: Fri Mar 17, 2023 9:45 am

Post 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...
Post Reply