ORACLE – Java und C Code in der Datenbank

Fun, Oracle

Heute möchte ich mal zwei Möglichkeiten vorstellen „externen“ Code in der Oracle DB laufen zu lassen. Dabei gibt es diverse Unterschiede und Feinheiten zu beachten, ich versuche es aber einfach zu halten und so wenig wie möglich theoretischen Ballast zu liefern.

Als Beispiel kommen drei Funktionen zum Einsatz welche verschiedene Parameter entgegen nehmen sowie unterschiedliche Rückgabewerte haben.

  1. square_number liefert die Quadratzahl einer ganzzahligen Zahl.
  2. square_root liefert die Quadratwurzel einer beliebigen Zahl.
  3. full_name verbindet den Vor- und Nachnamen zum vollständigen Familiennamen

Java

Bei Java kann man ein Objekt erzeugen welches entweder eine Referenz auf eine Java-Datei ist oder auf den konkreten Code.

Ersteres würde so aussehen:

create java class using bfile (java_dir, 'jex_util.class');

Letzteres so:

create or replace and compile java source named jex_src
as
public class jex_util {

  public static int square_number (int val) {
    return val*val;
  }
  public static double square_root (double val) {
    return java.lang.Math.sqrt(val);
  }
  public static String full_name (String given_name, String family_name) {
    return given_name+" "+family_name;
  }

};
/

Nachdem der Klassencode in der DB ist kann er „angesprochen“ werden. Hier der Code dafür:

create or replace function j_square_number(
    p_val pls_integer)
  return pls_integer authid definer
as
  language java
  name 'jex_util.square_number(int) return int';
/

create or replace function j_square_root(
    p_val number)
  return number authid definer
as
  language java
  name 'jex_util.square_root(double) return double';
/

create or replace function j_full_name(
    p_given_name varchar2,
    p_family_name varchar2)
  return varchar2 authid definer
as
  language java
  name 'jex_util.full_name(java.lang.String, java.lang.String) return java.lang.String';
/

Das reicht um nun endlich auch alles testen zu können:

select
  j_square_number(3),
  j_square_root(9.25),
  j_full_name('foo', 'bar')
from
  dual;

Zum Schluß natürlich das Aufräumen nicht vergessen…

drop function j_square_number;
drop function j_square_root;
drop function j_full_name;
drop java source jex_src;

C

Nun das gleiche in C. Hier muss zunächst eine Bibliothek bzw. „Library“ erstellt werden (Dateiendung *dll* bei Windows und *so* bei Linux). Der Sourcecode ist unabhängig vom Betriebssystem und verwendeten Compiler für die Funktionen zunächst identisch (mal abgesehen vom C Präprozessor der hier im Beispiel für das Erstellen der DLL in Windows mit Visual Studio benötigt wird…).

Die Quellcodedatei cex_util.c könnte etwa so aussehen:

#include
#include
#include

#if defined(_WIN64)
  __declspec(dllexport)
#endif
char* full_name(char* given_name, char* family_name)
{
  char* space = " ";
  char* result = malloc(strlen(given_name) + strlen(space) + strlen(family_name) + 1);
  strcpy(result, given_name);
  strcat(result, space);
  strcat(result, family_name);

  return result;
}

#if defined(_WIN64)
  __declspec(dllexport)
#endif
int square_number(int val)
{
  return val*val;
}

#if defined(_WIN64)
  __declspec(dllexport)
#endif
double square_root(double val)
{
  return sqrt(val);
}

Wenn man unter Windows arbeitet kompiliert man den Code nun z.B. mit Visual Studio. In der „Visual Studio x64 Win64 Command Prompt (2010)“ oder auch „Visual Studio x64 Cross Tools Command Prompt (2010)“ wird dazu zunächst eine Objektdatei erzeugt, um anschließend aus dieser die gewünschte Bibliothek (cex_util.dll) zu erstellen:

cl /LD cex_util.c

Unter Linux kompiliert man am einfachsten mit der GNU Compiler Collection (gcc) die quasi bei jeder Distribution dabei ist. Dazu direkt im Terminal eingeben:

gcc -shared -o libcex_util.so -fPIC cex_util.c

