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 |
| 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 |
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 |
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.
Die normale Ausgabe des shell sripts kann nach Bedarf in den Ablaufdaten gespeichert werden, sodas die Ausgabe in der datasqill GUI angezeigt werden kann.
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"
}
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 }
]
| 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 |
Die Beispiele zeigen den Code der Action Body.
sleep 5
echo "I am awake"
sleep 5
echo "I am awake at ${.now?string.iso}"
~/my_script.sh ${batch_instance_id}
python3 script.py '${schedule_date?string[0..9]}'
# 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]
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:
