Jeder Daemon auf einem Linux System führt eine Log Datei im Verzeichnis /var/log. Ab einer gewissen Laufzeit finden sich dort mehere Megabyte an archivierten Log Dateien. Das händische löschen von archivierten Log Datein ist eine nervige Sache. Um mir Nerven und Zeit zu ersparen habe ich mir ein Script geschrieben das mir diese Arbeit abnimmt.
#!/bin/sh ## Author: Tobias Jäck ## License: GPL version 3 ## Logfile LOGFILE="/var/log/cleanup.log" find /var/log/ -iname *.gz -type f -exec rm -fv {} \; >> $LOGFILE 2>&1 if [ $? -ne 0 ]; then exit 1 else exit 0 fi
Das Script sucht mit “find” im Verzeichnis /var/log nach archivierten Log Dateien (Dateien mit der Endung .gz) und entfernt diese. Ironischer Weise legt das Script ebenfalls eine Log Datei an (/var/log/cleanup.log) in der gelöschte Dateien und Probleme niedergeschrieben werden.
Auf der Suche nach einem Backup Shell Script für meinen Debian Server wurde ich in den weiten des Internets nicht fündig. Zumindest fand ich kein Script das genau das tat was ich wollte. Also machte ich mich selbst ans Werk. Vorweg: Das Script erstellt nicht einfach eine simple Kopie des Festplatteninhalts. Dies verbraucht meiner Meinung nach zu viel Speicherplatz. Sämtliche Debian Binarys müssen nämlich nicht gesichert werden. Denn diese sind von den Servern aus der sources.list abrufbar. Einzig und allein die Binarys unter /usr/local/ werden, neben den Konfigurationsdateien unter /etc/ und den Dateien unter /var/ /home/ und /root/, gesichtert. Natürlich können diese Verzeichnisse geändert werden. Es reicht die Variable TOBACKUP im Konfigurationsteil des Scriptes um die entsprechenden Verzeichnisse zu erweitern oder mit Hilfe der Variable TOEXCLUDE Unterverzeichnisse vom Backup auszuschließen. Die Kernel Version, Distribution, Architektur und der Installationszeitpunkt des Systems werden nochmals seperat in der Datei uname.txt gesichert.
Ebenso erstellt das Script SQL Dumps von allen MySQL Datenbanken des Servers und läd das gesamte Backup, verschlüsselt oder nur komprimiert, optional auch auf einen FTP Space übertragen. Wichtig ist das das Verzeichnis das in OUTDIR eingetragen ist exisitert. Sowohl bei lokalem speichern des Backups als auch beim remote Backup Vorgang auf den FTP Space. Eine Übertragung auf einen FTP Backup Space erfolgt nur, wenn FTP Zugangsdaten hinterlegt sind. Sollte etwas in die Option BACKUPPASS eingetragen sein verschlüsselt das Script die Daten mit GnuPG.
Die Kommentare im Script habe ich in englisch gehalten. Damit sollte eigentlich jeder zurecht kommen und ich muss das Script nicht mehrsprachig kommentiert online stellen. Auf alle Konfigurationsoptionen möchte ich hier im Text nicht weiter eingehen. Die Variablenbezeichnungen sowie die Kommentare sollten alles erklären.
#!/bin/sh ## Author: Tobias Jäck ## License: GPL version 3 ## ## <Configuration> ## ## Backup prefix PREFIX="yourprefix_" ## Dirs which should be backed TOBACKUP="/root/ /home/ /etc/ /var/ /usr/local/" ## Dirs which shouldn't be backed TOEXCLUDE="/yourdirstoexclude/" ## MySQL login data MYSQLUSER="yoursqluser" MYSQLPASS="yoursqlpass" MYSQLHOST="yoursqlhost" ## Dir to save backup OUTDIR="yourdirtosave" ## FTP login form the backup FTP server (optional) FTPHOST="optionalyourftphost" FTPUSER="optionalyourftpuser" FTPPASS="optionalyourftppss" ## Backup password (optional) BACKUPPASS="optionalyourpassword" ## Working dir WORKINGDIR="/tmp/" ## Logfile LOGFILE="/var/log/${PREFIX}backup.log" ## ## </Configuration> ## if [ -n "$OUTDIR" ]; then ## Set prozess priority renice -19 -p $$ 1> /dev/null 2>> $LOGFILE ## Set I/O priority ionice -c2 -n1 -p $$ 1> /dev/null 2>> $LOGFILE ## Date and time DATE=$(date "+%Y-%m-%d-%H-%M-%S") ## Create and enter working dir mkdir ${WORKINGDIR}${PREFIX}${DATE} cd ${WORKINGDIR}${PREFIX}${DATE} ## Save version uname -a > "uname.txt" TOBACKUP="${TOBACKUP} uname.txt" ## Create a list with installed deb pakets dpkg --get-selections > "deb.list" TOBACKUP="${TOBACKUP} deb.list" ## Create MySQL dump environment mkdir mysqldumps/ TOBACKUP="${TOBACKUP} mysqldumps/" ## Create MySQL dumps from all databases DBS="$(mysql -h $MYSQLHOST -u $MYSQLUSER -p$MYSQLPASS -Bse 'show databases' 2>> $LOGFILE)" if [ $? -ne 0 ]; then ## Delete temporary files rm -r ${WORKINGDIR}${PREFIX}${DATE} exit 1 fi for DB in $DBS; do mysqldump -h $MYSQLHOST -u $MYSQLUSER -p$MYSQLPASS $DB > "mysqldumps/${DB}.sql" done ## Exclude dirs if [ -n "$TOEXCLUDE" ]; then TOEXCLUDE="--exclude ${TOEXCLUDE}" fi ## Compress and / or encrypt files if [ -n "$BACKUPPASS" ]; then VAR_EXTENSION=".tar.bz2.gpg" tar -cf - $TOBACKUP $TOEXCLUDE 2> /dev/null | gpg --symmetric --bzip2-compress-level 9 --passphrase ${BACKUPPASS} > "${PREFIX}${DATE}${VAR_EXTENSION}" else VAR_EXTENSION=".tar.bz2" tar -cf - $TOBACKUP $TOEXCLUDE 2> /dev/null | bzip2 -c --best > "${PREFIX}${DATE}${VAR_EXTENSION}" fi if [ -n "$FTPHOST" ] && [ -n "$FTPUSER" ] && [ -n "$FTPPASS" ]; then ## Save backup on FTP server ncftpput -u $FTPUSER -p $FTPPASS $FTPHOST $OUTDIR "${PREFIX}${DATE}${VAR_EXTENSION}" 2>> $LOGFILE else ## Save backup lokal cp "${PREFIX}${DATE}${VAR_EXTENSION}" "$OUTDIR" 2>> $LOGFILE fi ## Delete temporary files rm -r ${WORKINGDIR}${PREFIX}${DATE} if [ $? -ne 0 ]; then exit 1 else exit 0 fi else echo "Error: Output dir is empty" >> $LOGFILE exit 1 fi
Der Name des komprimierten Backups setzt sich wie folgt zusammen: %Präfix%%Jahr%-%Monat%-%Tag%-%Stunde%-%Minute%-%Sekunde%.tar.bz2. Die Log Datei des Scripts findest du unter /var/log/%Präfix%backup.log. Enthalten sind dort Statistiken und Fehler zur FTP Übertragung sowie kritische Konfigurationsfehler.
Im Script werden Prozess und I/O Priorität angepasst um den Server nicht an seiner regulären Arbeit zu hindern. Beachte dabei das ein Ausführen von nice nur mit root Rechten möglich ist.
Mögliche Probleme mit Paketabhängigkeiten sollten sich nach dem erfolgreichen ausführen dieses Befehls erledigt haben:
sudo apt-get install ncftp bzip2 gnupg
Sowohl date als auch tar, nice, ionice dpkg und mysql / mysqldump sind normalerweise auf dem Server vorhanden.
Bei Fragen oder Problemen scheue nicht die Kommentarfunktion zu verwenden.
Wer kennt das nicht:
:~$ umount /media/disk/ umount: /media/disk: device is busy
“device is busy” – Der Wechseldatenträger lässt sich nicht aushängen, weil er gerade noch von einem Programm in Benutzung ist. Die Umount Option -f führt nicht zum Ziel. Auch wenn -f für “force” steht. Den Datenträger dennoch auszuhängen ist folgendermaßen möglich:
:~$ umount -l /dev/disk
In der Manpage steht zur Option -l:
“-l Lazy unmount. Detach the filesystem from the filesystem hierarchy now, and cleanup all refer* ences to the filesystem as soon as it is not busy anymore. (Requires Kernel 2.4.11 or later.)”