Nun muss die dll bzw. so Datei noch dorthin gelegt werden, wo Oracle Zugriff darauf hat bzw. von wo überhaupt DLLs geladen werden dürfen. Laut der extproc.ora ist der Default Ordner von wo aus immer geladen werden darf $ORACLE_HOME/lib und $ORACLE_HOME/bin. Alternativ kann man auch die exproc.ora editieren und einen speziellen Pfad festlegen. Gehen wir mal von letzterem aus und erzeugen ein Objekt in der Datenbank welches in dieses (fiktive) Verzeichnis auf die entsprechende Bibliothek referenziert. Das sieht z.B. in Windows bei einem (angenommenen) Pfad C:\ora_lib\ so aus:

create or replace library lib_cex
as
'C:\ora_lib\cex_util.dll';

Und bei Linux – die Datei in /opt/ora_lib/ vorausgesetzt – dann so:

create or replace library lib_cex
as
'/opt/ora_lib/cex_util.so';

Nachdem die Referenz auf die Bibliothek erfolgreich erstellt wurde, kann nun der Code „angesprochen“ werden. Das geht so:

create or replace function c_square_number(
    p_val in pls_integer)
  return pls_integer authid definer
as
  language c
  name "square_number"
  library lib_cex;
/

create or replace function c_square_root(
    p_val in double precision)
  return double precision authid definer
as
  language c
  name "square_root"
  library lib_cex;
/

create or replace function c_full_name(
    p_given_name varchar2,
    p_family_name varchar2)
  return varchar2 authid definer
as
  language c
  name "full_name"
  library lib_cex;
/

Nun geht es endlich ans testen:

select
  c_square_number(4),
  c_square_root(20.25),
  c_full_name('hello', 'world')
from
  dual;

Zum Schluß das Aufräumen nicht vergessen:

drop function c_square_number;
drop function c_square_root;
drop function c_full_name;
drop library lib_cex;

Ein Satz noch zu den Typen bzw. Konvertierungen. Oracle nimmt eine Menge implizite Konvertierungen vor (z.B. wird varchar2 zu string und string wiederrum entspricht in C einem char pointer). Man kann aber die Konvertierungen auch explizit mitgeben indem man die „PARAMETERS“ clause hinzufügt.

create or replace function c_square_number(
    p_val in pls_integer)
  return pls_integer authid definer
as
  language c
  name "square_number"
  library lib_cex;
  parameters(p_val int, return int);
/

