Wenn ich es als Cronjob ausführe, startet mein Shell-Skript keinen Bildschirm

Wenn ich es als Cronjob ausführe, startet mein Shell-Skript keinen Bildschirm

Bitte schauen Sie sich das folgende einfache Shell-Skript an startCleanup.sh:

#!/bin/sh
screen -d -m -S cleaner /usr/bin/python3 /opt/cleanup.py 

Meine Crontab sieht folgendermaßen aus:

* * * * * /opt/startCleanup.sh > /opt/cleanup.log 2>&1

Wenn ich dieses Skript in der Shell als normal angemeldeter Benutzer ausführe, habe ich keine Probleme. Wenn ich es jedoch als normalen Cronjob ausführe, wird kein Bildschirm gestartet. Oder besser gesagt: Der Bildschirm wird gestartet (glaube ich), aber wenn das Skript beendet ist, wird zusammen mit dem Skript auch der Bildschirm beendet.

Hat jemand eine Idee, wie man dieses Problem lösen kann?

Danke :)

UPDATE: Okay, jetzt weiß ich definitiv, dass der Bildschirm ordnungsgemäß ausgeführt wird (das habe ich überprüft, indem ich am Ende des Bash-Skripts einen Sleep-Befehl hinzugefügt habe).

Folgendes passiert also: Der Bildschirm wird erstellt. ABER wenn das Bash-Skript beendet ist, wird auch der Bildschirm beendet. Der Bildschirm hängt also immer noch vom Skript ab.

Wie kann ich verhindern, dass der Bildschirm beendet wird, wenn das Skript beendet ist?

Antwort1

haben Sie stattdessen so etwas versucht?

#!/bin/sh
screen -D -R cleaner /usr/bin/python3 /opt/cleanup.py

Diese Parameterkombination versucht gemäß der Manpage, eine Sitzung erneut zu verbinden, wenn sie existiert, bzw. eine Sitzung zu erstellen, wenn dies nicht der Fall ist.

Außerdem glaube ich nicht, dass irgendeine Ausgabe in die Datei umgeleitet wird, abgesehen von etwaigen Fehlern, die beim Aufrufen des Bildschirms auftreten.

Antwort2

tatsächlich scheint es nicht viel Sinn zu machen, hier screen zu verwenden. Aber ich habe Ihre Lösung auf meiner Box überprüft und sie funktioniert einwandfrei. Die Screen-Sitzung wird von einem Skript gestartet, das von Cronjob gestartet wurde, und ich kann mich daran anhängen. Probieren Sie ein paar Dinge aus:

  1. vollständigen Pfad zum Bildschirm im Skript startCleanup.sh hinzufügen
  2. Beobachten Sie /var/log/cron, ob Jobs überhaupt gestartet werden
  3. Leiten Sie die Ausgabe von /usr/bin/python3 /opt/cleanup.py in eine Datei um und prüfen Sie, ob sie beim Start über cron einwandfrei ausgeführt wird.

Antwort3

ich stehe vor einem ähnlichen Problem wie Sie. Das manuelle Auslösen der SH-Datei ist völlig in Ordnung. Aber im Cronjob wird der Screen-Prozess nicht ausgeführt. Dies ist mein Originalcode der SH-Datei.

#!/bin/bash
bash -c "python GetCookie.py"
wait

export DISPLAY=:0
Respond=`screen -ls`

if [[ $Respond != *"UploadImage"* ]]; then

    screen -dmS myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"

else
    echo "NOPEEEE"
fi

Das Cronjob-Protokoll zeigte, dass der Job ausgelöst wurde. Aber inBildschirm -lszeigt keinen laufenden Prozess.

was ich getan habe, war, mich zu ändern

screen -dmS myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"

Zu

screen -d -m -S myAction bash -c " cd ~/DirectoryName ; /usr/bin/php7.4 index.php bag 1"

und mein Problem gelöst.

verwandte Informationen