Tron0070
Anmeldungsdatum: 22. März 2010
Beiträge: 195
Wohnort: Chemnitz
|
Hallo, ich habe hier ein kleinen skript "ip-log" erstellt das beim Systemstart und jede Stunde ausgeführt wird. Bei einem Test ohne Internetverbindung oder falsche www.adresse wird das Skript solange neu gestartet bis "checkip.dyndns.org" erreichbar ist. Problem: Es werden nicht Erreichbarkeit zu viele Prozesse gestartet.
hat dann mehr als 1000 Einträge. Weiß einer was ich da machen kann und hat vielleicht auch eine Erklärung. Gruß Tron 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 | #!/bin/bash
#set -x
clear
index_html=jdAtULutCSszqGrHLrEER5TgthydVz
echo "hole checkip.dyndns.org"
if wget -q -O $index_html checkip.dyndns.org ; then
log_datei=~/Dokumente/ip-log
current_IP=$(cat $index_html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
zeit=`date +"%a %d.%b.%Y - %H:%M:%S"`
datum=`date +"%a %d.%b.%Y"`
last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |tail -n1)
last_date=$(cat $log_datei |tail -n1 | cut -d" " -f2,3)
if [ "$datum" != "$last_date" ] ; then
echo >> $log_datei
fi
if [ "$current_IP" != "$last_IP" ] ; then
echo -e "$current_IP -- $zeit" >> $log_datei
echo -e "$current_IP -- $zeit"
else
echo -e "^^^^^^^^^^^^ -- $zeit" >> $log_datei
fi
rm $index_html
else
ip-log #${0##*/}
#ps -C ip-log -exec echo pid {}
#pkill -e ip-log
#rm $index_html
#exit
fi
#echo $datum
#echo $last_date
#echo $last_date
#cat $log_datei |tail -n1
#rm index.html
#grep $(date +"%a %d %m %y") ip-log
#cat $log_datei |tail -n1 | cut -d" " -f3
#current_IP=$(wget http://checkip.dyndns.org/ -q -O - | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')
#rm index.html;wget -q checkip.dyndns.org ;cat index.html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Pack den Teil, den Du wiederholen willst, in eine Funktion und ruf stattdessen aus dem Skript nur die Funktion (erneut) auf. Und pack ein sleep N davor, so dass N Sekunden gewartet wird, bevor Du es erneut versuchst.
|
Tron0070
(Themenstarter)
Anmeldungsdatum: 22. März 2010
Beiträge: 195
Wohnort: Chemnitz
|
Danke. Das mit sleep N funktioniert ganz gut. Die Prozessanzahl wächst jedenfalls sehr sehr viel geringer. Gibt es auch eine Möglichkeit bei dem die Prozessanzahl gar nicht wächst. Falls es mal dazu kommt, dass das Skript über mehrere Tage keine Verbindung hat und die Prozesse dann zu viel werden.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Das verhindert nicht der Tip mit der Funktion?
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1140
Wohnort: Schäl Sick
|
Tron0070 schrieb: Gibt es auch eine Möglichkeit bei dem die Prozessanzahl gar nicht wächst. Falls es mal dazu kommt, dass das Skript über mehrere Tage keine Verbindung hat und die Prozesse dann zu viel werden.
Hast du den Tipp mit den Funktionen, den dir user unknown gab, denn schon ausprobiert? Das sollte dein Problem eigentlich lösen. Edit: zu langsam gewesen. nochmal Edit: Wenn ich das richtig verstanden habe, soll das Skript im Erfolgsfall nur alle Stunden wiederholt werden, bei Misserfolg dagegen ständig. Da wäre es mMn sinnvoller, den Stundenrhythmus ebenfalls unmittelbar im Skript mit
sleep 1h und anschließendem Aufruf der Funktion zu regeln. Per Cronjob braucht das Skript dann nur noch beim Hochfahren gestartet zu werden.
|
Tron0070
(Themenstarter)
Anmeldungsdatum: 22. März 2010
Beiträge: 195
Wohnort: Chemnitz
|
Also den Tipp mit den Funktionen, von user unknown habe ich versucht umzusetzen. Doch leider scheitere ich bei der Umsetzung. Funktionen sind für mich Neuland und bei meinen Versuchen kam entweder Fehler oder keine Veränderung. Ausgangs Skript:
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 | #!/bin/bash
#set -x
clear
index_html=jdAtULutCSszqGrHLrEER5TgthydVz
echo "hole checkip.dyndns.org"
if wget -q -O $index_html checkip.dyndns.org ; then
log_datei=~/Dokumente/ip-log
current_IP=$(cat $index_html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
zeit=`date +"%a %d.%b.%Y - %H:%M:%S"`
datum=`date +"%a %d.%b.%Y"`
last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |tail -n1)
last_date=$(cat $log_datei |tail -n1 | cut -d" " -f2,3)
if [ "$datum" != "$last_date" ] ; then
echo >> $log_datei
fi
if [ "$current_IP" != "$last_IP" ] ; then
echo -e "$current_IP -- $zeit" >> $log_datei
echo -e "$current_IP -- $zeit"
else
echo -e "^^^^^^^^^^^^ -- $zeit" >> $log_datei
fi
rm $index_html
else
ip-log
fi
|
Mit eingefügter Funktion:
Ich bekomme zwar bei aktiver Verbindung eine erfüllte Bedingung und bei getrennter Verbindung eine nicht erfüllte Bedingung aber durch Programm neu Start gehen die Prozessanzahl wieder hoch und bei Aufruf der Funktion beendet sich das Skript. 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 | #!/bin/bash
#set -x
clear
index_html=jdAtULutCSszqGrHLrEER5TgthydVz
echo "hole checkip.dyndns00.org"
check_ip() {
wget -q -O $index_html checkip.dyndns00.org
}
#dateigr=$(dir |grep -c $index_html)
#dateigr=$(ls -l $index_html | awk '{ print $5 }')
#dateigr=104
schreiben() {
log_datei=~/Dokumente/ip-log
current_IP=$(cat $index_html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
zeit=`date +"%a %d.%b.%Y - %H:%M:%S"`
datum=`date +"%a %d.%b.%Y"`
last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |tail -n1)
last_date=$(cat $log_datei |tail -n1 | cut -d" " -f2,3)
if [ "$datum" != "$last_date" ] ; then
echo >> $log_datei
fi
if [ "$current_IP" != "$last_IP" ] ; then
echo -e "$current_IP -- $zeit" >> $log_datei
echo -e "$current_IP -- $zeit"
else
echo -e "^^^^^^^^^^^^ -- $zeit" >> $log_datei
fi
}
#if wget -q -O $index_html checkip.dyndns00.org ; then
#if [ $dateigr -eq 0 ] ; then
if check_ip ; then
echo "erfüllt"
#rm $index_html
else
sleep 1
#${0##*/} # Programm Neustart
check_ip # Funktion Wiederholung
echo "nicht erfüllt"
fi
|
WinXP to Edgy schrieb: Wenn ich das richtig verstanden habe, soll das Skript im Erfolgsfall nur alle Stunden wiederholt werden, bei Misserfolg dagegen ständig.
Ja genau so soll es sein. Bis jetzt regel ich das noch mit 2 Cronjobs. Deine Variante hört sich gut an und wenn das Skript richtig läuft, werde ich es mit sleep 1h versuchen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Tron0070 schrieb: Also den Tipp mit den Funktionen, von user unknown habe ich versucht umzusetzen. Doch leider scheitere ich bei der Umsetzung. Funktionen sind für mich Neuland und bei meinen Versuchen kam entweder Fehler oder keine Veränderung.
Funktionen sind keine Goto-Statements, d.h. statt des Funktionsnamens wird nur der Block, der die Funktion ausmacht, ausgeführt, nicht aber Code dahinter. Ich bin in Eile u. kann das nur überfliegen, aber schreiben () wird gar nicht aufgerufen, soweit ich sehe.
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 | #!/bin/bash
#set -x
clear
index_html=jdAtULutCSszqGrHLrEER5TgthydVz
echo "hole checkip.dyndns00.org"
check_ip() {
wget -q -O $index_html checkip.dyndns00.org
}
schreiben() {
log_datei=~/Dokumente/ip-log
current_IP=$(cat $index_html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
zeit=`date +"%a %d.%b.%Y - %H:%M:%S"`
datum=`date +"%a %d.%b.%Y"`
last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |tail -n1)
last_date=$(cat $log_datei |tail -n1 | cut -d" " -f2,3)
if [ "$datum" != "$last_date" ] ; then
echo >> $log_datei
fi
if [ "$current_IP" != "$last_IP" ] ; then
echo -e "$current_IP -- $zeit" >> $log_datei
echo -e "$current_IP -- $zeit"
else
echo -e "^^^^^^^^^^^^ -- $zeit" >> $log_datei
fi
}
#if wget -q -O $index_html checkip.dyndns00.org ; then
#if [ $dateigr -eq 0 ] ; then
if check_ip ; then
echo "erfüllt"
else
sleep 1
check_ip # Funktion Wiederholung
echo "nicht erfüllt"
fi
|
So habe ich es mir gedacht:
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 | #!/bin/bash
#set -x
clear
index_html=jdAtULutCSszqGrHLrEER5TgthydVz
echo "hole checkip.dyndns00.org"
check_ip() {
wget -q -O $index_html checkip.dyndns00.org
}
schreiben() {
log_datei=~/Dokumente/ip-log
current_IP=$(cat $index_html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
zeit=`date +"%a %d.%b.%Y - %H:%M:%S"`
datum=`date +"%a %d.%b.%Y"`
last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |tail -n1)
last_date=$(cat $log_datei |tail -n1 | cut -d" " -f2,3)
if [ "$datum" != "$last_date" ] ; then
echo >> $log_datei
fi
if [ "$current_IP" != "$last_IP" ] ; then
echo -e "$current_IP -- $zeit" >> $log_datei
echo -e "$current_IP -- $zeit"
else
echo -e "^^^^^^^^^^^^ -- $zeit" >> $log_datei
fi
if check_ip ; then
echo "erfüllt"
else
sleep 1
schreiben # Funktion Wiederholung
echo "nicht erfüllt"
fi
}
schreiben
|
(aber alles in großer Eile).
|
Tron0070
(Themenstarter)
Anmeldungsdatum: 22. März 2010
Beiträge: 195
Wohnort: Chemnitz
|
user unknown schrieb: aber schreiben () wird gar nicht aufgerufen, soweit ich sehe.
Ja das habe erst mal raus genommen da schreiben bei aktiver Verbindung funktioniert und ich habe da nur ein "echo erfüllt" rein geschrieben habe. Es muss auch schreiben bei "echo erfüllt" rein und check_ip bei "echo nicht_erfüllt" Also umgedreht als in deinem bsp.? Und ich dachte die Klammer aus Zeile 37 müsste in Zeile 29 aus deinem bsp. gesehen, da die Funktion check_ip() nicht in die Funktion schreiben() kommt oder? | if check_ip ; then
echo "erfüllt"
schreiben # Seite erreichbar, Schreibe IP-Adresse in Datei
else
sleep 1
check_ip # Seite nicht erreichbar, Funktion Wiederholung
echo "nicht erfüllt"
fi
|
Aber egal wie ich es drehe, die Funktion wird nicht wiederholt wenn die Seite nicht erreichbar ist. Zum testen habe ich ein falsche Adresse eingetragen, damit ich nicht immer die Netzwerkverbindung unterbrechen muss.
|
Tron0070
(Themenstarter)
Anmeldungsdatum: 22. März 2010
Beiträge: 195
Wohnort: Chemnitz
|
Ich denke, dass es so jetzt funktioniert. Das Skript startet bei Misserfolg ständig mit nur einem Prozess und bei Erfolg schreibt es die IP in die Log-Datei. War eigentlich gar nicht so schwer wenn man das mit der Funktion erst mal verstanden hat. Vielen Dank user unknown und WinXP to Edgy 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 | #!/bin/bash
# (c) GPLv4 Tron0070
#set -x
check_ip() {
clear
index_html=jdAtULutCSszqGrHLrEER5TgthydVz
if `wget -q -O $index_html checkip.dyndns.org` ; then
schreiben
else
sleep 5
check_ip
fi
}
schreiben() {
log_datei=~/Dokumente/ip-log
current_IP=$(cat $index_html |sed -e 's/.*Current IP Address: //' -e 's/<.*$//')
zeit=`date +"%a %d.%b.%Y - %H:%M:%S"`
datum=`date +"%a %d.%b.%Y"`
#last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |tail -n1) # liest in letzte Zeile der Log
#last_date=$(cat $log_datei |tail -n1 | cut -d" " -f2,3) # liest in letzte Zeile der Log
last_IP=$(cat $log_datei | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' |head -n 1) # liest in erste Zeile der Log
last_date=$(cat $log_datei |head -n 1 | cut -d" " -f2,3) # liest in erste Zeile der Log
if [ "$datum" != "$last_date" ] ; then
echo >> $log_datei
fi
if [ "$current_IP" != "$last_IP" ] ; then
sed -i "1i$current_IP -- $zeit" $log_datei # schreibt in erste Zeile der Log
#echo -e "$current_IP -- $zeit" >> $log_datei # schreibt in letzte Zeile der Log
#echo -e "$current_IP -- $zeit"
else
sed -i "1i^^^^^^^^^^^^ -- $zeit" $log_datei # schreibt in erste Zeile der Log
#echo -e "^^^^^^^^^^^^ -- $zeit" >> $log_datei # schreibt in letzte Zeile der Log
fi
rm $index_html
#sleep 1h
#check_ip
}
check_ip
|
Edit: WinXP to Edgy schrieb:
sleep 1h und anschließendem Aufruf der Funktion zu regeln. Per Cronjob braucht das Skript dann nur noch beim Hochfahren gestartet zu werden.
Das mit "sleep 1h" habe ich ausprobiert; Es kommt jede Stunde ein neuer Prozess hinzu. Habe wider 2 cronjobs @reboot und @hourly.
|