Crontab und Skript-Ordner

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
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Hallo zusammen,

ich habe folgendes Problem. Ich habe folgende Struktur:

App
\- delete_contacts.py
\- app-api.py

Im Ordner 'App' liegen zwei Python-Dateien, 'app-api.py' führt hierbei URL-Post-Requests an einen Webserver mittels JSON durch und liefert die Werte an die aufrufende Stelle in 'delete_contacts.py' zurück, wo die Daten weiter verarbeitet werden.

Soweit funktioniert alles, sofern ich 'delete_contacts.py' händisch aufrufe. Mittels crontab funktioniert das leider noch nicht ganz, dazu folgender Eintrag in crontab -e:

Code: Alles auswählen

* * * * * /usr/bin/python3 /home/user/App/delete_contacts.py >> /var/log/app.log 2> /var/log/app-error.log
Das Skript soll zunächst mal zu Testzwecken jede Minute aufgerufen werden, auch das läuft anstandslos, allerdings sehe ich im app-error-log folgenden Traceback:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/user/App/delete_contacts.py", line 7, in <module>
    response = obj.get_all_contacts()
  File "/home/user/App/app-api.py", line 25, in get_all_contacts
    req = requests.post(self.url+"contacts/all", headers=self.headers).json()
  File "/usr/lib/python3/dist-packages/requests/models.py", line 808, in json
    return complexjson.loads(self.text, **kwargs)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Beide Skripte gehören dem Benutzer, haben eine entsprechende Shebang und sind zusätzlich ausführbar. Ich habe das ganze Analog nochmal mit einfachen Skripten nachgestellt um zu schauen, ob ich einen Fehler in crontab oder bei den Pfaden / Rechtevergabe gemacht hätte - scheint aber nicht der Fall zu sein.

Der API-Call liefert den Wert der Daten nicht sofort zurück, kann es sein dass Crontab hier sturr durchfetzt ohne auf das zweite Skript "zu warten"? Oder liegt das Problem anderswo?

Vielen dank für die Hilfe im Voraus.

Mfg,

sls
When we say computer, we mean the electronic computer.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@sls: der POST-Request liefern keine Json-Daten. Cron-Jobs rufen keine /etc/profile oder bashrc auf, dass einige Environment-Variablen nicht gesetzt werden. Benutzt Du einen Proxy?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Sirius3 hat geschrieben:Cron-Jobs rufen keine /etc/profile oder bashrc auf, dass einige Environment-Variablen nicht gesetzt werden.
Ok, dann liegt da wohl der/ein Fehler, ich habe zwei Umgebungs-Variablen gesetzt (Token und ID zur Authentifizierung an der Webressource) welche ich mittels os.environ.get() in das Python-Skript einbinde.

Sirius3 hat geschrieben:Benutzt Du einen Proxy?
Nein.
When we say computer, we mean the electronic computer.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Sorry wegen Doppelpost, aber irgendwie kann ich den letzten Beitrag nicht mehr editieren.

Jedenfalls konnte ich das Problem nun beheben, dazu musste ich einfach den crontab anpassen und die source für das .bashrc-file angeben, da crontab selbst keine interaktive Shell ist:

Code: Alles auswählen

* * * * * . /home/user/.bashrc; /usr/bin/python3 /home/user/App/delete_contacts.py >> /var/log/app.log 2> /var/log/app-error.log
Danke Sirius3 für den entscheidenden Hinweis!
When we say computer, we mean the electronic computer.
Antworten