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.
Skripte portionsweise ausführen
-
- Beiträge: 237
- Registriert: 26.04.2009 01:57:27
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nettetal
-
Kontaktdaten:
Re: Skripte portionsweise ausführen
Müsste es nicht reichen, die Skripte über den Aufruf
im Hintergrund auszuführen!?
Gruß
Code: Alles auswählen
/pfad/zum/skript.sh &
Gruß
-
- Beiträge: 237
- Registriert: 26.04.2009 01:57:27
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nettetal
-
Kontaktdaten:
Re: Skripte portionsweise ausführen
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:
Wenn das Skript keine Jobs mehr im Ordner jobs.d findet, beendet es sich. Wenn neue Jobs da sind, muss es neu aufgerufen werden.
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
-
- Beiträge: 237
- Registriert: 26.04.2009 01:57:27
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Nettetal
-
Kontaktdaten:
Re: Skripte portionsweise ausführen
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