Mehrere Crontabs

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Hallo,
ich bin neu hier und möchte mit mehreren Crontabs verschiedene Relais zu unterschiedlichen Zeiten ansteuern.
Wie richte ich mehrere Crontabs parallel ein wie wie muss letztendlich der Befehl im Crontab lauten um den gpio Port zu schalten?

Bin gespannt auf eure Antworten
Danke
Wolfgang
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Ganz schlau werde ich nicht, was du meinst... :K

aber zB mit crontab -e

Code: Alles auswählen

crontab -e
24     *     *     *     * python /home/pi/dein_script.py &
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Hallo das habe ich schon verstanden. Mit crontab e wird das ja erstellt. Aber ich brauche 4 davon um unabhängig 4 gpio Ports anzusteuern um 4 Relais zu schalten
BlackJack

@skorpionius: Dann trag da halt die vier Programmaufrufe ein. So eine Crontab darf ja nicht nur aus einer Zeile bestehen. Schau Dir mal ``man 5 crontab`` an, da gibt es auch dieses Beispiel:

Code: Alles auswählen

# use /bin/bash to run commands, instead of the default /bin/sh
SHELL=/bin/bash
# mail any output to `paul', no matter whose crontab this is
MAILTO=paul
#
# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"
# Run on every second Saturday of the month
0 4 8-14 * *    test $(date +%u) -eq 6 && echo "2nd Saturday"
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Brauche ich dann hinter die Zeiteinträge

15 14 1 * *

nur den Dateinamen der Datei (z.B. Blau_an.sh) schreiben mit der gpio Port ein Relais schalten kann?

15 14 1 * * sudo Blau_an.sh

?
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Ohne zu wissen wie deine Skripte aussehen, ja.

Code: Alles auswählen

15 14 1 * *  /pafd zu deinem Script/1.sh
15 14 1 * *  /pafd zu deinem Script/2.sh
15 14 1 * *  /pafd zu deinem Script/3.sh
15 14 1 * *  /pafd zu deinem Script/4.sh
Crontab wird schon mit root Rechten ausgeführt, kannst also sudo weglassen
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Danke. Wie starte ich nun den Crontab wie wie kann ich sehen was er aktuell macht?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@skorpionius: die Idee ist ja gerade, dass der Cronjob automatisch gestartet wird, hier also um viertel nach 2 jeweils am ersten Tag im Monat. Die Standardausgabe wird Dir normalerweise als Mail geschickt. Wenn Du das nicht willst, solltest Du sie in eine Datei umleiten. Ob es läuft, siehst Du am besten an irgendwelchen Log-Ausgaben, die Du in eine Datei schreiben läßt.
BlackJack

@lackschuh: Die werden natürlich *nicht* mit root-Rechten ausgeführt, sonst könnte ja *jeder* einfach so Programme mit diesen Rechten ausführen und das ganze Schutzkonzept wäre für'n A****.

@skorpionius: Da brauchst Du nichts starten, das ist ein Daemon, der läuft bereits. Und wenn Du die Datei mit dem `crontab`-Befehl änderst, dann wird die Änderung auch an den Daemon übermittelt.

Der Daemon kann seine Aktivitäten loggen, ob und wohin er das tut hängt vom System und der Konfiguration ab. Und Du kannst mit ``ps`` schauen ob welche von Deinen dort eingetragenen Programmen laufen. Wenn man darüber hinaus mehr wissen will sollte man in seine eigenen Skripte logging einbauen. Zum Beispiel Informationen nach stdout und/oder stderr schreiben und die dann im Eintrag in der crontab in eine Datei umleiten.
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

oh so viele Informationen für einen blutigen Python Anfänger. Muss erst mal sehen wie ich die erstellte Datei wieder öffnen kann zum bearbeiten.
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

ich habe noch gar keine Mail eingerichtet, nur den Pi mit einem Betriebssystem versorgt und mit crontab -e eine Datei erzeugt.
Und was ist ein Dämon?
BlackJack

@skorpionius: Zu Daemon weiss Wikipedia etwas.
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Hallo,
ich habe eine Crontab erstellt, aber sie läuft nicht. Ich bekomme sie aber nicht in das Verzeichnis wo die eigenen Crontabs rein sollen. Also läuft sie auch nicht. Wenn ich die Befehle in die originale Crontab /etc/crontab eintrage funktioniert alles. Geht zwar aber ist ja so nicht gedacht.
Zweite Frage: die Crontab startet sh Dateien die verschiedene GPIO ansteuern. Hier mal der Inhalt:

Code: Alles auswählen

#1/bin/sh
gpio export 23 out
sleep 1 
gpio -g write 23 1

sleep 120

gpio -g write 23 o
sleep 1
gpio export 23 in
#

bei sleep 120 ist der gpio geschaltet das ist ja noch ok. Nur wenn die Einschaltdauer 11 Std sein soll wird das hier eine 5 stellige Zahl.
Geht das eleganter?
Gruß
Wolfgang
Zuletzt geändert von Anonymous am Mittwoch 22. Oktober 2014, 21:44, insgesamt 1-mal geändert.
Grund: Quelltext in Bash-Code-Tags gesetzt.
BlackJack

@skorpionius: Die eigene Crontab sollte man nur über den ``crontab``-Befehl bearbeiten und nicht versuchen die von Hand irgendwo hin zu kopieren.

Das gezeigte Skript hat ein paar Probleme: Die erste Zeile stimmt nicht, da gehört ein ! statt der 1 hinter das #. Und ich bin mir ziemlich sicher das das zweite Schreiben eine 0 (Null) statt eines kleinen o als Argument braucht.

