[gelöst] AWK-Ausgabe bei Aufruf über xinetd leer

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von heisenberg » 14.09.2022 22:10:35

Hallo zusammen,

ich habe ein Problem, dass ein Programm normal in der Shell die gewünschte Ausgabe erzeugt, über xinetd aber nicht funktioniert. Ich habe das Problem heruntergebrochen darauf, dass es das awk-Script ist, was einfach keine Ausgabe erzeugt.

Hier ist der relevante Script-Ausschnitt:

Code: Alles auswählen

#!/bin/bash

export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# smartctl output of this special nvme ssd - relevant line
#
# === START OF SMART DATA SECTION ===
# ...
# Data Units Written:                 1.867.600 [956 GB]
# ...

export DEVICE=/dev/nvme0n1
export DATA="$(/usr/sbin/smartctl -A $DEVICE)"

# debug smartctl output
/usr/bin/echo "$DATA" >/dev/shm/smartctl_output.txt

/usr/bin/echo "$DATA" | /usr/bin/strace -o /tmp/awk.log /usr/bin/awk '
        match($0, "Data Units Written.*[[:space:]]([0-9\\.]*) \\[([0-9]+) ([a-zA-Z]+)]",r) {
                        gsub("\\.","",r[1])
                        units_written=r[1]
                        space_written=r[2]
                        space_unit=r[3]

                        print units_written,space_written,space_unit
                }' >/dev/shm/nvme0n1_data 2>/dev/shm/nvme0n1_log

read units_written space_written space_unit </dev/shm/nvme0n1_data

# debug variables content output
echo units_written=$units_written
echo space_written=$space_written
echo space_unit=$space_unit
Anmerkungen dazu:
  • xinetd für das übergeordnete Script läuft als root(Security-Diskussion interessiert mich an dieser Stelle gerade nicht)
  • Die Datei smartctl_output.txt enthält immer eine korrekte smartctl-Ausgabe(normale Shell und via xinetd)
  • Die 3 Variablen sind beim Aufruf aus der Shell her gefüllt, und per xinetd leer
  • Die Strace-Ausgabe für den AWK-Aufruf ist bei beiden Aufrufen(in der interaktiven Shell und via xinetd) strukturell scheinbar absolut identisch, nur die ganzen Speicheradressen sind natürlich unterschiedlich.
  • Die Fehlerausage /dev/shm/nvme0n1_log ist beim Aufruf über xinetd auch leer
  • GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1)
Was könnte das sein?

Nachtrag:

Wenn ich am Ende das awk-Scriptes in diesem noch ein { print $0 } anfüge, d. h. schreibe bitte jede Ausgabe der Eingabedaten in die Datei, dann passiert das auch. In der Datei steht dann die komplette Smart-Ausgabe. D. h. das AWK-Script funktioniert wohl grundsätzlich. Nur eben die Variablen werden wohl nicht gefüllt. D. h. das Muster trifft da vermutlich nie zu?
Zuletzt geändert von heisenberg am 15.09.2022 02:07:07, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
TRex
Moderator
Beiträge: 8071
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von TRex » 14.09.2022 22:23:25

Ich würde das mal in nem env ohne Umgebungsvariablen probieren, ggf. mal env ebenfalls dumpen. Ist das nächstbeste, was mir dazu einfällt.

Falls das nicht tut: hilfreich für uns ist evt auch, was du an debug-Dateien hast - können natürlich auch raten, welcher Teil möglicherweise in nem anderen env instabile Ausgaben liefern könnte :D
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von JTH » 14.09.2022 22:25:30

Mir fällt spontan ein, dass sich in den beiden Umgebungen vllt die locale unterscheidet – auch wenn mir noch kein Grund dazu einfallen will, warum das bei den Eingabedaten und da du nicht sortierst o.ä., relevant wär.

Und ich muss fragen ;): Gibt es einen Grund, warum du das Binary echo benutzt, statt (ohne Pfad) die in der Shell eingebaute gleichnamige, garantiert schnellere Funktion(alität)?
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von heisenberg » 14.09.2022 22:27:34

TRex hat geschrieben: ↑ zum Beitrag ↑
14.09.2022 22:23:25
Ich würde das mal in nem env ohne Umgebungsvariablen probieren, ggf. mal env ebenfalls dumpen. Ist das nächstbeste, was mir dazu einfällt.
Ok. Wenn ich dass da ausführe in der Shell...

Code: Alles auswählen

exec env --ignore-environment /bin/bash
... dann habe ich den Fehler auch in der interaktiven Shell.
Und ich muss fragen ;): Gibt es einen Grund, warum du das Binary echo benutzt, statt (ohne Pfad) die in der Shell eingebaute gleichnamige, garantiert schnellere Funktion(alität)?
Ja. Es gibt einen Grund. Ich wollte dass in beiden Umgebungen das gleiche ausgeführt wird. Deswegen habe ich das temporär mal ersetzt.
Mir fällt spontan ein, dass sich in den beiden Umgebungen vllt die locale unterscheidet – auch wenn mir noch kein Grund dazu einfallen will, warum das bei den Eingabedaten und da du nicht sortierst o.ä., relevant wär.
Bingo!

Wenn ich das folgende vor Aufruf des Scriptes setze ...

Code: Alles auswählen

LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
...dann habe ich auch den Fehler. Ich schaue morgen mal weiter...
Falls das nicht tut: hilfreich für uns ist evt auch, was du an debug-Dateien hast - können natürlich auch raten, welcher Teil möglicherweise in nem anderen env instabile Ausgaben liefern könnte :D
Du meinst die smartctl-Ausgabe? Das wäre dass da:

Code: Alles auswählen

+ smartctl -A /dev/nvme0n1
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.13.19-6-pve] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF SMART DATA SECTION ===
SMART/Health Information (NVMe Log 0x02)
Critical Warning:                   0x00
Temperature:                        40 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    0%
Data Units Read:                    70,478 [36.0 GB]
Data Units Written:                 1,870,050 [957 GB]
Host Read Commands:                 1,481,804
Host Write Commands:                20,721,598
Controller Busy Time:               98
Power Cycles:                       6
Power On Hours:                     21
Unsafe Shutdowns:                   0
Media and Data Integrity Errors:    0
Error Information Log Entries:      1
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0
Temperature Sensor 1:               40 Celsius
Temperature Sensor 2:               41 Celsius
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
TRex
Moderator
Beiträge: 8071
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von TRex » 14.09.2022 22:44:31

Hm, erst hats nicht funktioniert (awk -f heisenberg.awk heisenberg.log), dann ist mir aufgefallen, dass du nach Punkten suchst. In der Ausgabe sind aber Kommas zur Tausendertrennung.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von JTH » 14.09.2022 22:49:46

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.09.2022 22:27:34
Ja. Es gibt einen Grund. Ich wollte dass in beiden Umgebungen das gleiche ausgeführt wird. Deswegen habe ich das temporär mal ersetzt.
Ah, klar, kann ich verstehen, dass man das auf der Fehlersuche mal macht.

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.09.2022 22:27:34
Bingo!

Wenn ich das folgende vor Aufruf des Scriptes setze ...
Heureka. Verstehen tu ichs zu dieser Uhrzeit trotzdem nicht mehr, warum das den Unterschied verursacht. gawk kennt --posix und POSIXLY_CORRECT um sich mehr Posix-gerecht zu verhalten, vllt wird das auch vom entsprechenden Locale getriggert?


TRex hat geschrieben: ↑ zum Beitrag ↑
14.09.2022 22:44:31
Hm, erst hats nicht funktioniert (awk -f heisenberg.awk heisenberg.log), dann ist mir aufgefallen, dass du nach Punkten suchst. In der Ausgabe sind aber Kommas zur Tausendertrennung.
Ah, damit könntest du die Lösung haben :) Wenn heisenberg das Skript manuell ausführt, hat er wahrscheinlich eine Locale mit den im deutschsprachigen typischen Punkten als Tausendertrennung. Der Server wird wohl eine englische Locale benutzen wo es stattdessen das Komma ist und damit greift der reguläre Ausdruck nicht mehr :THX:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von heisenberg » 14.09.2022 23:18:01

TRex hat geschrieben: ↑ zum Beitrag ↑
14.09.2022 22:44:31
Hm, erst hats nicht funktioniert (awk -f heisenberg.awk heisenberg.log), dann ist mir aufgefallen, dass du nach Punkten suchst. In der Ausgabe sind aber Kommas zur Tausendertrennung.
Ja. Ich denke das ist es. Ich habe beim Debuggen nur geschaut, ob die smartctl-Ausgabe da ist. Dass da aber 1000er-Kommas da sind, dass ist mir tatsächlich nicht aufgefallen.

Schanke Dön!
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
heisenberg
Beiträge: 3548
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: AWK-Ausgabe bei Aufruf über xinetd leer

Beitrag von heisenberg » 15.09.2022 02:06:28

Problem gelöst.

War also der Klassiker "Andere LOCALE in anderer Ausführungsumgebung".

Das nächste mal doch wieder ein LC_ALL=C an den Script-Anfang.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten