Schlagwort-Archive: Shell

Batch Umwandlung von Videos unter Linux/BSD

Als leidenschaftlicher Medienjunkie sammelt sich das ein oder andere Video auf meinen Datentresoren. TV-Aufnahmen werden verschoben, Vorträge gesammelt und so kommt ein beachtliches Arsenal an Videomaterial zusammen.

Nun bin ich nicht der Typ der alles in HD 1080p haben muss und schon gar nicht bei DVB-T Aufnahmen (die es ohnehin nicht mitbringen). Also jage ich nachfolgendes Skript über meine Screen Session um sämtliches Material in einem Ordner in ein platzsparenderes Format umzuwandeln. Dabei gehe ich den Weg des geringsten Wiederstand und nehme einfach eine Eingangsdatei und konvertiere diese in x264 Video mit ac3 Ton. Keine Anpassung von Ratio oder Auflösung. wer möchte kann das gern ergänzen. Dazu nutze ich der Einfachheit halber ffmpeg und schreibe die fertigen Dateien in einen entsprechenden Order um eine Unterscheidung machen zu können. Natürlich ersetze ich dabei die Dateiendungen.

In diesem Fall arbeite ich gezielt AVI Dateien ab. Wenn ich allerdings meine TV Aufnahmen bearbeite ersetze ich das .avi durch ein .ts.

for i in $(ls *.avi | sed -r -e ’s/(.*)\.(.*)/\1/‘);
do
ffmpeg -i $i.avi -c:v libx264 -preset slow -b:v 1000k -c:a ac3 -b:a 128k fertig/$i.mkv;
done

Mailserver Checkskript

#!/bin/sh
HELOSERVER=web,de
MAILFROM=info@worlddomination.de
RCPTTO=keine@aol.com
SERVER=Mail.deinserver.de
( echo „HELO $HELOSERVER“
sleep 2
echo „MAIL FROM:$MAILFROM“
sleep 2
echo „RCPT TO:$RCPTTO“
sleep 2
echo DATA
sleep 2
echo „Subject:Test-Mail!“
sleep 2
echo „Inhalt der Test-Mail!“
sleep 2
echo .
sleep 2
echo QUIT
) | telnet $SERVER 25

MySQL Magic und datadir Wechsel

Manchmal hat man es mit merkwürdigen Verhaltnsweisen einer Datenbank wie MySQL zu tun.

So zum Beispeil wenn die Engine InnoDB genutzt wird. Diese ist total toll und auch transaktionssicher. Nur brauchen die wenigsten Anwendungen diese Sicherheit und wollen lieber schneller und/oder schlanker sein.

An dieser Stelle wird man bei InnoDB mit großen Dateigrößen überrascht und bekommt mit unter Performanceschwierigkeiten. Ich habe mir viele Gedanken dazu wie man etwas derartiges Lösen kann. Fest steht, dass die Datenbanken und mehrere Faktoren größer sind und man nur bedingt die Möglichkeit bestitzt hier zu tunen ohne die Hardware anzupassen (zumindest ab einer gewissen Größenordnung).

Normalerweise sollte der mysqlcheck Befehl dabei helfen die Geschwindigkeit und „Ordentlichkeit“ zumindest ein kleines Stück weit bezubehalten.

Nicht immer ist das aber ausreichend um die Dateigröße und auch die Geschwindigkeit zu steigern. Letztendlich habe ich keinen anderen Weg gefunden als die komplette Datenbank zu exportieren und anschließend wieder zu importieren. Das Ergebnis vor weg ist eine um den Faktor 13 kleinere Datenbank geworden.

Zunächst sollte man sich vor Augen führen, wie große die Datenbanken wirklich sind:

mysql -u root -p -e ’select table_schema „Database“,round(sum(data_length+index_length)/1024/1024,4) „Size (MB)“ from information_schema.tables group by table_schema;‘ > /root/databasesize.txt

In der Datei databasesize.txt stehen alle Datenbanken mit Namen und der entsprechenden Größe.

Zunächst einmal werden alle Datenbanken gecheckt:

  • mysqlcheck –all-databases -u root -p –optimize –auto-repair

Anschließend wird die Datenbank exportiert

  • mysqlcheck –all-databases -u root -p –all-databases > /root/Sicherung.sql

Ist die Sicherung erledigt fährt man den MySQL dienst herunter

/etc/init.d/mysql stop

und kann man sich (vielleicht auch zur Sicherheit) einen neuen Speicherort für die Datenbanken aussuchen. Diese stellt man in der Datei /etc/mysql/my.cnf ein. Dort legt man sich einfach einen neuen Eintrag für das datadir an.

#datadir = /var/lib/mysql
datadir = /neuer/speicherort/lib/mysql

Möchte man bei InnoDB bleiben, so kann es interessant sein den Eintrag

innodb_file_per_table = 1

in der Sektion [mysqld] hinzuzufügen.

Wichtig ist, dass der neue Speicherort auch von dem Benutzer und der Gruppe mysql genutzt werden kann  (chmod mysql:mysql /neuer/speicherort/lib/mysql). Dorthin kopiert man die vorhandene MySQL Datenbank

cp /var/lib/mysql/mysql /neuer/speicherort/lib/mysql

Somit kann man sich sicher sein, dass man sich auch wieder einloggen kann. Nun kann man den den Dienst wieder starten

/etc/init.d/mysql start

und die Datenbank einlesen:

mysql -u root -p < /root/Sicherung.sql

Man kann nun zuschauen, wie die Datenbankan erneut angelegt werden.

Da ich hier beschreibe wie man von zum Beispiel InnoDB auf MyISAM kommt, fehlt noch die Konvertierung der Tabelle auf das gewünscht Format. Dazu lassen wir uns von MySQL ein Skript generieren:

mysql -u root -p -e ’select concat(‚alter table ‚,table_schema,‘.‘,table_name,‘ engine=MyISAM;‘) from information_schema.tables where engine = ‚InnoDB“ > /root/altertabletomyisam.sql

und lesen es erneut ein:

mysql -u root -p < /root/altertabletomyisam.sql

Nun rattert MySQL die ganzen Tabellen durch und erzeugt uns feine MyISAM Tabellen.

Wenn man genug Platz hat, dann kannn man den letzten Schritt schon vor dem Export der Datenbank machen, denn es werden neue Tabellen erzeugt und die alten nicht gelöscht.

Es gibt natürlich noch andere Wege. Einen habe ich hier gefunden.

DNS Zonen anhand von Master finden

Ist man auf einem unixoiden System unterwegs und will sich auf einem großen Nameserver die Liste aller Zonen aus der Named-conf anzeigen lassen, welche einen bestimmten Master haben, so kann man das ziemlich elegant mit folgender Zeile tun:

grep -i -B 5 „IP-DES-MASTER-SERVERS“ etc/named.conf | grep -i  zone | grep -v \# | cut -d \“ -f 2 | sort -u

Es wird die named.conf ausgelesen und nach dem Master Server gesucht und zusätzlich 5 darüberliegende Zeilen mit ausgegeben. Diese Zeilen durchsuchen wir nach dem Wort „zone“ und filtern im zweiten Schritt alle auskommentierten Zeilen heraus. Damit fertig geht es weiter und wir trennen den Text nach Anführungszeichen und lassen uns nur alles dazwischen in geordneter Form ausgeben. So erhalten wir eine Liste die wir auch gern für andere Dinge verwenden können.