Crontab.py nicht aus cron heraus

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Freitag 9. Februar 2018, 16:57

Hallo.
Ich habe wieder mal ein Problem. IcH habe ein Programm in Python geschrieben, mit welchem ich mit dem Modul crontab.CronTab die crontab des jeweiligen Nutzers ändern kann. Klappt auch alles wunderbar, nur kann ich diese .py nicht als cronjob laufen lassen. DaS Programm wird dann nicht ausgeführt.
Kann mir bitte jemand erklären, warum das so ist? Wenn ich übrigens den Header

Code: Alles auswählen

frommen crontab Import CronTab 
und alles was dazugehört weglasse, wird es durch crontab ausgeführt. Kann also ein cronjob, der ein .py ausführt, welches eine crontab ändert, nicht ausgeführt werden? Mit rc.local kann ich das dann übrigens auch nicht ausführen.
__deets__
User
Beiträge: 2841
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 9. Februar 2018, 17:31

Das was du da zeigst ist ja auch komplett falsch. Weder gibt es "frommen" noch gibt es "Import" mit grossem I. Insofern ist das nicht verwunderlich, dass der Python-Interpreter abbricht, wenn du ihm das vorsetzt. Mit crontab hat das aber erstmal nix zu tun.

Das es ein grundsaetzliches Problem geben sollte, eine crontab aus einem cronjob zu modifizieren kann ich mir fast nicht vorstellen. Unter Windows ja, aber unter Linux sollte das eigentlich nicht so sein. Allerdings ist ein selbst-modifizierender Cronjob eher ungewoehnlich, vielleicht erklaeuterst du uns, was du da eigentlich machst, und dann kann man da mehr zu sagen.
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Freitag 9. Februar 2018, 17:36

Ich habe den Beitrag hier mit dem smartphone verfasst . Das sind nur Tippfehler. Ich hab es natürlich richtig eingegeben.
__deets__
User
Beiträge: 2841
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 9. Februar 2018, 18:02

Gut, aber das aendert an meiner Frage nichts: was tust du da genau? Kannst du mal dein Skript posten? So kann man da sonst nicht wirklich was zu sagen. Ausser: logging einbauen, und sicherstellen, das es funktioniert, und auch alle Fehler loggt. Damit du dir das Verhalten bei crontab start anschauen kannst.
nezzcarth
User
Beiträge: 487
Registriert: Samstag 16. April 2011, 12:47

Freitag 9. Februar 2018, 20:01

__deets__ hat geschrieben: Das es ein grundsaetzliches Problem geben sollte, eine crontab aus einem cronjob zu modifizieren kann ich mir fast nicht vorstellen.
Im schlimmsten Fall ist das Verhalten in der Situation nicht spezifiziert (habe ich nicht nachgesehen) und abhängig von der jeweiligen Cron Implementierung. Dann kann es passiert, dass das Skript nach einem Update oder Distributionswechsel nicht mehr funktioniert.

--

Ich habe es jetzt mal mit 'cronie' ausprobiert und das klappt:

Code: Alles auswählen

$ cat /var/spool/cron/benutzer
*/2 19 * * * /home/benutzer/src/crontest/venv/bin/python /home/benutzer/src/crontest/cron_test.py # testjob

Code: Alles auswählen

#!/usr/bin/env python3
from random import randint
from copy import deepcopy
from pathlib import Path
from crontab import CronTab

def main():
    path = Path('/var/spool/cron')
    crontab = CronTab(tabfile=path/'benutzer')
    job = next(crontab.find_comment('testjob'))
    # scheint auch ohne deepcopy richtig zu gehen
    new_job = deepcopy(job)
    new_job.hour.on(randint(0, 24))
    job.delete()
    crontab.append(new_job)
    crontab.write()

if __name__ == '__main__':
    main() 
Wenn das Skript an sich funktioniert, würde ich daher eher tippen, dass es einer der üblichen Fehler im Zusammenhang mit Cronjobs ist (falscher Interpreter, nicht zugängliche libraries, fehlende Brechtigungen, …).

Ansonsten schließe ich mich __deets__ an, und frage mich, weshalb du das brauchst. Ist ja ganz lustig, aber wahrscheinlich gibt es eine bessere Lösung.
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Freitag 9. Februar 2018, 20:46

