Script das sich zeitlich wiederholt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
masterspoon
Beiträge: 43
Registriert: 16.03.2010 10:52:39

Script das sich zeitlich wiederholt

Beitrag von masterspoon » 26.10.2010 03:24:53

Hallo
Ich bin im Besitz einer Linkstation duo.
Sie besitzt die Funktion wakeof.
Habe jetzt im Internet den Befehl "wakeonlan" fürs Terminal gefunden.
Damit lest sich de Linkstation übers lan starten, allerdings hat die Sache einen haken, ich müßte alle 4 min diesen Befehl wiederholen damit sich die Linkstation nicht abschaltet.
Da her habe ich mich gefragt, ob man das nicht mit einem Script lösen kann.

Benutzeravatar
hikaru
Moderator
Beiträge: 13929
Registriert: 09.04.2008 12:48:59

Re: Script das sich zeitlich wiederholt

Beitrag von hikaru » 26.10.2010 09:13:55

Endlosschleifen und man sleep sind deine Freunde. ;-)

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Script das sich zeitlich wiederholt

Beitrag von roli » 26.10.2010 09:23:24

wie waer es mit einem cron job?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

masterspoon
Beiträge: 43
Registriert: 16.03.2010 10:52:39

Re: Script das sich zeitlich wiederholt

Beitrag von masterspoon » 26.10.2010 11:49:38

über endlosschleifen habe ich auch drüber nachgedacht, nur ich ken mich mit scripte schreiben nicht aus.
Were dankbar über ein beispiel.
Solte sich auch wieder beenden lassen, und nicht durch einen neustart.

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Script das sich zeitlich wiederholt

Beitrag von roli » 26.10.2010 11:55:14

masterspoon hat geschrieben:über endlosschleifen habe ich auch drüber nachgedacht, nur ich ken mich mit scripte schreiben nicht aus.
Were dankbar über ein beispiel.
Bash:

Code: Alles auswählen

while [ true ]
do
  mach_was_du_willst
dome
masterspoon hat geschrieben:Solte sich auch wieder beenden lassen, und nicht durch einen neustart.
"das schöne an einer Endlosschleife ist, das sie keine Fehlermeldung erzeugt"
Mit einem kill kannst du sie beenden, aber das wiederspricht sich irgendwie. Entweder willst du eine Endlosschleife, oder nicht. Vielleicht solltest du dir das besser vorher ueberlegen.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
hikaru
Moderator
Beiträge: 13929
Registriert: 09.04.2008 12:48:59

Re: Script das sich zeitlich wiederholt

Beitrag von hikaru » 26.10.2010 12:07:01

Vielleicht etwas eleganter:

Code: Alles auswählen

#!/bin/bash

while [ -f ~/run  ]
do
  mach_was_du_willst
  sleep 5
done
echo 'exiting: no file `run` found.\n'
So kannst du mit dem Vorhandensein einer externen Datei (hier "run" im Home des Scriptstarters) das Script steuern. Solange die Datei vorhanden ist, läuft es, löschst du sie, stoppt es. Zwischen den Schleifendurchgängen wartet das Script jeweils 5 Sekunden.
Die Cron-Lösung halte ich trotzdem für die sauberere Lösung, sofern du nicht verschiedene Systeme zum Absetzen des WOL-Signals verwenden willst.
Zuletzt geändert von hikaru am 26.10.2010 12:08:02, insgesamt 1-mal geändert.

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Script das sich zeitlich wiederholt

Beitrag von 123456 » 26.10.2010 12:07:11

roli hat geschrieben:"das schöne an einer Endlosschleife ist, das sie keine Fehlermeldung erzeugt"
bei "dome" bin ich mir nicht so sicher... :)

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Script das sich zeitlich wiederholt

Beitrag von roli » 26.10.2010 13:55:14

Hi,
ub13 hat geschrieben:
roli hat geschrieben:"das schöne an einer Endlosschleife ist, das sie keine Fehlermeldung erzeugt"
bei "dome" bin ich mir nicht so sicher... :)
da bin ich mir schon sicher, das gibt eine Fehlermeldung :oops: , ist aber andererseits auch keine Endlosschleife :wink: waere richtig
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Script das sich zeitlich wiederholt

