staging.inyokaproject.org

Cronjob-Steuerung mittels MySQL und SHELL-Script

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

halloICKEbins

Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Mahlzeit,

folgenden Quellcode habe ich:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/bin/bash

function_call-ids() {
 
    # aktuelles Datum und Uhrzeit bestimmen
    date_now_id_[$1]=$(date +%Y-%m-%d_%H:%M:%S_%w)
    # aktuelles Datum und Uhrzeit in Variablen speichern
    date_seconds_[$1]=$(echo ${date_now_id_[${1}]} | cut -d"_" -f2 |  cut -d":" -f3)
    date_minutes_[$1]=$(echo ${date_now_id_[${1}]} | cut -d"_" -f2 |  cut -d":" -f2)
    date_hours_[$1]=$(echo ${date_now_id_[${1}]} | cut -d"_" -f2 | cut -d":" -f1 )
  
    # durch Zeitverzögerungen muss bei den Sekunden minus 1 Sekunde gerechnet werden
    new_date_seconds_[$1]="$(( ${date_seconds_[${1}]}-1 ))"
    if [ "${#new_date_seconds_[${1}]}" = "1" ]; then 
        date_seconds_[$1]="0$(( ${date_seconds_[${1}]}-1 ))"
    else
        date_seconds_[$1]="$(( ${date_seconds_[${1}]}-1 ))"
    fi
  
    # Datenbank auslesen - Zeitinformationen
    mysql_id_entry_[$1]=$(mysql -D 'user' -u 'admin' -p'password' -e "SELECT intervaltime FROM tblname WHERE ID='${1}'" | grep -v 'intervaltime')
    # Datenbank auslesen - Scriptname
    mysql_id_entry2_[$1]=$(mysql -D 'user' -u 'admin' -p'password' -e "SELECT scriptname FROM tblNAME WHERE ID='${1}'" | head -n2 | tail -n1)

    # Werte auslesen und in Variablen speichern 
    date_entry_seconds_[$1]=$(echo ${mysql_id_entry_[${1}]} | cut -d" " -f1)
    date_entry_minutes_[$1]=$(echo ${mysql_id_entry_[${1}]} | cut -d" " -f2)
    date_entry_hours_[$1]=$(echo ${mysql_id_entry_[${1}]} | cut -d" " -f3)

    # Zugriffsvariablen sperren
    entry_check_seconds_[$1]="false";
    entry_check_minutes_[$1]="false";
    entry_check_hours_[$1]="false";
    
    # wenn Variable "*" beinhalten, dann Zugriffsvariable freigeben
    if [ "${date_entry_seconds_[${1}]}" = "*" ]; then entry_check_seconds_[$1]="true"; fi
    if [ "${date_entry_minutes_[${1}]}" = "*" ]; then entry_check_minutes_[$1]="true"; fi
    if [ "${date_entry_hours_[${1}]}" = "*" ]; then entry_check_hours_[$1]="true"; fi

    # wenn erstes Zeichen in Variable "/" und Werte dahinter teilbar(mod), dann Zugriffsvariablen freigeben
    if [ "${date_entry_seconds_[${1}]:0:1}" = "/" ]; then
        if [ "$(( ${date_entry_seconds_[${1}]:1:2} % ${date_seconds_[${1}]} ))" = "0" ]; then entry_check_seconds_[$1]="true"; fi
    fi
 
    if [ "${date_entry_minutes_[${1}]:0:1}" = "/" ]; then
        if [ "$(( ${date_entry_minutes_[${1}]:1:2} % ${date_minutes_[${1}]} ))" = "0" ]; then entry_check_minutes_[$1]="true"; fi
    fi
    
    if [ "${date_entry_hours_[${1}]:0:1}" = "/" ]; then
        if [ "$(( ${date_entry_hours_[${1}]:1:2} % ${date_hours_[${1}]} ))" = "0" ]; then entry_check_hours_[$1]="true"; fi
    fi 
    
    # String anhand von Delimiter trennen (falls vorhanden | falls nicht vorhanden nimmt er immer auch die Zahl)
    for seconds_parts in $(echo "${date_entry_seconds_[${1}]}" | tr "," "\n")
    do
        if [ "${seconds_parts}" = "${date_seconds_[${1}]}" ]; then entry_check_seconds_[$1]="true"; fi
    done

    for minutes_parts in $(echo "${date_entry_minutes_[${1}]}" | tr "," "\n")
    do
        if [ "${minutes_parts}" = "${date_minutes_[${1}]}" ]; then entry_check_minutes_[$1]="true"; fi
    done

    for hours_parts in $(echo "${date_entry_hours_[${1}]}" | tr "," "\n")
    do
        if [ "${hours_parts}" = "${date_hours_[${1}]}" ]; then entry_check_hours_[$1]="true"; fi
    done
  

    if [ "${entry_check_seconds_[${1}]}" = "true" -a "${entry_check_minutes_[${1}]}" = "true" -a "${entry_check_hours_[${1}]}" = "true" ]; then

        echo "${date_now_[${1}]}" >> test.txt
        echo "${mysql_id_entry2_[${1}]}" >> test.txt  
    fi

}

########################################################################################

function_check-status {

    function_call-ids 3 & function_call-ids 4 & function_call-ids 5 & function_call-ids 6 & function_call-ids 7

}

########################################################################################

(sleep 20 && function_check-status) &
(sleep 40 && function_check-status) &
(sleep 60 && function_check-status)

Rufe ich jetzt die "function_call-ids 3" einzeln auf schreibt er mir bei richtig gesetzten Werten (z.B.: * * *) den erwarteten Output in die text.txt ... rufe ich das Konstrukt allerdings über den unteren Block (sleep 20 && function_check-status & ...) auf stimmt das ermittelte aktuelle Datum nicht mehr (ist dann Datum von gestern z.B.)...

Woher kommt das, obwohl die Variablen ja eindeutig sind ??

Ziel des Scriptes ist es übrigens nur noch einen cronjob im crontab zu haben, welches minutlich aufgerufen wird und in Verbindung mit PHP die Steuerung diverser Script (über id und dem hinterlegten Scriptname in DB) und dessen Überwachung zu steuern!

Vielleicht hat ja einer auch einen "cleveren" Ansatz für dieses Problem bzw. den Ansatz der Steuerung von cronjobs!!!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

halloICKEbins schrieb:

folgenden Quellcode habe ich: [...]

Einfacher als die Extraktionsorgien mit cut ist es, direkt die Möglichkeiten von date zu nutzen:

1
2
3
4
5
6
7
8
9
$ now=$(date -Iseconds)
$ echo $now
2017-11-28T16:31:29+01:00
$ hour=$(date -d "$now" +%H)
$ echo $hour
16
$ minute=$(date -d "$now" +%M)
$ echo $minute
31

date kann außerdem auch rechnen (für Deine Zeitverzögerung):

1
2
3
$ date; date -d 'now + 11 seconds'
Tue Nov 28 16:35:50 CET 2017
Tue Nov 28 16:36:01 CET 2017

Rufe ich jetzt die "function_call-ids 3" einzeln auf schreibt er mir bei richtig gesetzten Werten (z.B.: * * *) den erwarteten Output in die text.txt ... rufe ich das Konstrukt allerdings über den unteren Block (sleep 20 && function_check-status & ...) auf stimmt das ermittelte aktuelle Datum nicht mehr (ist dann Datum von gestern z.B.)...

Woher kommt das, obwohl die Variablen ja eindeutig sind ??

Ohne das im Detail zu analysiere hast Du da einige Merkwürdigkeiten:

  • Jede Menge Hintergundprozesse, die ohne Sperre in dieselbe Datei schreiben.

  • Und vor allem sehen diese Hintergrundprozesse nicht die Werte, die die anderen Prozesse in Deine Arrays geschrieben haben!

  • Unübersichtliche Rechnerei mit Daten (s.o.).

Ich vermute der zweite Punkt ist Dein Problem.

Ziel des Scriptes ist es übrigens nur noch einen cronjob im crontab zu haben, welches minutlich aufgerufen wird und in Verbindung mit PHP die Steuerung diverser Script (über id und dem hinterlegten Scriptname in DB) und dessen Überwachung zu steuern!

Vielleicht hat ja einer auch einen "cleveren" Ansatz für dieses Problem bzw. den Ansatz der Steuerung von cronjobs!!!

Ja, cron. Im Ernst, genau dafür ist cron gedacht. Was Du da baust, ist im Zweifel deutlich weniger robust und fehlerträchtiger.

Antworten |