[linux - raspbian] perl script uitvoeren bij boot

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
ik heb hier een klein perl script geschreven dat de status van de gpio op m'n raspberry pi uitleest en bij wijziging dit wegschrijft in een mysql database

ik kan het script eenvoudig starten van de commandline door volgend commando:
code:
1
nohup perl wp_status.pl privaat &

op die manier blijft het draaien als de ssh client gesloten wordt.
Nu zou ik het script graag automatisch laten starten met de pi. Ik heb hiervoor reeds geprobeerd via de /etc/rc.local en onderaan (net voor exit 0) volgende bij te voegen:

code:
1
(sleep 10; nohup perl wp_status.pl privaat)&


Dit zonder resultaat echter...script start niet.

Vervolgens dacht ik het in de reboot cron te proberen, deze keer met de nodige paden volledig erbij:
code:
1
@reboot nohup /usr/bin/perl /root/datalezen/wp_status.pl boven &

Hiermee start het script wel op (is te zien bij ps -agx), maar werk het aanroepen van de gpio (wiringpi) niet...

hier ook het perl scriptje
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/perl
#
# Promy 2013
# uitlezen van de sensoren van de pompen van de vloerverwarming
# de pompen zijn aangesloten via relais aan de gpio pinnen:
# privaat beneden: wiringpi pin 17 - P5 pin 3 - BCM GPIO 28
# privaat boven: wiringpi pin 18 - P5 pin 4 - BCM GPIO 29
# praktijk : wiringpi pin 19 - P5 pin 5 - BCM GPIO 30
#
# via de parameter bepalen we welke pomp er moet uitgelezen worden
# de mogelijkheden zijn privaat - boven - praktijk
#dit is het script voor privaat beneden
use Switch;
#algemene variabelen bepalen aan de hand van de parameter

switch($ARGV[0]) {
    case "privaat" {$pinnr = 17; $tabel = 'pomp_privaat';}
    case "boven" {$pinnr = 18; $tabel = 'pomp_boven';}
    case "praktijk" {$pinnr = 19; $tabel = 'pomp_praktijk';}
    else { print "foutieve input. Kies uit privaat - boven - praktijk"; exit 0;}
}
#start script
#initialiseren van de pin
$uitv0 = 'gpio mode '.$pinnr.' in';
system($uitv0);
#basis zetten van de status , dit om foutieve interrupts niet in de database te krijgen
#dit houdt nog geen rekening met de laatste input in de database. Dus daar is een mogelijkheid tot fouten.
$status0 = `gpio read $pinnr`;



#continue loop
while (true) {
    #de wfi optie stopt het script tot er een interrupt langskomt
    $uitv1 = 'gpio wfi '.$pinnr.' both';
    system($uitv1);

    #uitlezen van de status - 0 als niet actief - 1 als actief
    $status = `gpio read $pinnr`;
    if ($status0 != $status){ # de status is effectief veranderd, het was geen glitch
        if ($status == 1){$status0 = 1;} else {$status0 = 0;} #zo doen om eventuele pointer problemen te voorkomen.
        #nu in mysql database steken
        $jan = 'mysql  -uroot -pPASSWORD statussen -e "INSERT into '.$tabel.'(datumtijd,status) values (NOW(),'.$status.')"';
        #uitvoeren van het mysql commando
        system($jan);
    }   
}


Kan er me iemand verduidelijken waar ik fout ga? (en hoe ik het kan werkend krijgen?) _/-\o_

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 03-10 18:55

Kees

Serveradmin / BOFH / DoC
heeft hij wel de juiste PATH variable?

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Promy
  • Registratie: Oktober 2002
  • Laatst online: 28-09 21:21
@Kees: het script werkt zonder probleem vanaf de command line van een geboot systeem. ik vermoed dus dat de path variable ok is? Is er een manier om dit na te gaan, of het path tijdens opstarten is gekend?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 23:03

Hero of Time

Moderator LNX

There is only one Legend

Je PATH is altijd in orde als je 't handmatig uitvoert, want daar schrijf je 't ook voor. Echter is er tijdens boot een hele andere omgeving bekend. Perl staat bijvoorbeeld in /usr/bin, maar als /usr/bin niet in $PATH staat bij boot, dan houd 't al snel op. Een volledig pad opgeven om uit te voeren is dan noodzakelijk.

Om te weten wat je variabelen zijn tijdens boot, laat je 't een script uitvoeren dat niets anders doet dan de uitvoer van 'env' naar een bestand schrijven. In /etc/rc.local kan je dus het volgende zetten:
env > /tmp/bootvariables

En dan kijk je in /tmp/bootvariables voor wat er gedefinieerd is.

Commandline FTW | Tweakt met mate