Skripte portionsweise ausführen

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
coresploit
Beiträge: 237
Registriert: 26.04.2009 01:57:27
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nettetal
Kontaktdaten:

Skripte portionsweise ausführen

Beitrag von coresploit » 11.08.2009 07:19:27

Hallo.

Ich suche eine Möglichkeit, Skripte portionsweise auszuführen. Ich habe einen Ordner, der nur Skripte enthält, die nacheinander ausgeführt werden sollen. Für diese Aufgabe kann man ja ein weiteres Shell-Skript benutzen, welches die Liste abarbeitet. Nun möchte ich aber, dass er nicht schnöde ein Skript nach dem anderen ausführt, sondern mehrere Skripte parallel, sodass immer eine Reihe von Skripten läuft.

Gibt es für diese Aufgabe ein Programm oder Dämon? Ich wäre sehr dankbar für Hilfe.

Danke.

michaels
Beiträge: 1164
Registriert: 29.03.2009 18:12:25

Re: Skripte portionsweise ausführen

Beitrag von michaels » 11.08.2009 07:55:56

Müsste es nicht reichen, die Skripte über den Aufruf

Code: Alles auswählen

/pfad/zum/skript.sh &
im Hintergrund auszuführen!?

Gruß

coresploit
Beiträge: 237
Registriert: 26.04.2009 01:57:27
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nettetal
Kontaktdaten:

Re: Skripte portionsweise ausführen

Beitrag von coresploit » 11.08.2009 08:44:20

Ich möchte aber, dass nur eine gewisse Anzahl von "Jobs" parallel läuft. Naja, vielleicht hat ja jm eine Idee, wie man das in mein Skript einbringen könnte. Hier das Skript:

Code: Alles auswählen

#/bin/bash

# Specify configuration directory
CONFDIR="$HOME/.autojob"

# Specify number of attempts after failue
RETRY=2

# Specify pid file
PIDFILE="/tmp/autojob.$USER.pid"

########################################################
## DO NOT CHANGE IF YOU DON'T KNOW WHAT YOU ARE DOING ##
########################################################

# Check if already running
if [ -f "$PIDFILE" ] && ps -p `cat "$PIDFILE"` >/dev/null; then
	echo "Already running. exiting..." && exit 1
fi

# Make sure that only one instance can run
trap "rm -f \"$PIDFILE\"" INT TERM EXIT
echo $$ >"$PIDFILE"

# Create directories
mkdir -p "$CONFDIR/jobs.d" "$CONFDIR/working.d" "$CONFDIR/done.d" "$CONFDIR/failed.d" "$CONFDIR/log.d" || exit 1

# Continue jobs
for JOB in $(ls -B "$CONFDIR/working.d"); do
	if [ -f "$CONFDIR/log.d/$JOB.$RETRY" ]; then
		mv "$CONFDIR/working.d/$JOB" "$CONFDIR/failed.d/$JOB"
	else
		mv "$CONFDIR/working.d/$JOB" "$CONFDIR/done.d/$JOB"
	fi
done

while true; do
	# Get next job
	JOB="$(ls -B "$CONFDIR/jobs.d" | sort -n | head -n1)"

	# No more jobs
	if [ ! -f "$CONFDIR/jobs.d/$JOB" ] || [ ! -x "$CONFDIR/jobs.d/$JOB" ]; then
		exit 0
	fi

	# Try to move and continue if it failed
	mv "$CONFDIR/jobs.d/$JOB" "$CONFDIR/working.d/$JOB" || continue

	for T in $(seq 0 $RETRY); do
		"$CONFDIR/working.d/$JOB" >"$CONFDIR/log.d/$JOB.$T" 2>&1 || continue
		mv "$CONFDIR/working.d/$JOB" "$CONFDIR/done.d/$JOB" && break
	done

	[ $T -eq $RETRY ] && mv "$CONFDIR/working.d/$JOB" "$CONFDIR/failed.d/$JOB"
done
Wenn das Skript keine Jobs mehr im Ordner jobs.d findet, beendet es sich. Wenn neue Jobs da sind, muss es neu aufgerufen werden.

coresploit
Beiträge: 237
Registriert: 26.04.2009 01:57:27
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nettetal
Kontaktdaten:

Re: Skripte portionsweise ausführen

Beitrag von coresploit » 11.08.2009 10:47:09

EDIT: Habs jetzt hinbekommen. Es werden einfach eine ganze Reihe von Instanzen gestartet. Die PIDs werden separat abgelegt, damit bestimmt werden kann, wiviele Instanzen schon am rennen sind.

Code: Alles auswählen

#/bin/bash

# Specify configuration directory
CONFDIR="$HOME/.autojob"

# Specify number of attempts after failue
RETRY=2

# Specify sleep after retry
SLEEP=15s

# Specify how many instances can be started
INSTANCES=5

# Specify pid file
PIDFILE="/tmp/autojob.$USER.pid"

########################################################
## DO NOT CHANGE IF YOU DON'T KNOW WHAT YOU ARE DOING ##
########################################################

# Check if already running
for I in $(seq 0 $INSTANCES); do
	if [ ! -f "$PIDFILE.$I" ] || ! ps -p `cat "$PIDFILE.$I"` >/dev/null; then
		break
	fi
done
if [ $I -eq $INSTANCES ]; then
	exit 1
fi

# Create pid file
trap "rm -f \"$PIDFILE.$I\"" INT TERM EXIT
echo $$ >"$PIDFILE.$I"

# Create directories
mkdir -p "$CONFDIR/jobs.d" "$CONFDIR/working.d" "$CONFDIR/done.d" "$CONFDIR/failed.d" "$CONFDIR/log.d" || exit 1

# Continue jobs if we are the initial instance
if [ $I -eq 0 ]; then
	for JOB in $(ls -B "$CONFDIR/working.d"); do
		if [ -f "$CONFDIR/log.d/$JOB.$RETRY" ]; then
			mv "$CONFDIR/working.d/$JOB" "$CONFDIR/failed.d/$JOB"
		else
			mv "$CONFDIR/working.d/$JOB" "$CONFDIR/done.d/$JOB"
		fi
	done
fi

while true; do
	# Get next job
	JOB="$(ls -B "$CONFDIR/jobs.d" | sort -n | head -n1)"

	# No more jobs
	if [ ! -f "$CONFDIR/jobs.d/$JOB" ] || [ ! -x "$CONFDIR/jobs.d/$JOB" ]; then
		break
	fi

	# Try to move and continue if it failed
	mv "$CONFDIR/jobs.d/$JOB" "$CONFDIR/working.d/$JOB" || continue

	# Start a new instance
	$0 &

	for T in $(seq 0 $RETRY); do
		[ $T -gt 0 ] && sleep $SLEEP
		"$CONFDIR/working.d/$JOB" >"$CONFDIR/log.d/$JOB.$T" 2>&1 || continue
		mv "$CONFDIR/working.d/$JOB" "$CONFDIR/done.d/$JOB" && break
	done

	[ $T -eq $RETRY ] && mv "$CONFDIR/working.d/$JOB" "$CONFDIR/failed.d/$JOB"
done
wait

Antworten