Beitrag von detix » 26.10.2010 18:45:11

Alternativ, schreib ein Skript das sich selbst wieder aufruft:
Aufruf mit:

Code: Alles auswählen

/Pfad/zum/Skript/Endlos.sh
Das Skript Endlos.sh selbst:

Code: Alles auswählen

#!/bin/bash
wakeonlan
sleep 4m
/Pfad/zum/Skript/Endlos.sh &
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Script das sich zeitlich wiederholt

Beitrag von Tintom » 26.10.2010 19:56:02

detix hat geschrieben:Alternativ, schreib ein Skript das sich selbst wieder aufruft:
Aufruf mit:

Code: Alles auswählen

/Pfad/zum/Skript/Endlos.sh
Das Skript Endlos.sh selbst:

Code: Alles auswählen

#!/bin/bash
wakeonlan
sleep 4m
/Pfad/zum/Skript/Endlos.sh &
Hier würde nach drei Monaten der Kernel kollabieren, weil sich dieser eine Prozess 32767 mal wieder selbst aufgerufen hat. :)

Benutzeravatar
hikaru
Moderator
Beiträge: 13929
Registriert: 09.04.2008 12:48:59

Re: Script das sich zeitlich wiederholt

Beitrag von hikaru » 26.10.2010 21:28:21

Tintom hat geschrieben:Hier würde nach drei Monaten der Kernel kollabieren, weil sich dieser eine Prozess 32767 mal wieder selbst aufgerufen hat. :)
Verdient sowas noch die Bezeichnung Fork"bombe"? ;-)

Benutzeravatar
bmario
Beiträge: 1257
Registriert: 05.09.2007 12:15:47
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dresden

Re: Script das sich zeitlich wiederholt

Beitrag von bmario » 26.10.2010 21:31:25

hikaru hat geschrieben:
Tintom hat geschrieben:Hier würde nach drei Monaten der Kernel kollabieren, weil sich dieser eine Prozess 32767 mal wieder selbst aufgerufen hat. :)
Verdient sowas noch die Bezeichnung Fork"bombe"? ;-)
Vielleicht Forkzeitbombe :)
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse

masterspoon
Beiträge: 43
Registriert: 16.03.2010 10:52:39

Re: Script das sich zeitlich wiederholt

Beitrag von masterspoon » 26.10.2010 23:25:16

Ich versuche es noch mal konkreter zu schildern.
1. Die Linkstation wird beim ersten wakeonlan gestartet, aller dings erwartet sie ale 4 oder 5 min das der Befehl wiederholt wird ansonsten schaltet sie sich ich ab.
Da ich nicht weis wie sich die sache auf mein netzwerk wie auch auf meinen Laptop leistungstechnisch auswirkt, möchte ich das der befehl auch nuhr alle 4 min ausgeführt wird und nicht dauerhaft.

2. Warum ich das Script beenden möchte liegt daran, wen ich weiter an meinem Laptop arbeite aber die Linkstation nicht mehr benötige soll sie sich ja abschalten.
Was nicht möglich wehre wen das Script endlos läuft.

Jetzt mal eine ferstendnis Frage zum Script


#!/bin/bash

while [ -f ~/run ] //Was bedeutet das in den eckigen klammern?
do
wakeonlan mac_adresse
sleep 5 //damit sage ich das die schleife sich alle 5 minuten wiederholen soll?
done

die schleife wird dan im Terminal ausgeführt und wen ich das Terminal schließe wird das Script beendet sehe ich das so richtig?

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Script das sich zeitlich wiederholt

Beitrag von GoKi » 26.10.2010 23:35:59

Die eckigen Klammer sind ein Synonym für test. Hier im konkreten Fall wird überprüft, ob die Datei ~/run existiert, falls nicht, wird die while-Schleife verlassen. Mehr Infos in

Code: Alles auswählen

man test
bzw.

Code: Alles auswählen

man bash
unter "CONDITIONAL EXPRESSIONS".

Code: Alles auswählen

sleep 5
führt zu einer Pause von 5 Sekunden,

Code: Alles auswählen

sleep 5m
für 5 Minuten. Auch hier mehr Infos mit

