seit Fritz!OS gibt awk ein 'segmentation fault' in mein bash script

frater

Mitglied
Mitglied seit
23 Nov 2008
Beiträge
455
Punkte für Reaktionen
3
Punkte
18
seit Fritz!OS gibt awk ein 'segmentation fault' in mein bash script wenn ich es als zabbix ausführe...

Mit Zabbix kann ich mein Freetz monitoren.
Für die "saturation" des DSL habe ich dieses script geschrieben dass immer funktioniert hat auf 7270 und 7390

Seit Fritz!OS läuft es nicht mehr.
Die Zabbix agent darf nicht als root laufen und läuft als user zabbix.

Code:
root@fritz:/# sudo -u zabbix adsl.saturation rx
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault

root@fritz:/# adsl.saturation rx
1


Ein einfacher Beispiel:
Code:
root@fritz:/var/tmp# cat test
#!/bin/sh

echo 'ab cd' | awk '{print $2}'

root@fritz:/var/tmp# ./test
cd
root@fritz:/var/tmp# sudo -u zabbix ./test
Segmentation fault





root@fritz:/var/tmp# cat /sbin/adsl.saturation
Code:
#!/bin/sh

# You do need to turn on support for %N (nanoseconds) in busybox

# the parameter rx or tx has to be given
echo "$1" | egrep -q '^(tx|rx)$' || exit 1

STATDIR=/sys/class/net/adsl/statistics
STATFILE=$1_bytes
[ -e ${STATDIR}/${STATFILE} ] || exit 1

