Automatisera med Cron och Bash

Moderator: Telldus

Post Reply
PHermansson
Posts: 27
Joined: Thu Jan 18, 2018 11:08 am
Contact:

Automatisera med Cron och Bash

Post by PHermansson » Thu Jan 18, 2018 11:08 am

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: 2242
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Post by micke.prag » Thu Jan 18, 2018 11:08 am

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: Thu Jan 18, 2018 11:08 am
Contact:

Post by PHermansson » Thu Jan 18, 2018 11:08 am

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: 2242
Joined: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Post by micke.prag » Thu Jan 18, 2018 11:08 am

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: Thu Jan 18, 2018 11:08 am
Contact:

Post by PHermansson » Thu Jan 18, 2018 11:08 am

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: Thu Jan 18, 2018 11:08 am
Location: Lund
Contact:

Post by adent » Thu Jan 18, 2018 11:08 am

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: 185
Joined: Thu Jan 18, 2018 11:08 am

Post by Jaxån » Thu Jan 18, 2018 11:08 am

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.
Använder inte MSN eller ICQ. Bara XMPP (Jabber): anders.jackson@astrakan.hig.se

gusse02
Posts: 4
Joined: Thu Jan 18, 2018 11:08 am

Post by gusse02 » Thu Jan 18, 2018 11:08 am

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: 185
Joined: Thu Jan 18, 2018 11:08 am

Post by Jaxån » Thu Jan 18, 2018 11:08 am

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...
Använder inte MSN eller ICQ. Bara XMPP (Jabber): anders.jackson@astrakan.hig.se

Post Reply