Run Unix Shell

Das Modul startet ein Unix Shell Commando, wartet auf das Ergebnis der Ausführung und schreibt bei Bedarf das STDOUT ins datasqill Log. Falls bei der Ausführung des Commandos ein Fehler Auftritt, dann läuft das Modul auf Fehler und zeigt das Ergebnis aus dem STDERR. Die STDOUT und STDERR können in dem Run nachgesehen werden. Das Commando wird mit dem datasqill Unix User gestartet.

Das Modul kann zum Ausführen von Shell Commandos als auch für Steuerung von externen Tools verwendet werden. Das Modul unterstützt Apache freemarker Logik und kann auch datasqill Variablen in der Action Body verwenden.

Name Bedeutung
Modul Run Unix Shell
Modulklasse DsModRunShell
Typ Java
Zweck Unix Commandos ausführen
Transformationscode Shell Commando(s)
Quellen keine zwindeng notwendig
Ziele keine zwindeng notwendig

Attribute

Name Typ Bedeutung
Monitor Stdout Boolean Schreibe STDOUT in die datasqill Log. Der stdout log ist in dem Run ersichtlich.
Loop Query SQL Query um shell-Aufrufe mehrfach mit Parametern aufzurufen
Error if Loop empty Boolean Wenn angeschaltet und die Loop Query gibt keine Ergebnisse dann wird die Transformation mit einem Fehler beendet

Variablen

Folgende Variablen stellt das Modul immer zur Verfügung:

Name Datentyp Bedeutung
request_id Number Id des eindeutigen Requests (Siehe request-Tabelle)
schedule_date String Startdatum in UTC Zeit des Batches im Format yyyy-MM-ddTHH:mm:ss.SSSSSSSSSZ
action String Die Transformationsanweisung (Shell script)
iteration Number Bei Loop Queries gibt es eine fortlaufende Nummer pro Loop Ergebnis. Sonst 1
batch_instance_id Number Id der Batch Instance (Laufender Batch), bzw. -1 beim Validate
action_id Number Id der Action (Transformation)
action_name Number Name der Action (Transformation)
module_name Number Name des Moduls
module_start_timestamp String Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd HH:mm:ss.SSS
module_start_datetime String Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd HH:mm:ss
module_start_date String Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd
module_utc_start_timestamp String Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd HH:mm:ss.SSS
module_utc_start_datetime String Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd HH:mm:ss
module_utc_start_date String Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd
connection_id Number Database ID (Connection ID) der Datenbankverbindung wenn es eine Loop Query gibt
sources Object Eine Liste der Quellobjekte vom Datentyp ObjectDs
targets Object Eine Liste der Zielobjekte vom Datentyp ObjectDs

Wenn es eine loopquery gibt, dann werden alle Ergebnisspalten der loop Query auch noch als Variablen zur Verfügung gestellt.

Der Datentyp ObjectDs leitet sich direkt aus der Tabelle vv_sqts_object in der Repositorydatenbank ab:

Name Datentyp Kommentar
sqtsObjectId Number Eindeutige ID des Objekts (Tabelle)
sqtsObjectTypeId Number ID des ObjektTyps.
serverId Number ID des Connection (database_id)
objectName Number Names des Objekts (Tabellenname)
objectOwner Number Names des Owners (Schemaname)
objectPartition Number Partitionsname

Ausgabe auf STDOUT

Die Ausgabe des shell sripts kann nach Bedarf in den Ablaufdaten gespeichert werden, sodas die Ausgabe in der datasqill GUI angezeigt werden kann.

Zusätzlich kann man auch Ausgaben erzeugen, die in die Logs geschrieben werden sollen oder statistische Informationen zu der Anzahl der verarbeiten Datensätze speichern sollen.

Dazu kann man den Modus der Ausgabe auf Kanäle umschalten. Dazu gibt es die folgenden Befehle die als ganze Zeile gesendet werden können:

#datasqill stdout#
#datasqill log#
#datasqill stat#

Mit einem dieser Befehle schaltet man in den gewünschten Ausgabemodus (Kanal). Standardmäßig ist der Kanal stdout ausgewählt.

Kanal stdout

Die normale Ausgabe des shell sripts kann nach Bedarf in den Ablaufdaten gespeichert werden, sodas die Ausgabe in der datasqill GUI angezeigt werden kann.

Kanal log

Auf diesem Kanal wird ein JSON erwartet. Das Json hat folgendes Format:

{
  "level" : "SEVERE/WARNING/INFO/CONFIG/FINE/FINER/FINEST",
  "message" : "Your log message here"
}
  • Die Groß- und Kleinscheibung beim level ist beliebig.
  • Wird kein valides Json geschickt, dann wird die Nachricht ignoriert
  • Diese Log Meldungen werden an das bestehende Logging System von datasqill gesendet

Kanal stat

Auf diesem Kanal wird ein JSON erwartet. Das Json hat folgendes Format:

[
    { "serverId" : 1, "name": "stat 1", "value": 34 },
    { "serverId" : 1, "name": "stat 2", "value": 15 },
    { ... },
    { "serverId" : 1, "name": "stat n", "value": 5 }
]
  • serverId gibt die Connection nummer an für die die Werte gelten
  • die Groß- und Kleinscheibung bei name ist beliebig
  • Es werden bei serverId und value numerische Werte erwartet
  • Wird kein valides Json geschickt, dann wird die Nachricht ignoriert
  • Es wird derzeit die letzte Statistik angezeigt, falls mehrere empfangen wurden
Die folgenden statistischen Werte (für name) werden aktuell angeboten: Name Bedeutung
rows_processed Anzahl verarbeiteter Zeilen
rows_ins Anzahl eingefügter Zeilen
rows_del Anzahl gelöschter Zeilen
rows_upd_ignored Anzahl Zeilen die ignoriert wurden
rows_upd_non_versioned Anzahl Zeilen, die nicht versioniert geändert wurden
rows_upd_versioned Anzahl Zeilen, die versioniert geändert wurden
rows_upd_non_increment Anzahl Zeilen, die ohne increment Erkennung geändert wurden
rows_rejected Anzahl abgelehnter Zeilen
row_width Maximale Zeilenbreite aller rows
read_duration Lesezeit in µ Sekunden
write_duration Schreibzeit in µ Sekunden
convert_duration Sonstige Zeit in µ Sekunden
delete_duration Löschzeit in µ Sekunden
java_memory Maximale Größe des verwendeten Heaps
tempspace Maximal verwendeter Temporärer-Tablespace
pga_memory Maximal verwendeter Datanbank-Arbeitsspeicher
session_id Session Nr

Beispiele

Die Beispiele zeigen den Code der Action Body.

Einfache Shell Commandos starten

sleep 5
echo "I am awake"

Shell Commandos mit Verwendung von freemarker direkt in der Action Body.

sleep 5
echo "I am awake at ${.now?string.iso}"

Shell Script starten

~/my_script.sh ${batch_instance_id}

Starten eines externen Python-Scripts parametrisiert mit dem Datum

python3 script.py '${schedule_date?string[0..9]}'

Shell Commandos bei der Verwendung von freemarker den Interpreter ausschalten

# Der Interpreter ist an. Somit ersetzt freemarker die Variable
# Ist die Variable im freemarker nicht gesetzt, meldet freemarker einen Fehler
echo ${free_marker_variable}

[#noparse]
# Der Interpreter ist aus. Somit ersetzt freemarker nichts mehr
echo ${bash_variable}

[/#noparse]
# Der Interpreter ist an. Somit ersetzt freemarker die Variable
# Ist die Variable free_marker_variable_2 im freemarker nicht gesetzt, dann wird der text "ansonsten" genommen
echo ${free_marker_variable_2!ansonsten}
# Ist die Variable free_marker_variable_3 im freemarker nicht gesetzt, dann ist der Text leer
echo ${free_marker_variable_3!}

# Gibt die Konkatination von einer freemarker und einer Bash Variablen aus
echo ${free_marker_variable}[#noparse]${bash_variable}[/#noparse]

Ausgabe von Logs und Statistiken

echo "Dieses ist eine normale Meldung"
echo "#datasqill log#"
echo '{ "level": "fine", "message": "Log-Meldung sddssdsdsd" }'
echo '{ "level": "info", "message": "Info-Meldung1" }'
echo '{ "level": "xxx", "message": "Info-Meldung2" }'
echo "#datasqill log#"
echo '{ "level": "xxx", "message": "Info-Meldung3" }'
echo "#datasqill stdout#"
echo "Dieses ist wieder eine normale Meldung"
echo "#datasqill stat#"
cat << EOF
[
    { "serverId" : 10, "name": "rows_processed", "value": 34 },
    { "serverId" : 10, "name": "rows_ins", "value": 15 },
    { "serverId" : 10, "name": "rows_upd_versioned", "value": 14 },
    { "serverId" : 10, "name": "rows_del", "value": 5 }
]
EOF
echo "#datasqill stdout#"
echo "Und wieder eine normale Meldung"
echo "#datasqill log#"
sleep 1
echo '{ "level": "warning", "message": "Test warning" }'
echo "#datasqill stdout#"
echo ${request_id}

Dazu die stdtout-Ausgabe:

Dieses ist eine normale Meldung
Dieses ist wieder eine normale Meldung
Und wieder eine normale Meldung
95420

Und das Logging (Auszug):

2025.11.13 18:49:58.561 [DsModRunShell runInLoop] [#include "dsmod_runshell.ftl"]
${interpret(action)}
2025.11.13 18:49:58.687 [          Shell fine] Log-Meldung sddssdsdsd
2025.11.13 18:49:58.687 [          Shell info] Info-Meldung1
2025.11.13 18:49:58.693 [           Shell xxx] Info-Meldung2
2025.11.13 18:49:58.693 [           Shell xxx] Info-Meldung3
2025.11.13 18:49:59.682 [       Shell warning] Test warning
2025.11.13 18:49:59.683 [DsModRunShell runInLoop] Loop Query end

Man beachte, dass die Log-Ausgaben live sind. So erscheint die Log Ausgabe "Test warning" eine Sekunde nach der vorherigen.

Und hier die Statistiken:

Statistics