Ich vermute ausserdem das ``gpio`` nicht alles nur mit Benutzerrechten machen kann. Das könnte ein Grund sein warum es in der Crontab des Benutzers nicht funktioniert.

”Eleganter” ginge es in dem Du die Wartezeit ausrechnest. In Verbindung mit Shell-Programmierung von ”elegant” zu sprechen ist IMHO allerdings gewagt. ;-) Ich persönlich würde exlizit die Bash verwenden. Bei ``/bin/sh`` kann man nie so genau wissen was man da eigentlich bekommt.
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Danke BlackJack,
Muss eine neue Crontab Datei im Namen immer mit "Crontab" beginnen also z.B. "crontabzeit" oder kann ich sie einfach "zeit" nennen?
Das ! im Skript habe ich geändert, funktioniert mit beiden Zeichen aber. Das o hatte ich hier nur falsch rein getippt, in der Datei steht die 0.
Ich habe in der crontab mehrere Zeitbefehle

* * * * * pi /home/pi/rotan.sh

kann ich die Ausgabe zusätzlich zum Schaltbefehl in einer Logdatei speichern lassen ? Ich möchte im Nachhinein sehen wann durch crontab welche gpio angesteuert wurden bzw wann welche sh Dateien ausgeführt wurden.

Mit wartezeit ausrechnen meinst du also dass ich die sleep immer in Sekunden eintragen muss oder? Also bei 11 Std 39600

Gruß
Wolfgang
BlackJack

@skorpionius: Crontab-Dateien die man in ``/etc/cron.d/`` ablegt kann man nennen wie man möchte, ansonsten heisst die globale ``/etc/crontab``. Und wie die vom Benutzer braucht Dich nicht zu kümmern denn die bearbeitet man nicht direkt sondern nur über den ``crontab``-Befehl.

Du hast das Skript hier abgetippt? Warum nicht kopiert? Das wäre weniger fehleranfällig und vor allem auch einfacher/schneller.

Wie schon gesagt kann der ``crond`` seine Aktivitäten loggen. Ob das auf Deinem Raspi konfiguriert ist und falls ja wohin der loggt musst Du halt schauen. Auf meinem Laptop landet das beispielsweise in ``/var/log/syslog``. Der Start vom Daemon sieht da zum Beispiel so aus:

Code: Alles auswählen

Oct 23 10:21:01 god cron[1238]: (CRON) STARTUP (fork ok)
Wenn Du spezifischere Informationen aus Deinen Skripten wissen möchtest dann könntest Du das ausgeben lassen und in der Crontab dann die Ausgabe in eine Datei umleiten. Am besten auch die Fehlerausgabe mit umleiten, damit keine Informationen verloren gehen.

Mit ausrechnen meinte ich *im Skript*. Also zum Beispiel eine Konstante definieren die eine Stunde als Sekunden enthält und die dann an der entsprechenden Stelle mit 11 multiplizieren.

Alles völlig ungetestet:

Code: Alles auswählen

#!/bin/bash

readonly SCRIPT_NAME=$(basename "$0")
readonly SCRIPT_PID=$$
readonly HOUR=$((60 * 60))  # One hour in seconds.
readonly SOME_PIN=23

log() {
    local message=$1

    echo "$(date '+%Y-%m-%d %H:%M:%S') $SCRIPT_NAME[$SCRIPT_PID] $message"
}

main() {
    local sleep_hours=11

    log "start and switch pin $SOME_PIN"
    gpio export "$SOME_PIN" out
    sleep 1
    gpio -g write "$SOME_PIN" 1
    

    log "sleep $sleep_hours hours"
    sleep $(($sleep_hours * $HOUR))

    log "switch pin $SOME_PIN"
    gpio -g write "$SOME_PIN" 0
    sleep 1
    gpio export "$SOME_PIN" in
    log 'end'
}

main
Und in der Crontab dann zum Ausführen und Umleiten der Ausgabe(n):

Code: Alles auswählen

* * * * * … /home/pi/scripts/parrot.sh 2>&1 >> /var/log/parrot.log
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Hallo,

wieder eine Anfängerfrage.
Nun habe ich an die gpio Ports eine 4 er Relaikarte geschaltet und daran die Leuchtdioden.
das funktioniert aber nur wenn ich den Skript

#1/bin/sh
gpio export 23 out
sleep 1
gpio -g write 23 1

sleep 120

gpio -g write 23 o
sleep 1
gpio export 23 in
#

kürze in:

#1/bin/sh
gpio export 23 out
sleep 120
gpio export 23 in
#

ansonsten schaltet das Relais mehrmals. In einer 'Anleitung im Netz hatte ich gelesen dass zum Schalten immer ein export und ein write Befehl benötigt wird. Das scheint nicht so oder? Denn das gekürzte Skript funktioniert.
Bin gespannt ob ich falsch oder richtig liege.

Gruß
Wolfgang
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

Direkt eingegeben schaltet das Releais also gleich :

gpio export 22 out Relais schaltet ein
gpio export 22 in Relais fällt wieder ab
BlackJack

@skorpionius: Mit dem Argument ``export`` legt man fest ob ein Pin als Eingang oder als Ausgang geschaltet wird und mit ``write`` ob Strom oder kein Strom auf den Pin gelegt wird. Dazu muss er als Ausgang geschaltet sein. Es kann sein das sich der Treiber/Chip diesen Wert merkt und dadurch das Umschalten zwischen Ein- und Ausgang als ”Schalter” wirkt, gedacht ist das so aber nicht.
skorpionius
User
Beiträge: 17
Registriert: Montag 20. Oktober 2014, 11:43

aber was kann ich tun nur so funktioniert es
Antworten