# Create a file in /tmp to fetch the previous sample
SCRATCH=/tmp/${0##*/}.$1

# Fetch the corresponding DSL-speed of physical layer
if [ $1 = 'rx' ] ; then
 showdsldstat >/var/showdsldstat
 DSL_SPEED=`grep -m1 '^speed' /var/showdsldstat | awk '{print $2}' | awk -F/ '{print $1/1000}'`
else
 # 'showdsldstat >/var/showdsldstat' only has to run each minute (so only in the 'rx run') ... only if the file isn't created yet (after reboot) and tx is the first, it will be called within the 'tx run'
 if [ ! -e /var/showdsldstat ] ; then
   sleep 3
   [ -e /var/showdsldstat ] || showdsldstat >/var/showdsldstat
 fi
 DSL_SPEED=`grep -m1 '^speed' /var/showdsldstat | awk '{print $2}' | awk -F/ '{print $2/1000}'`
fi

# Fetch date and Bytes from ADSL-interface
NOW_TIME=`date +%s.%N`
NOW_BYTES=`cat ${STATDIR}/${STATFILE}`

# On first run, these vars do not exist
LAST_BYTES=${NOW_BYTES}
LAST_TIME=0

# read previous values
[ -f ${SCRATCH} ] && . ${SCRATCH}

# Sanity check in case previous value is somehow off
LAST_BYTES=`echo "${NOW_BYTES} ${LAST_BYTES}" | awk '{if($1 > $2) {print $2} else print $1}'`

DIFF_BYTES=`echo "${NOW_BYTES} ${LAST_BYTES}" | awk '{print $1 - $2}'`
DIFF_TIME=`echo  "${NOW_TIME} ${LAST_TIME}"   | awk '{print $1 - $2}'`

BITS_PER_SEC=`echo "${DIFF_BYTES} ${DIFF_TIME}" | awk '{printf"%.0f\n", 8 * $1 / $2}'`

# Write Bytes and Time to ${SCRATCH}
echo -e "LAST_BYTES=${NOW_BYTES}\nLAST_TIME=${NOW_TIME}" >${SCRATCH}

# There's some overhead going from ATM over DSL to Ethernet (PPPoA)... a bit less for PPPoE
NETTO=0.895
# grep -qi '/PPPoE' /var/showdsldstat && NETTO=0.91

# echo "${BITS_PER_SEC} ${DSL_SPEED} ${NETTO}"
RETVAL=`echo "${BITS_PER_SEC} ${DSL_SPEED} ${NETTO}" | awk '{printf"%.0f\n", $1 / ($2 * $3 * 10)}' 2>/dev/null`
[ -z '${RETVAL}' ] && RETVAL=0
echo ${RETVAL}
 
Zuletzt bearbeitet:
Siehe hier und in den weiteren Posts. Das Problem hast nicht nur du. Aber eine Lösung ist bis jetzt nicht in Sicht.
 
Dass Problem mit awk ist nur in kombination mit 'sudo'
Das script funktioniert noch immer mit die neuen Fritz!OS.....
Ich musste nur die zabbix agent auf Freetz neu starten......

Beim untersuchen bin ich auf dieses Problem gestossen....
Das Problem ist auch früher entstanden. Nicht nachdem ich nach Fritz!OS gegangen bin.
Ich habe auch 7390 Freetz wo kein Problem mit awk und sudo ist
 
Ich bräuchte schon ein einfaches awk Skript (ohne sudo) aufruf, das den Fehler zeigt...

Gruß
Oliver
 
Funktioniert bei euch "awk" auf der Kommandozeile? Bei mir muss ich Ctrl+C drücken, damit ich wieder ein Prompt habe. Normalerweise sollte die Hilfe von awk ausgegeben werden.
 
Ja? 7270 v3 mit aktuellem Trunk:
Code:
root@fritz:/var/mod/root# awk
BusyBox v1.19.4 (2012-05-10 13:15:12 CEST) multi-call binary.

Usage: awk [OPTIONS] [AWK_PROGRAM] [FILE]...

        -v VAR=VAL      Set variable
        -F SEP          Use SEP as field separator
        -f FILE         Read program from FILE

root@fritz:/var/mod/root#
 
Ich bräuchte schon ein einfaches awk Skript (ohne sudo) aufruf, das den Fehler zeigt...

Gruß
Oliver

Im Ende habe ich nur ein Problem in Kombination mit sudo.
Ich habe mehrere Freetzen und die alteren geben kein Problem mit sudo.

Wenn zabbix (lauft als user zabbix) dieses script ausfuhrt gibt es kein Problem.
Dieser Fehler ist nur beim troubleshooting nach vorne gekommen.

Ich wurde noch immer gerne 'sudo' im standard Konfiguration haben,,,
So auch Zabbix.

Vielleicht gibt es dann mehrere Benutzer.
Es ist wirklich ganz schon um auf dieser Weise die Kontrolle uber diese gerate zu haben,
 
Bitte nochmal mit aktuellem Trunk und busybox 1.20.x probieren.

Gruß
Oliver
 
Es funktioniert jetzt wieder einwandfrei

Dieser code gab niemals Problemen:
Code:
sudo -u zabbix awk

Aber ein bash-script mit inhalt:
Code:
#!/bin/sh
awk

und danach
Code:
sudo -u zabbix ./test

Gab ein "Segmentation fault"

Jetzt funktioniert es wie erwartet
Code:
# sudo -u zabbix ./test
BusyBox v1.20.1 (2012-06-18 13:20:58 CEST) multi-call binary.

Usage: awk [OPTIONS] [AWK_PROGRAM] [FILE]...

        -v VAR=VAL      Set variable
        -F SEP          Use SEP as field separator
        -f FILE         Read program from FILE

Ist es einfach zu erklären was sich geändert hat?
 
Zuvor war Busybox version 1.19.4 in Benutzung, jetzt wurde vor kurzem zu Busybox 1.20.1 geupdated, siehe das Offizielle Changelog: http://busybox.net/ (Direkt auf der Startseite)
 
Kostenlos!

Statistik des Forums

Themen
248,921
Beiträge
2,305,140
Mitglieder
378,646
Neuestes Mitglied
fusionK