Shell-Script startet über cronjob, Inhalte (python) werden nicht ausgeführt.

smint86

Cadet 1st Year
Registriert
Nov. 2013
Beiträge
15
Hallo zusammen. Vorweg: Ich bin kein Programmierer, bei mir ist alles learning by doing. Es kann also sein, dass ich eine total banale Sache übersehen habe. Ich sitze jetzt allerdings schon über vier Stunden an dem Problem, habe zig Tutorials gelesen und alles probiert, was mir eingefallen ist. Ich weiß einfach nicht weiter. Mein Problem ist folgendes:

Ich möchte ein Shell-Script über einen cronjob starten. Mein Betriebssystem ist Debian 8 und läuft auf einem vServer. Das Script sieht so aus: http://paste.ofcode.org/33QerpPMuqCM2qYtA6yUdth

Es liegt im Ordner /home/, "chmod +x" habe ich ausgeführt. Wenn ich das Skript mit ./start_map.sh manuell starte, tut es genau was es soll. Die Screen-Instanzen werden ausgeführt, ich kann sie mir mit "screen -ls" anzeigen lassen und darauf zugreifen.

Ich möchte dieses Script nun täglich zu einem bestimmten Zeitpunkt starten und zu einem anderen Zeitpunkt die Screens beenden. Zweiteres funktioniert ohne Probleme. Die Screens sollen immer um 02:00 Uhr nachts geschlossen werden, dafür habe ich
Code:
0 2 * * * pkill screen
unter "crontab -e" eingetragen.

Um das Script zu starten habe ich folgende Befehle probiert (jeweils immer nur ein Befehl, nicht beide gleichzeitig):
Code:
0 10 * * * /home/start_map.sh
0 10 * * * /bin/sh /home/start_map.sh
Schon der erste der beiden Befehle tut meiner Meinung nach, was er soll. Ich habe das überprüft, indem ich
Code:
0 10 * * * /home/start_map.sh >> /var/log/start_map.log 2>&1
hinzugefügt habe. Das Logfile zeigt folgenden Inhalt:
Starting workers...
Waiting 5 seconds
Starting next worker
Waiting 5 seconds
...
All workers started
Somit scheint es bei der grundsätzlichen Ausführung des Scriptes zunächst keine Probleme zu geben. Jedoch zeigt mir "screen -ls" keinen einzigen Screen an. Das Script scheint also zwar ausgeführt zu werden, jedoch werden die "screen"-Befehle entweder nicht beachtet oder es liegt ein anderes Problem vor.

Leider hat mir auch intensive Recherche dabei nicht helfen können. Hat hier jemand eine Idee?
 
Zuletzt bearbeitet:
die ursache für das problem sehe ich auf die schnelle auch nicht, aber bist du denn auf screen angewiesen? du könntest die python prozesse ja auch mit "&" in den hintergrund schicken, falls du mit screen nur mehrere lang laufende prozesse haben wolltest:

Code:
python /root/PoGo-Map/runserver.py -ns -speed -sn @smint86_RombergZoo ... &

edit:
als welcher user hast du "crontab -e" gemacht? wenns ein normaler user (nicht "root") war dann hast du keinen zugriff auf deine python scripte in "/root".
 
Zuletzt bearbeitet:
0x8100 schrieb:
die ursache für das problem sehe ich auf die schnelle auch nicht, aber bist du denn auf screen angewiesen? du könntest die python prozesse ja auch mit "&" in den hintergrund schicken, falls du mit screen nur mehrere lang laufende prozesse haben wolltest:

Code:
python /root/PoGo-Map/runserver.py -ns -speed -sn @smint86_RombergZoo ... &

edit:
als welcher user hast du "crontab -e" gemacht? wenns ein normaler user (nicht "root") war dann hast du keinen zugriff auf deine python scripte in "/root".

Grundsätzlich finde ich screen insofern eine gute Lösung, als dass ich immer mal wieder in dein einzelnen Instanzen reinschauen muss. Es wird eine große Menge an Statustext ausgegeben, den ich regelmäßig überprüfen muss. "crontab -e" habe ich als root ausgeführt. Ich bin die ganze Zeit als root auf dem Server angemeldet, da ich ihn aktuell nur für diese eine Aufgabe nutze.

/edit:
Ich habe jetzt das Starten im Hintergrund ausprobert und einfach eine Instanz manuell in der Shell gestartet. Trotz der Verlagerung des Prozesses in den Hintergrund wird der Statustext dauerhaft ausgegeben, was unpraktikabel ist. Es sind teilweise mehrere Zeilen pro Sekunde.

Tumbleweed schrieb:
Versuch es mal mit /usr/bin/screen in deinem Shell-Skript.

Leider ist auch das ohne Erfolg geblieben. Ich habe "screen" durch "/usr/bin/screen" ersetzt, als das nicht geholfen hat habe ich zusätzlich noch "python" durch "/usr/bin/python" ersetzt. Auch das blieb ohne Erfolg. Nur um alles auszuschließen, habe ich dann die Änderung bei "screen" wieder zurückgenommen - auch keine Lösung.

Ich habe als Workaround probiert, die einzelnen Befehle direkt in crontab einzufügen, also so:
Code:
45 8 * * * screen -A -m -d -S Cityscan_01 python /root/PoGo-Map/runserver.py [...]

In der cron.log wird mir auch folgende Ausgabe angezeigt (jeweils von drei verschieden formatierten Versuchen):
Code:
Dec 23 08:54:01 v30312 CRON[27856]: (root) CMD (screen -A -m -d -S Cityscan_01 python /root/PoGo-Map/runserver.py [...])
Dec 23 08:56:01 v30312 CRON[27875]: (root) CMD (/usr/bin/screen -A -m -d -S Cityscan_01 /usr/bin/python /root/PoGo-Map/runserver.py [...])
Dec 23 08:57:01 v30312 CRON[27893]: (root) CMD (/usr/bin/screen -A -m -d -S Cityscan_01 python /root/PoGo-Map/runserver.py [...])

Jedes mal zeigt mir "screen -ls" jedoch "No Sockets found in /var/run/screen/S-root". Also scheint es noch nicht mal am Skript selbst zu liegen, sondern cron möchte einfach keine screens starten? Selbst das direkte Starten von python aus crontab klappt nicht.

//edit

Könnte es etwas mit eviroment-Variablen zu tun haben? Weitere Stunden googlen haben mich u. a. auf diesen Thread gestoßen: http://unix.stackexchange.com/quest...command-with-existing-environmental-variables

Den Cronjob in
Code:
0 14 * * * . ~/.profile; screen -AmdS Scan python runserver.py [...]
zu ändern hat aber leider auch nicht geholfen. Cron führt die Befehle ja mit /bin/sh als Shell aus, mein Script ist ja auch darauf ausgelegt. Das Script funktioniert ja auch problemlos, wenn ich es als root ausführe. Nur wenn cron es ausführt, will es nicht. Auch wenn cron selbst probiert die screens direkt zu starten, führt das zu keinem Ergebnis.
 
Zuletzt bearbeitet:
Zurück
Oben