So, jetzt kann ich auch wieder antworten. Erstmal vielen Dank für die Antworten!
Also, ich habe folgendes vor. Ein Raspberry Pi allein in der Pampa nimmt Messwerte auf, speichert, verarbeitet und sendet mir diese per mail zu. Konfiguriert wird das ganze durch eine Textdatei. Die Messwertaufnahme erfolgt in einem python-Programm, das kann permanent erfolgen und mit vom Benutzer vorgegebenen Abständen (automatischer shutdown und boot sind auch realisiert). Das Gerät kann auch per email "gesteuert" werden . Das funktioniert soweit auch alles. Nun hab ich noch eine letzte Funktion , die ich einbauen möchte, und zwar die einer Status-email. Hier möchte ich aber mich nicht vorher festlegen müssen, wann ich die immer haben möchte, sondern möchte das möglichst variabel halten. Hierbei dachte ich mir, dass ich einen Befehl per mail sende. Das PRogramm das regelmäßig die emails abarbeitet, erkennt, dass auch ein neuer Eintrag für die crontab ist und trägt diese ein. Nun sind aber das Programm das die Messwerte aufnimmt, und dass Programm das die emails überprüft von der crontab aus gestartete Programme.

Eine Alternative wäre wahrscheinlich, dass ich das mit einem Event auf dem threading-Modul realisiere, oder?
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Freitag 9. Februar 2018, 20:58

Ja, hab denselben Code den ich auf dem PI habe auch eben mal auf meinem Ubuntu getestet, und hier funktioniert alles. Kann es also sein, dass das generell auf dem PI nicht funktioniert?
Benutzeravatar
noisefloor
User
Beiträge: 2387
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Freitag 9. Februar 2018, 21:01

Hallo,

für Befehle zur einmaligen Ausführung gibt es unter Linux den Befehl `at`.

Python hat auch das Modul `sched` an Bord, mit dem du zu eine bestimmten Zeit eine Python-Funktion ausführen kannst.

Gruß, noisefloor
nezzcarth
User
Beiträge: 487
Registriert: Samstag 16. April 2011, 12:47

Freitag 9. Februar 2018, 21:10

@stsemant: Ob die Crontab-Datei das mit sich machen lässt, hat -- wenn überhaupt -- wahrscheinlich nichts mit dem RaspberryPi als Gerät zu tun, sondern mit dem verwendeten Betriebssystem und wie es eingerichtet ist (wo was wie mit welchen Berechtigungen installiert/zugänglich ist, etc.). Verwendest du Raspian? In welcher Version?
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Freitag 9. Februar 2018, 21:17

Raspbian Jessie. Wie kann ich rausfinden woran es liegen könnte. Auch wenn ich vielleicht den weg mit sched gehen werde, wäre es ja gut, den Grund dafür zu kennen, warum was nichts funktioniert.
nezzcarth
User
Beiträge: 487
Registriert: Samstag 16. April 2011, 12:47

Samstag 10. Februar 2018, 13:52

Ich habe mein Testscript (s.o.) leicht angepasst auch mal auf Raspbian Jesse lite ausprobiert und das hat, wie vermutet, funktioniert. Insofern solltest du zum Debuggen noch mal die üblichen Dinge im Zusammenhang mit Cron-Jobs ausprobieren. Sind der Pfad zum Python-Interpreter und zum Skript absolut angegeben? Können alle Module gefunden und importiert werden? Stimmen die Berechtigungen an allen Stellen (insb. für Daten, die das Skript lädt)? Bist du sicher, dass das Skript nicht mit einer Fehlermeldung abbricht (z.B. mal Debug-Ausgaben mit Pipes wegspeichern, in eine Datei schreiben, oder von cron mailen lassen) ?
stsemant
User
Beiträge: 31
Registriert: Sonntag 24. Dezember 2017, 13:06

Samstag 10. Februar 2018, 17:13

Ich weiß auch nicht, woran es liegt. Ich hab es ja in allen möglichen Variationen ausprobiert. Hier auf meinem Laptop funktioniert mein Vorhaben ja auch. Egal, habe mich für das Modul schedule entschieden. Da lass ich dann im datenlogger-Programm einfach das run.pending() in der Schleife mitlaufen und fertig :)
Antworten