Code: Alles auswählen

man sleep
MfG GoKi
:wq

masterspoon
Beiträge: 43
Registriert: 16.03.2010 10:52:39

Re: Script das sich zeitlich wiederholt

Beitrag von masterspoon » 27.10.2010 10:10:43

So habe d folgendes script jetzt erstellt und getestet

#!/bin/bash
sleep5
while [ true ]
do
wakeonlan
sleep 4m
done

Das funktioniert jetzt so wie ich es wollte, nur wen ich das script starte werde ich immer gefragt ob ich das script im Terminal, Anzeigen oder Ausführen möchte.
Gibt es nicht eine Möglichkeit das es ohne nachfrage im Terminal ausgeführt wird.

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Script das sich zeitlich wiederholt

Beitrag von detix » 27.10.2010 17:49:28

Tintom hat geschrieben:Hier würde nach drei Monaten der Kernel kollabieren, weil sich dieser eine Prozess 32767 mal wieder selbst aufgerufen hat. :)
Erklärung bitte, warum sollte er das tun?
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Script das sich zeitlich wiederholt

Beitrag von Tintom » 27.10.2010 20:33:02

masterspoon hat geschrieben: Gibt es nicht eine Möglichkeit das es ohne nachfrage im Terminal ausgeführt wird.
Ja:
roli hat geschrieben: wie waer es mit einem cron job?

Benutzeravatar
Tintom
Moderator
Beiträge: 3069
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Script das sich zeitlich wiederholt

Beitrag von Tintom » 27.10.2010 20:42:34

detix hat geschrieben:
Tintom hat geschrieben:Hier würde nach drei Monaten der Kernel kollabieren, weil sich dieser eine Prozess 32767 mal wieder selbst aufgerufen hat. :)
Erklärung bitte, warum sollte er das tun?
Die Datei /proc/sys/kernel/pid_max legt die maximale Anzahl von Prozess-IDs fest. Standard ist hier 32768 (sieht man auch, wenn man ein cat auf die Datei abfeuert). Wenn du nun Dein Skript aufrufst, geht eine Prozess-ID drauf. Da dieses Skript sich alle vier Minuten wieder selbst aufruft und nichts geschlossen wird, hast du alle vier Minuten eine Prozess-ID weniger zu Verfügung.
Nun einfach ausrechnen 32768/((24*60)/4)=91,02 Tage. Aber selbst der Wert stimmt nicht, du hast ja noch andere Prozesse laufen, daher geht der Kernel schon früher hopps.

Gruß

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Script das sich zeitlich wiederholt

Beitrag von detix » 28.10.2010 16:31:14

Also das der Kernel dabei "hopps" geht, kann ich mir beim besten Willen nicht vorstellen!
Process identifier
Mein Englisch ist zwar schlecht, aber:
Under Unix, process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at zero and again increases.
lässt auch nach meinem Verständnis keine höheren PIDs zu, nach Erreichen des Limits gehts dann aber wieder von vorn los.

Das schreit ja förmlich nach einem Selbsttest,
ein passendes Skript das nach ein paar Stunden ein Ergebnis bringt werd ich am Wochende mal testen,
dieses säh dann so aus:

Code: Alles auswählen

#!/bin/bash
date
sleep 1
/Pfad/zum/Skript/Endlos.sh &
mal sehn, ob Linux dadurch unbedienbar wird...
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
hikaru
Moderator
Beiträge: 13929
Registriert: 09.04.2008 12:48:59

Re: Script das sich zeitlich wiederholt

Beitrag von hikaru » 28.10.2010 16:52:04

masterspoon hat geschrieben:So habe d folgendes script jetzt erstellt und getestet

#!/bin/bash
sleep5
while [ true ]
do
wakeonlan
sleep 4m
done
Das sleep5 am Anfang kannst du dir sparen. Ich staune dass das ohne Leerzeichen überhaupt läuft.
masterspoon hat geschrieben:Das funktioniert jetzt so wie ich es wollte, nur wen ich das script starte werde ich immer gefragt ob ich das script im Terminal, Anzeigen oder Ausführen möchte.
Startest du das etwa aus einer GUI-Anwendung heraus? :?
masterspoon hat geschrieben:Gibt es nicht eine Möglichkeit das es ohne nachfrage im Terminal ausgeführt wird.

