Aufgabenplaner läuft jede Minute - Task doppelt?

Status
Für weitere Antworten geschlossen.

ampeer

Benutzer
Mitglied seit
13. Nov 2013
Beiträge
81
Punkte für Reaktionen
1
Punkte
8
Hallo zusammen,

ich habe einen Task im Aufgabenplaner so eingestellt, dass er jede Minute läuft. Das script dahinter macht OCR und das mag auch mal länger als eine Minute auf einer Datei dauern.

Meine Frage ist nun: wenn der erste Task noch mit der OCR Verarbeitung beschäftigt und die Minute ist rum, start der Task Manager dann bereits den nächsten Task, der dann auf der selben Datei arbeitet mit der der erste Task noch beschäftigt ist?

Oder wartet der Task Manager mit der nächsten Ausführung bis die vorherige abgeschlossen ist?

Weiss das zufällig jemand?

VG!
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hallo,

hinter dem Aufgabenplaner befindet sich lediglich ein Cronjob. Dieser führt definierte Tasks einfach aus ohne zu prüfen ob das jeweilige Skript bzw. Aufgabe schon läuft.
Dies müsste man selbst verhindern bzw. berücksichtigen.

--luddi
 

ampeer

Benutzer
Mitglied seit
13. Nov 2013
Beiträge
81
Punkte für Reaktionen
1
Punkte
8
Danke luddi,

das war hilfreich! Das Internet bietet Lösungen bei doppelten Cron Jobs - z.B. eine Lock Datei anlegen. Und genau das mache ich nun in meinem Script und kann damit die doppelte Ausführung verhindern.

Der Anfang des Scripts sieht nun so aus:

FILE=running.lock
if test -f "$FILE"; then
echo "$FILE exist. Exiting"
exit
fi

touch running.lock


Und am Ende kommt noch

rm $FILE

Hier noch zwei Links die ich verwendet habe:
https://bencane.com/2015/09/22/preventing-duplicate-cron-job-executions/
https://linuxize.com/post/bash-check-if-file-exists/

VG!
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.803
Punkte für Reaktionen
3.761
Punkte
468
Dies müsste man selbst verhindern bzw. berücksichtigen.

Dazu habe ich auf die Schnelle folgendes Beispiel gefunden:
Code:
...
PIDFILE=/tmp/`basename $0`.pid
if [ -f $PIDFILE ]; then
  if ps -p `cat $PIDFILE` >/dev/null 2>&1; then
      echo "$0 already running!"
      exit
  fi
fi
echo $$ > $PIDFILE
trap 'rm -f "$PIDFILE" >/dev/null 2>&1' EXIT HUP KILL INT QUIT TERM

# do the work
...

Edit:
Ups, jetzt war ich wohl doch etwas zu lahm.
Der Code hier macht im Grunde das Gleiche wie deiner. Nur wird auch sichergestellt, dass die Flag-Datei auch wieder entfernt wird, wenn der Job mit Fehler abgebrochen oder abgeschossen wird. Das Flag-File würde ich unter /tmp legen.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Mit einem Lock-File / Flag-File ist dies immer noch am einfachsten und am schnellsten erledigt. So hätte auch ich es vorgeschlagen.

Zusätzlich könnte man noch den exit code angeben. Ein exit ohne Parameter ist meines Erachtens nicht sauber bzw. kein schöner Programmierstil.
z.B. bei "already running!" evtl den Code 17 für "File exists" oder ein 125 für "Operation canceled"...
Und erst ganz am Ende des Skript Files ein sauberes exit 0 für "Success" ausführen.

--luddi
 

ampeer

Benutzer
Mitglied seit
13. Nov 2013
Beiträge
81
Punkte für Reaktionen
1
Punkte
8
Danke für eure hilfreichen Kommentare!

Inzwischen habe ich mein Script auch noch ein wenig modifiziert. Der Filename sollte einen absoluten Pfad haben, sonst landet das lockfile sonst wo.

Und dann wollte ich noch eine Email bekommen, wenn das Script etwas tut. Dafür musste ich leider im Erfolgsfall einen Fehler schmeissen (Exit Code > 0). Denn man kann im Aufgabenplaner einstellen, dass man in diesem Fall eine Email bekommt.

Dafür setze ich dann im Aktivitätsfall eine variable found auf 'true' und mache am Ende sowas:
if [ "$found" = 'true' ] ; then
echo Processed at least one file
exit 1
fi


Funzt ausgezeichnet :)

VG!
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Das ist prima wenn du eine Lösung für dich gefunden hast.

Ich persönlich präferiere aber einen Fehlercode zu schmeißen wenn auch ein Fehler tatsächlich vorkommt.
Wenn du auch im Erfolgsfall eine E-Mail vom Aufgabenplaner bekommen möchtest dann setze ein echo am Ende des Skripts vor dem exit 0.
Die Ausgabe des stdout wird umgeleitet bzw. für dich vom Aufgabenplaner gesichert und in den Inhalt der E-Mail umgeleitet.

Einfach am Ende deines Skripts folgendes hinzufügen und das nur wenn alles gut gegangen ist.

Rich (BBCode):
if [ -f $LockFile ]; then
  echo "Task not started because of running previous process."
  exit 125    # Operation canceled
fi

# Call your script here!
# ToDo
[...]

echo "Script successfully executed.
exit 0


EDIT:
Ich muss meine Idee in deinem Fall zurückziehen. Wäre technisch korrekt aber du willst ja dass der Cronjob jede Minute ausgeführt wird. Wenn du jetzt im Erfolgsfall jede Minute eine E-Mail bekommst ist das nicht sinnvoll... :rolleyes::D

--luddi
 
Zuletzt bearbeitet:

ampeer

Benutzer
Mitglied seit
13. Nov 2013
Beiträge
81
Punkte für Reaktionen
1
Punkte
8
Ich muss meine Idee in deinem Fall zurückziehen. Wäre technisch korrekt aber du willst ja dass der Cronjob jede Minute ausgeführt wird. Wenn du jetzt im Erfolgsfall jede Minute eine E-Mail bekommst ist das nicht sinnvoll... :rolleyes::D
--luddi

Genau das war auch erst passiert, als ich die Email eingeschaltet habe :)

Evtl könnte ich ja dafür sorgen, dass das Script keinerlei Ausgabe macht wenn keine Datei verarbeitet wird. Vielleicht wird dann auch keine Mail erzeugt. Probiere ich bei Gelegenheit noch mal aus.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat