Kategori bash

Bash paralelisiren

Donnerstag, August 16th, 2012

Gehen wir von folgenden Szenario aus. Wir wollen eine Funktion in Bash in den Hintergrund schreibe um den Ablauf zu Parallelisieren. In diesem Beispiel wird lediglich ein sleep ausgeführt.

#!/bin/bash

function background ()
{
  #do somsing
  sleep $1
}

for i in {1..100}; do
  background $i &
done

Problem: Wir wollen aber maximal nur 10 Prozesse gleichzeitig laufen lassen. Dafür habe ich eine Funktion waiting geschrieben die solange wartet bis die Anzahl des übergebenen wertes erreicht ist. Für das Zählen habe ich Dateien verwendet da wenn man Variablen übergeben würde diese nicht in der for schleife zur Verfügung stehen würden.

#!/bin/bash

tmpd=`mktemp -d`
function waiting() {
  while true; do
    if [ `ls $tmpd | wc -l` -le "$1" ]; then
      break
    fi
    sleep .5;
  done
}

function background () {
  touch $tmpd/$1
  #do somsing
  sleep $1
  rm $tmpd/$1
}

for i in {1..100}; do
  background $i &
  waiting 10
done

waiting 0
rm -r $tmpd

grep nach aktiven config zeilen

Mittwoch, Juli 25th, 2012

2008 habe ich es schon mal in einem Blogbeitrag dokumentiert, nun hier noch mal etwas überarbeitet, da man so die dovcode configs nicht lesen kann.

grep -v -e "^ *#" -e ";" -e "^$" conf.datei

mit convert alle cores nutzen

Dienstag, Juli 24th, 2012

Mit convert kann man wie im beispiel Bilder auf eine maximale seitenlögen verkleinern. Da convert aber ein single thread prozess ist, habe ich mit einer while schliefe nachhelfen müssen.

#!/bin/bash

cpu=4
mkdir web
 
ls -1 *.JPG *.jpg | while read file;
do {
        echo $file
        convert $file -resize '800x800>' web/$file &

	#warte bis weniger gleich als $cpu converts laufen
	while true; do 
		if [ "$(ps axf | grep convert | wc -l)" -le "$cpu" ]; then 
			break
		fi
		sleep 0.5
	done
}
done
 
exit 0

bash operator

Donnerstag, Juli 5th, 2012
le <= less than or equal 
eq == equal
ne != not equal 
ge >= greater then or equal 
gt >  greater then

pee stdout an mehrere Programme weiterleiten

Montag, Mai 21st, 2012

Wenn man zwei Programme gleichzeitig auf ein stdin zugreifen sollen braucht man ein Hilfsprogramm wie pee.

Hier ein einfaches beispiel. Es werden Zahlen von 0 bis 3 ausgegeben. Würde man nur das grep ausführen bekäme man nur die 1, beim teil -n1 nur die 3. Mit pee kann man beides verbinden.
echo "0
1
2
3" | pee "grep 1" "tail -n1"
1
3