148 lines
5.4 KiB
Bash
148 lines
5.4 KiB
Bash
#!/bin/bash
|
|
# Script zur Transformation und zum Export von Projekten mit OpenRefine
|
|
# Variante "Komfort", Stand: 08.01.2017
|
|
#
|
|
# Voraussetzungen:
|
|
# 1. Docker
|
|
# 2. OpenRefine-Projekte im Arbeitsverzeichnis
|
|
#
|
|
# Nutzung Variante A)
|
|
# IDs der zu verarbeitenden Projekte an den Startbefehl anhängen.
|
|
# Beispiel: ./transform+export.sh 01234567890123 1234567890123
|
|
#
|
|
# Nutzung Variante B)
|
|
# Codewort manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen
|
|
# und Script ohne weitere Parameter starten.
|
|
# Beispiel: ./transform+export.sh
|
|
codewort="TRANSFORM"
|
|
|
|
# Transformationsregeln aus den folgenden Dateien werden (in dieser Reihenfolge) durchgeführt
|
|
jsonfiles=(07_3.json 07_5_minimal.json)
|
|
|
|
# Weitere Programmvariablen
|
|
workdir="/home/stud/refine"
|
|
port=8888
|
|
ram=3G
|
|
|
|
# Variablen ausgeben
|
|
echo "Transformationsdateien: " ${jsonfiles[@]}
|
|
echo "Arbeitsverzeichnis: " ${workdir}
|
|
echo "OpenRefine auf Port: " ${port}
|
|
echo "OpenRefine max. RAM: " ${ram}
|
|
echo "Codewort: " ${codewort}
|
|
echo ""
|
|
|
|
# Startzeitpunkt ausgeben
|
|
echo "Startzeitpunkt: $(date)"
|
|
echo ""
|
|
|
|
# Transformationsdateien ins Arbeitsverzeichnis laden
|
|
echo "Transformationsdateien herunterladen..."
|
|
cd ${workdir}
|
|
for jsonfile in "${jsonfiles[@]}" ; do
|
|
curl -O https://felixlohmeier.gitbooks.io/seminar-wir-bauen-uns-einen-bibliothekskatalog/content/openrefine/${jsonfile}
|
|
done
|
|
cd - > /dev/null
|
|
echo ""
|
|
|
|
# Server starten
|
|
echo "Server starten..."
|
|
sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data
|
|
echo ""
|
|
|
|
# Warten bis Server vollständig gestartet ist
|
|
until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done
|
|
|
|
# Abfrage der Projekt-IDs, wenn mit dem Startbefehl keine benannt wurden
|
|
if [ -z "$1" ]
|
|
then
|
|
echo "Es wurden beim Aufruf des Scripts keine Projekt-IDs benannt."
|
|
echo ""
|
|
echo "Projekt-IDs auslesen..."
|
|
projects=($(sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py | grep "${codewort}" | cut -c 2-14))
|
|
if [ -z "$projects" ]
|
|
then
|
|
echo "*** Es konnten keine Projekte gefunden werden! ***"
|
|
echo ""
|
|
echo "Sie haben zwei Möglichkeiten Projekte zur Verarbeitung zu benennen:"
|
|
echo "1. an den Startbefehl des Scripts die IDs der zu verarbeitenden Projekte anhängen"
|
|
echo "Beispiel: ./transform+export.sh 01234567890123 1234567890123"
|
|
echo ""
|
|
echo "2. Das Codewort ${codewort} manuell in OpenRefine in den Namen der zu verarbeitenden Projekten aufnehmen und das Script erneut starten."
|
|
echo ""
|
|
echo "Server beenden und Container löschen..."
|
|
sudo docker stop refine-server
|
|
sudo docker rm refine-server
|
|
exit
|
|
else
|
|
echo "Folgende Projekte im Arbeitsverzeichnis tragen das Codewort ${codewort} im Namen:"
|
|
echo ${projects[@]}
|
|
echo ""
|
|
fi
|
|
else
|
|
echo "Folgende Projekt-IDs wurden beim Aufruf des Scripts benannt:"
|
|
projects=($*)
|
|
echo ${projects[@]}
|
|
echo ""
|
|
fi
|
|
|
|
# Server beenden und Container löschen
|
|
echo "Server beenden und Container löschen..."
|
|
sudo docker stop refine-server
|
|
sudo docker rm refine-server
|
|
echo ""
|
|
|
|
# Schleife für Transformation und Export der Projekte
|
|
for projectid in "${projects[@]}" ; do
|
|
|
|
echo "Start Projekt $projectid @ $(date)"
|
|
|
|
# Server starten
|
|
echo "Server starten..."
|
|
sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data
|
|
|
|
# Warten bis Server vollständig gestartet ist
|
|
until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done
|
|
echo ""
|
|
|
|
# Transformationen durchführen
|
|
for jsonfile in "${jsonfiles[@]}" ; do
|
|
echo "Transformiere mit ${jsonfile}..."
|
|
# Meldungen aus Docker-Container refine-server ausgeben (Hintergrundprozess)
|
|
sudo docker attach refine-server &
|
|
# Transformation mit Python-Client anstoßen
|
|
sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -f ${jsonfile} ${projectid}
|
|
# Statistik des Java-Prozesses
|
|
echo "Statistik zum Ressourcenverbrauch..."
|
|
ps -o start,etime,%mem,%cpu,rss -C java
|
|
# Neustart des Docker-Containers refine-server nach jeder Transformation, um Arbeitsspeicher zu schonen
|
|
echo "Projekt speichern und Server neu starten ..."
|
|
sudo docker stop -t=5000 refine-server
|
|
sudo docker rm refine-server
|
|
sudo docker run -d --name=refine-server -p ${port}:3333 -v ${workdir}:/data felixlohmeier/openrefine:2.6rc1 -i 0.0.0.0 -m ${ram} -d /data
|
|
until curl --silent -N http://localhost:${port} | cat | grep -q -o "OpenRefine" ; do sleep 1; done
|
|
echo ""
|
|
done
|
|
|
|
# Daten exportieren
|
|
echo "Exportiere in ${projectid}.tsv"
|
|
sudo docker run --rm --link refine-server -v ${workdir}:/data felixlohmeier/openrefine:client-py -E --output=${projectid}.tsv ${projectid}
|
|
|
|
# Server beenden und Container löschen
|
|
echo "Server beenden und Container löschen..."
|
|
sudo docker stop -t=5000 refine-server
|
|
sudo docker rm refine-server
|
|
|
|
echo "Ende Projekt $projectid @ $(date)"
|
|
echo ""
|
|
done
|
|
|
|
# Endzeitpunkt ausgeben
|
|
echo "Endzeitpunkt: $(date)"
|
|
echo ""
|
|
|
|
# Liste der exportierten Dateien
|
|
echo "Folgende Dateien wurden erfolgreich exportiert:"
|
|
echo "(Anzahl der Zeilen und Dateigröße in Bytes)"
|
|
wc -l -c ${workdir}/*.tsv
|