Eine sehr gute Übersicht über das Hin und Her bei den Datentypen gibt eine etwas ältere (aber scheinbar immer noch aktuelle) Doku von Oracle: [https://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg11rtn.htm#1005528](https://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg11rtn.htm#1005528)

Und nun bin ich gespannt aufs Feedback!

Pimp my Elementary OS 0.4 (Loki) – Teil 2

Bash, ElementaryOS, Fun

Hier noch eine verbesserte Form des alten Skriptes:

#!/bin/bash
##
## Usage: loki_post_install [options]
##
## Removes unnecessary and add usefull software to a fresh installed Elementary OS 0.4 (Loki).
## Must be run as root.
##
## Options:
##  -h, --help      Display this message.
##

main() {
while [ $# -gt 0 ]; do
case $1 in
(-h|--help) usage;;
(--) shift; break;;
(*) break;;
esac
done
if [ $(whoami) != "root" ]; then
echo "This program must be run as root."
exit 1
fi
software
}
usage(){
[ "$*" ] && echo "$0: $*"
sed -n '/^##/,/^$/s/^## \{0,1\}//p' "$0"
exit 2
}
msg() {
(echo; echo \*\*\* $1 \*\*\*; echo)
}
software() {
msg "Prepare system"
apt update && apt upgrade -y && apt autoremove -y && apt autoclean -y
msg "Remove software"
apt purge maya-calendar pantheon-mail appcenter simple-scan -y
msg "Install software"
apt install zip unzip rar unrar gnome-disk-utility firefox lilypond fluid-soundfont-gm timidity libav-tools openjdk-8-jdk-headless -y

vbox=`dmidecode -t system | grep -i 'virtualbox' | wc -l`
if [ $vbox -gt 0 ]; then
msg "Install & configure additional software for VirtualBox"
apt install virtualbox-guest-additions-iso virtualbox-guest-utils

if [ $SUDO_USER == "" ]; then
adduser $USER vboxsf
else
adduser $SUDO_USER vboxsf
fi
fi

msg "Clean up"
apt update && apt upgrade -y && apt autoremove -y && apt autoclean -y
}

main "$@"

Feedback welcome!

Linux Standardprogramme Teil 1 – FIND

Bash, Fun

Es gibt ja einige sehr mächtige Standardprogramme bei linux wie awk, sed oder auch find – um nur 3 zu nennen. Letzteres benutzt man gern mal hier und da, vergisst dann aber im Laufe der Zeit wieder wie genau das mit der Syntax war. Daher hier nun einige Beispiele in Verbindung mit dem Programm wc („word count“).

# Im aktuellen Verzeichnis rekursiv absteigend die Anzahl aller Dateien zählen
find . -type f | wc -l
# Im aktuellen Verzeichnis rekursiv absteigend die Anzahl aller Verzeichnisse zählen
find . -type d | wc -l
# Im aktuellen Verzeichnis rekursiv absteigend alle MP3-Dateien zählen
find . -iname '*mp3' | wc -l
# Im aktuellen Verzeichnis rekursiv absteigend alle MP3 oder FLAC-Dateien zählen
find . -iname '*mp3' -o -iname '*flac' | wc -l
# Im aktuellen Verzeichnis (nicht rekursiv absteigend) alle Dateien auflisten
find ./* -maxdepth 0 -type f
# Im aktuellen Verzeichnis (nicht rekursiv absteigend) alle Dateien, auch die versteckten, auflisten
find ./ -maxdepth 1 -type f #This does show hidden files

Pimp my Elementary OS 0.4 (Loki)

Bash, ElementaryOS, Fun

Also das neue schicke Elementary OS ist ja nun verfügbar, jedoch fehlt hier und da das ein oder andere wichtige Tool für mich. Und da ich den Laptop nur als Zweitrechner nutze brauche ich ja kein extra Mailprogramm geschweige denn ein Scanprogramm…

Lange Rede kurzer Sinn: Einiges musste  weg, einiges noch hinzu kommen damit ich mit dem Endergebnis so richtig zufrieden bin…

#!/bin/bash
##
## Usage: loki_post_install [options]
##
## Removes unnecessary and add usefull software to a fresh installed Elementary OS 0.4 (Loki).
## Must be run as root.
##
## Options:
##   -h, --help    Display this message.
##   -d            Display debug information.
##

DBG=0;

main() {
while [ $# -gt 0 ]; do
case $1 in
(-d) DBG=1;shift;;
(-h|--help) usage 2>&1;;
(--) shift; break;;
(-*) usage "$1: unknown option";;
(*) break;;
esac
done
if [[ $(whoami) != "root" ]]; then
echo "This program must be run as root." >&2
exit 1
fi
software
}

usage() {
[ "$*" ] && echo "$0: $*"
sed -n '/^##/,/^$/s/^## \{0,1\}//p' "$0"
exit 2
} 2>/dev/null

msg() {
if [ $DBG -eq 1 ]; then
(echo; echo \*\*\* $1 \*\*\*; echo)
fi
}

software() {
msg "Prepare system"
apt update -y && apt upgrade -y && apt autoremove -y
msg "Remove software"
apt purge maya-calendar pantheon-mail appcenter simple-scan -y
msg "Install software"
apt install zip unzip rar unrar gnome-disk-utility firefox lilypond frescobaldi fluid-soundfont-gm timidity -y
msg "Clean up"
apt update -y && apt upgrade -y && apt autoremove -y
}

main "$@"

 

DEBORA – Erweiterung um Ausführung von Programmen via DBMS_SCHEDULER

Fun, Oracle

Seit Oracle 10 gibt es mit dem Package DBMS_SCHEDULER ein ziemlich mächtiges Werkzeug welches in der Version 11 nochmals erweitert wurde. Mich interessieren tut hier in dem Zusammenhang weniger das Aufsetzen eines Jobs der in einem high sophisticated Zeitintervall läuft (mit Zeitzone, Feiertagskalender und allem drum und dran…), sondern vielmehr der Zugriff aufs darunter liegende Betriebssystem. Warum? Ganz einfach, weil somit augenblicklich alle möglichen (Kommandozeilen-)programme direkt aus Oracle heraus ausführbar werden. Etwa über eine Weboberfläche die mit APEX erstellt wurde!?

Damit das ganze aber reibungslos funktionieren kann, muss zuvor einiges erledigt werden…

1. Einstellungen im Guest bzw. bei DEBORA

Wir beginnen mit der Arbeit in Debian und führen als root folgende Befehle aus:

cd $ORACLE_HOME
chown root:dba bin/extjob
chmod 4750 bin/extjob
touch rdbms/admin/externaljob.ora
chown root:dba rdbms/admin/externaljob.ora
chmod 644 rdbms/admin/externaljob.ora

 

Nun müssen in diese soeben erstellte Datei noch zwei Zeilen mit folgenden Inhalt hinein:

run_user = oracle
run_group = dba

2. Einstellungen in der DB

Als Admin muss man dem User, welcher Programme ausführen dürfen soll, noch bissl Rechte geben – z.B. einen Testuser mit dem Namen „DEBORA“.

CREATE USER DEBORA IDENTIFIED BY DEBORA;
GRANT CONNECT,RESOURCE TO DEBORA;
GRANT CREATE JOB TO DEBORA;
GRANT CREATE EXTERNAL JOB TO DEBORA;

So, und nun können wir (hoffentlich) das Ergebnis bestaunen. Wir erstellen dazu der Einfachheit halber eine leere Datei.

BEGIN
  dbms_scheduler.create_job(
    job_name        => 'EXAMPLE_JOB',
    job_type        => 'EXECUTABLE',
    job_action      => '/bin/touch',
    auto_drop       => true,
    enabled         => false,
    start_date      => systimestamp,
    number_of_arguments => 1
  );
  dbms_scheduler.set_job_argument_value(
    job_name          => 'EXAMPLE_JOB',
    argument_position => 1,
    argument_value    => '/tmp/file_created_by_oracle_db'
  );
  dbms_scheduler.ENABLE('EXAMPLE_JOB');
END;

Viel Spass beim Experimentieren und wie immer ist Feedback willkommen!

P.S. Das erfolgreiche (oder eben auch mal nicht erfolgreiche) Ausführen der Jobs wird protokolliert und leicht abgefragt werden via

SELECT * FROM all_scheduler_job_run_details;

Bash Script zur Anzeige der lokalen und öffentlichen IP-Adresse

Bash, Fun

Immer wieder benötigt man ja mal entweder die IP-Adresse im lokalen Netzwerk oder die gerade vergebene öffentliche. Dazu gibt es ja nette Widgets (für KDE4 biespielsweise den IP Adress Monitor), kleine Anwendungen bzw. Programme oder auch Websites die einem die gerade vergebene öffentliche IP-Adresse anzeigen.

Zur einfachen Weiterverarbeitung bzw. zum scripten wäre ein Bash Script jedoch auch nicht schlecht. Daher hab ich mal folgendes geschrieben:

#!/bin/bash

# read interface
if [ $# -ne 2 ]; then
echo "Usage: myipaddress.sh INTERFACE PUBLIC|PRIVATE"
echo "Example: myipaddress.sh eth0 public"
echo "         myipaddress.sh wlan5 private"
exit 1
fi
INTERFACE=$1

# echo result
if [ $2 == "public" ] || [ $2 == "PUBLIC" ]
then
echo `wget http://ipecho.net/plain -O - -q`
else
# use ip if installed
if hash ip 2>/dev/null; then
echo `ip -f inet -o addr show wlan5|cut -d\  -f 7 | cut -d/ -f 1`
else
echo `/sbin/ifconfig wlan5 | grep 'inet ' | cut -d: -f2 | awk '{ print $1}'`
fi
fi

GIT – Die wichtigsten Befehle im Überblick

Allgemein

Nachdem ich angefangen habe mit GIT bzw. GITHUB rumzuexperimentieren wollte ich mal die wichtigsten Befehle kurz zusammenfassen…

Benutzername und E-Mail gibt man global bekannt mittels:

git config --global user.name "Max Mustermann"
git config --global user.email "max@mustermann.de"

Ein neues lokales Verzeichnis als GIT repository anlegen geht via:

git init

Wenn man dann Dateien ins Verzeichnis geladen/erstellt hat werden diese auch GIT als relevante Dateien bekannt gemacht:

git add .

Nun erfolgt der erste COMMIT mit Kommentar via:

git commit -m "Erster COMMIT"

Eine remote Adresse von bspw. GITHUB fügt man hinzu mittels:

git remote add origin remote-repository-URL

Jetzt noch bestätigen mit:

git remote -v

Alle (lokalen) Änderungen nach GITHUB laden:

git push origin master

Diese Befehle sollten ausreichen um ein erstes repository auf GITHUB anzulegen. Viel Spass damit!

DEBORA – Erweiterung um SharedFolder

Fun, Oracle

Nachdem ja nun ne feine kleine VM mit Oracle XE und APEX Ihren Dienst tut, kam mir die Idee Dateien mittels PL/SQL zu schreiben (oder auch zu lesen). Und natürlich nicht innerhalb der VM sondern direkt in ein Verzeichnis des darunter liegenden Hosts.

Mittels Gasterweiterungen und „Gemeinsame Ordner“ (shared folder) ist das nicht allzu schwer. Jedoch ist das immer auch abhängig vom Host bzw. dessen OS und der Version von VirtualBox. Ich unterteil das daher mal in zwei Punkte. Zuerst erweitere ich die bereits ausführlich beschriebene VM um alles was man braucht für shared folder und dann zeige ich was man Hostseitig noch machen muss.

1. Einstellungen im Guest bzw. bei DEBORA

Zunächst muss man sich anmelden und diverse Sachen installieren bzw. upgraden. Das alles immer fleißig als root.

apt-get update
apt-get upgrade
apt-get install module-assistant
m-a prepare

Innerhalb der Oracle DB muss man nun auch noch ein Directory Objekt anlegen und entsprechend granten. Der Einfachheit halber alle Rechte für alle! 🙂

Dazu zunächst mittels sqlplus als sys anmelden und dann den CREATE DIRECTORY bzw. GRANT Befehl absetzen.

sqlplus "sys/oracle@localhost AS SYSDBA"

CREATE DIRECTORY debora AS '/media/sf_debora';
GRANT ALL ON DIRECTORY debora TO PUBLIC;

Das war es auch schon auf Guest bzw. DEBORA Seite.

2. Einstellungen im Host

Zunächst muss man seine VM Version ausfindig machen und dann die passende Gästeerweiterung (beginnend mit “ VBoxGuestAdditions_“) herunterladen von http://download.virtualbox.org/virtualbox

Danach via Massenspeicher/Speicher die ISO Datei im CD/DVD-Laufwerk einbinden:
virtualbox_iso_guest

Jetzt VM (z.B. DebOra) starten bzw. booten und als root anmelden bzw. tippen:

cd /media/
mkdir vbox
mount /dev/sr0 vbox/
cd vbox/
./VBoxLinuxAdditions.run
adduser oracle vboxsf
shutdown -h now

Nun die Verknüpfung zur Gästeerweiterung bzw. dem iso file wieder aufheben (rechte Maustaste und „Anschluss entfernen“) und einen gemeinsamen Ordner anlegen (Haken bei „Automatisch einbinden“ nicht vergessen…):
virtualbox_shared_folder

Nach einem erneuten reboot sollte eine mittels PL/SQL erzeugte Datei im Ordner /opt/debora des Hosts liegen.

Das war es auch schon…

DEBORA — Debian meets Oracle (+APEX)

Fun, Oracle

Nachfolgend gibt es eine kleine Anleitung wie man Oracle XE mit APEX in Debian Linux installiert. Das ganze erfolgt innerhalb von VirtualBox, sollte aber natürlich auch auf realer Hardware funktionieren.

Zunächst wird Debian Linux installiert. Genauer gesagt die aktuelle Version 8.2, Codename „Jessie“. Man sollte dafür mindestens 3 GB RAM und 9,25 GB Platz haben bzw. zur Verfügung stellen. Als Installationsmedium hab ich die knapp 250MB große 64-Bit-PC Netinst-ISO Datei geladen und anschließend gebootet bzw. eingebunden. Der Installationsvorgang erfordert keine besonderen Einstellungen. Lediglich bei der Softwareauswahl sollte man aufpassen auch nur den SSH server und die standard system utilities zu installieren.

Diese Diashow benötigt JavaScript.

Anschließend muss man noch ein wenig das System modifizieren. Da Debian das einzige Betriebssystem ist kann etwa die Wartezeit im GRUB Bootmanager verkürzt werden. Dazu die Zeile in /etc/default/grub mit GRUB_TIMEOUT=10 abändern in z.B. GRUB_TIMEOUT=1. Damit die Einträge auch wirksam werden muss noch update-grub auf der Konsole eingegeben werden.
Auch müssen noch zwei Pakete nachinstalliert werden bzw. die Skripte des OXAR Projektes welche letztlich die Knochenarbeit der Installation übernehmen werden.

apt-get install curl git-core
cd /opt
git clone https://github.com/OraOpenSource/OXAR.git

Bevor mit dem nächsten Schritt begonnen wird sollte man seine bis hierher getane Arbeit sicherheitshalber mit einem Snapshot sichern.

Nun geht es an die eigentliche Konfiguration. Dazu muss man zunächst die Datei config.properties in /opt/OXAR/ anpassen. Die 3 URLs zum Download der Oracle Software müssen angegeben werden und die Firewall entsprechend konfiguriert werden.

Die relevanten Dateien bekommt man von Oracle nur wenn man zuvor einen account angelegt hat. Die Datenbank (als rpm Paket) gibt es etwa hier, APEX findet man hier und ORDS gibt es hier. Das ganze lädt man dann irgendwo hin wo man per URL rankommt. Erfolgreich getestet habe ich mit:

  • oracle-xe-11.2.0-1.0.x86_64.rpm.zip
  • apex_5.0_en.zip
  • ords.3.0.0.121.10.23.zip
OOS_ORACLE_FILE_URL=http://your_server_address_and_the_oracle-xe_file
OOS_APEX_FILE_URL=http://your_server_address_and_the_apex_file
OOS_ORDS_FILE_URL=http://your_server_address_and_the_ords_file
OOS_FIREWALL_TOMCAT_YN=Y
OOS_FIREWALL_ORACLE_YN=Y

Während nun die Konfiguration via buid.sh in /opt/OXAR/ gestartet wird kann man ruhig Kaffee trinken gehen… Das dauert jetzt ne ganze Weile!

Wenn alles fertig ist ändert man noch in /etc/hosts die Zeile

127.0.0.1 localhost

zu

127.0.0.1 debian  localhost

und fährt das System runter.

Jetzt muss man noch last but not least in der VM die Ports nach draussen freigeben. Bei mir sieht das etwa so aus: portsJetzt kann man sich im Host in APEX anmelden via http://localhost:9980/ords
Die DB erreicht man (z.B. mit SQL Developer) indem man bei Hostname localhost, als Port 9921 und bei SID xe einträgt.
SSH geht von draussen bei DEBIAN nicht als root. Man kann sich aber als oracle user anmelden via ssh -p 9922 oracle@localhost

Ich hoffe das hier hilft den ein oder anderen bei sich lokal ne funktionierende Testumgebung aufzubauen. Feedback jederzeit gern!

P.S. Hier noch die wichtigsten Passwörter als Übersicht:

Funktion User Pass
Systemuser bei Debian root oracle
Systemuser bei Debian oracle oracle
APEXuser bei workspace OOS_USER oos_user oracle
APEXuser bei workspace INTERNAL admin Oracle1!
DBuser oos_user oracle
DBuser sys oracle
DBuser system oracle
DBuser apex_public_user oracle

Bash Script zum Download von Flash Videos oder: Wie downloade ich ein Video im Streaming?

Bash, Fun

Guckt man irgendein Video im Internet und handelt es sich um modernes HTML5 (mit meistens mp4 Dateien), dann kann man auf verschiedenen Wegen sich das Video auch downloaden. Egal ob der Quelltext durchwühlt wird um dann den Link an curl oder wget weiterzureichen, mittels Menüpunkt „Extras > Seiteninformationen > Medien“ (im Firefox) oder auch via Add-on (Firefox) – an solcherlei Videos kommt man leicht.

Schwieriger ist es hingegen, wenn ein Video via Flash gestreamt wird. Da kann man mit der swf Datei oftmals nicht viel anfangen. Aber irgendwo muss doch das bereits gestreamte in Bits und Bytes auf der Platte sein?
Und nachdem ich mir diese Frage stellte und etwas gegoogelt hatte fand ich dann auch eine Antwort welche ich in dieses kleine Script gepackt habe. Damit werden alle derzeit in Streaming befindlichen Videos lokal gespeichert. Mit einem gängigen Videoplayer wie VLC können diese dann auch offline begutachtet werden…

#!/bin/bash

# check if pid exists
pid=`ps aux | grep libflashplayer.so | grep /usr/lib | awk '{print $2}'`
#echo $pid
if [[ $pid ]]; then
# find dir
idx=0
for dir in `lsof -p $pid | grep deleted | awk '{print $4}'`
do
#echo $dir
idx=$((idx + 1))
dir=${dir//[!0-9]/}
# copy video
echo "Trying to save video $idx..."
`cp /proc/$pid/fd/$dir stream_video_$idx`
done
else
echo "ERROR: Unknown error..."
fi