bash loop

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
za0
Beiträge: 816
Registriert: 09.07.2005 00:14:18
Wohnort: das 4. Reich der GEZ

bash loop

Beitrag von za0 » 10.08.2005 23:16:53

Hallo liebe Debiangemeinde,

leider kann Cron maximal nur jede Minute einen Befehl ausführen. Ich muß aber einen Befehl
jede 5 Sekunden ausführen. Dazu wollte ich ein Skript in Bash schreiben.
Dieses Skript solll beim Boot-Vorgang gestartet werden und non-stop laufen. Ferner
soll man auch in der Lage sein das Interval zu ändern.
BSP:

Code: Alles auswählen

/etc/init/execute 10
So wird der Befehl, der in Skript "execute" verankert ist jede 10 Sekunden ausgeführt.
Wichtig ist noch, dass ich das Skript herunterfahren und start können muß, also

Code: Alles auswählen

/etc/ execute stop|start
Kann mir da jemand von Euch unter den Arm greifen?

Vielen herzlichen Dank!

za0

Viele Grüße
za0


Nieder mit der Pauschal-Abzocke der GEZ! :twisted:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.08.2005 09:06:37

poste einmal was du schon hast :wink:

Gruß
gms

Benutzeravatar
za0
Beiträge: 816
Registriert: 09.07.2005 00:14:18
Wohnort: das 4. Reich der GEZ

Beitrag von za0 » 11.08.2005 19:30:25

Hi,

ich weiss nur noch nicht, wie ich den loop bauen soll und wie ich die anderen kriterien erfüllen soll (siehe erstes posting)

Code: Alles auswählen

#!/bin/sh

case "$1" in
start)
    echo -n "Starting ... "
    echo "."
# loop mit verzögerung sleep 5 (5 is standardwert)
    ;;

stop)
    echo -n "Stoping ... "
    echo "."
    ;;

#int) # wie soll das mit den zahlen von 5 bis 60 gehen?
#    echo -n "changing interval ... "
#    echo "."
#    ;;

*)
	echo -n "Usage: test.sh [start|stop|{5..60}"
	;;
esac

exit 0

Viele Grüße
za0


Nieder mit der Pauschal-Abzocke der GEZ! :twisted:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.08.2005 21:04:03

Weil du die Zeit dynamisch umsetzen möchtest, habe ich das ganze in zwei Scripte aufgeteilt. Ein Steuerungsscript und ein Workerscript. Über ein Controlfile kann das Steuerungsscript dem Workersript die Verzögerungzeit mitteilen.

Die Environmentvariablen mußt du entsprechend deinen Gegebenheiten anpassen.

Steuerungsscript:

Code: Alles auswählen

DESC="my script"
NAME="scriptname"

DATADIR="/var/run/scriptname"
CONTROLFILE="$DATADIR/control"
DEFSLEEPTIME="10"
SLEEPTIME="$DEFSLEEPTIME"
WORKER="/root/testworker"

[ -d "$DATADIR" ] || mkdir -p "$DATADIR" || { echo "failed to create $DATADIR">/dev/stderr; exit 1; }

echo using controlfile $CONTROLFILE

case "$1" in
  start)
	echo -n "Starting $DESC: $NAME"
	echo "STOP=0" >>"$CONTROLFILE"
	( 
	   cd "$DATADIR"
	   nohup "$WORKER" & 
	)
	;;
  stop)
	echo -n "Stopping $DESC: $NAME"
	echo "STOP=1" >>"$CONTROLFILE"
	sleep "$SLEEPTIME"
	pkill -f "$WORKER"
	;;
  setsleep)
  	if [ -n "$2" ]; then
	  SLEEPTIME="$2"
	else
	  SLEEPTIME="$DEFSLEEPTIME"
	fi
	echo "SLEEPTIME=$SLEEPTIME" >"$CONTROLFILE"
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|setsleep}" >&2
	exit 1
	;;
esac

exit 0

Workerscript:

Code: Alles auswählen

#!/bin/bash

DATADIR="/var/run/scriptname"
CONTROLFILE="$DATADIR/control"
SLEEPTIME="10"

echo using controlfile $CONTROLFILE

function work {
  # todo
  echo working ...
  echo finished work
}

while true; do
  if [ -f "$CONTROLFILE" ]; then
    . "$CONTROLFILE"
  fi
  if [ "$STOP" -ge 1 ]; then
    echo stop
    echo "STOP=0" >>"$CONTROLFILE"
    exit 0
  fi
  work
  echo sleep $SLEEPTIME
  sleep "$SLEEPTIME"
  echo wakeup
done

Gruß
gms

Benutzeravatar
za0
Beiträge: 816
Registriert: 09.07.2005 00:14:18
Wohnort: das 4. Reich der GEZ

Beitrag von za0 » 14.08.2005 15:04:12

hallo gms,

danke vielmals!

ich werfe mal fünf augen drauf *freu*

Viele Grüße
za0

Viele Grüße
za0


Nieder mit der Pauschal-Abzocke der GEZ! :twisted:

Antworten