Code: Alles auswählen

chmod u+x deinscript
Keine Ahnung ob das geht, Shellscripts starte ich auch immer aus einer Shell.
detix hat geschrieben:Also das der Kernel dabei "hopps" geht, kann ich mir beim besten Willen nicht vorstellen!
Process identifier
Mein Englisch ist zwar schlecht, aber:
Under Unix, process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at zero and again increases.
lässt auch nach meinem Verständnis keine höheren PIDs zu, nach Erreichen des Limits gehts dann aber wieder von vorn los.
Prinzipiell stimmt das. Aber das geht natürlich nur, wenn die unteren PIDs wieder frei sind. In deinem Beispiel werden sie aber weiterhin von den nicht geschlosenen früheren Instanzen belegt.
detix hat geschrieben:Das schreit ja förmlich nach einem Selbsttest,
ein passendes Skript das nach ein paar Stunden ein Ergebnis bringt werd ich am Wochende mal testen,
dieses säh dann so aus:

Code: Alles auswählen

#!/bin/bash
date
sleep 1
/Pfad/zum/Skript/Endlos.sh &
mal sehn, ob Linux dadurch unbedienbar wird...
Das sleep 1 kannst du dir auch sparen. Wenn du dann zusätzlich noch eine iterative Endlosschleife einbaust schaffst du es nicht mal mehr dir einen Kaffee zu machen bevor das System nicht mehr reagiert.

lhfloss
Beiträge: 261
Registriert: 07.10.2007 21:02:15
Lizenz eigener Beiträge: MIT Lizenz

Re: Script das sich zeitlich wiederholt

Beitrag von lhfloss » 28.10.2010 17:12:55

hikaru hat geschrieben:Aber das geht natürlich nur, wenn die unteren PIDs wieder frei sind. In deinem Beispiel werden sie aber weiterhin von den nicht geschlosenen früheren Instanzen belegt.
Nein, denn das Skript beendet sich nach dem Aufruf wieder. Es wartet nicht, bis der gestartete Prozess beendet wird. Man beachte das &-Zeichen am Ende:
detix hat geschrieben:

Code: Alles auswählen

#!/bin/bash
date
sleep 1
/Pfad/zum/Skript/Endlos.sh &
EDIT: Ich hab gerade den Test gemacht (ohne sleep 1). Der Kernel hat wirklich nach einer PID von ca. 32.000 wieder von vorne angefangen.

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Script das sich zeitlich wiederholt

Beitrag von detix » 28.10.2010 17:30:53

hikaru hat geschrieben:Das sleep 1 kannst du dir auch sparen. Wenn du dann zusätzlich noch eine iterative Endlosschleife einbaust schaffst du es nicht mal mehr dir einen Kaffee zu machen bevor das System nicht mehr reagiert.
Gute Idee, hab das 'sleep1' entfernt, so dauert ein Durchlauf hier knapp 1min40sek,
ich weiß nicht wieviel Durchläufe jetzt gemacht sind (es läuft und überläuft noch immer),
Kernelbelastung ist 100%, von einem Ausstieg aber keine Spur!
Im Gegenteil, iceweasel beendet und neugestartet, auch mal eben openoffice gestartet,
hier hängt nichts und das Skript läuft munter weiter, alles Andere wäre auch traurig gewesen...
Soviel zur Fork"bombe" :mrgreen:
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
hikaru
Moderator
Beiträge: 13929
Registriert: 09.04.2008 12:48:59

Re: Script das sich zeitlich wiederholt

Beitrag von hikaru » 29.10.2010 08:51:23

lhfloss hat geschrieben:
hikaru hat geschrieben:Aber das geht natürlich nur, wenn die unteren PIDs wieder frei sind. In deinem Beispiel werden sie aber weiterhin von den nicht geschlosenen früheren Instanzen belegt.
Nein, denn das Skript beendet sich nach dem Aufruf wieder. Es wartet nicht, bis der gestartete Prozess beendet wird. Man beachte das &-Zeichen am Ende:
Japp, übersehen. :roll:

Antworten