• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Start-/Stop-Skript in Runlevel läuft nur teilweise

Hallo Leute,

ich brüte hier seit längerer Zeit über einem Start-/Stop-Initskript, das nicht so will wie ich :-(

Das Skript soll bei Systemstart die Wlan-Datenzähler RX und TX auf Null setzen. Das klappt.

Beim Shutdown soll die seit letztem Zurücksetzen von RX und TX angefallene Datenmenge ermittelt, mit der bisherigen Datenmenge addiert und dann gespeichert werden. Hier gibt es Probleme.

Wenn ich das Skript von Hand mit „Skriptname start“ starte oder „Skriptname stop“ stoppe klappt alles wunderbar – keine Fehlermeldungen in der Shell.

Ok, ich könnte das Problem umgehen, indem ich den „Starteil“ hinter den „Stopteil“ setze, doch wäre das m. M. n. nicht so sauber und außerdem geht es mir hier auch ums Prinzip ein Start-/Stop-Skript zum Laufen zu bringen.

Im Internet habe ich gelesen, dass die Parameter „start“ und „stop“ durch die Namensgebung der Verlinkung in /etc/init.d/rc?.d/ festgelegt wird. Wenn der Link mit S??... beginnt wird „start“ übergeben, wenn er mit K??... anfängt ein „stop“. Das habe ich (von Hand – YaST legt das so nicht an!?) probiert, jedoch ohne Effekt außer, dass in YaST dann der markierte Runlevel 0 und 6 gelöscht wurde. In YaST hatte ich die Runlevel 0 3 5 6 aktiviert.

Das Skript ist mit chmod 755 ausführbar gemacht. Es verzweigt nicht auf andere Skripte. Die gewünschten Aktionen befinden sich komplett innerhalb des Start-/Stop-Skriptes.

Hat jemand ne Idee? Oder kann es daran liegen, dass ich im Dateinamen eckige Klammern [] verwendet habe? Das Skript sieht so aus:

Code:
#! /bin/bash
################################################################################################
#													#
#	Init-Skript, das beim Systemstart und Shutdown ausgeführt wird.					#
#													#
#	Startup: IP-Zähler RX und TX der wlan0-Schnittstelle auf Null setzen				#
#	Shutdown:IP-Traffic der Sitzungen einer Abrechnungsperiode addieren und in einer Datei sichern	#
#													#
#	fertiges Skript speichern in /etc/init.d, ausführbar machen und im Runlevel-Editor aktivieren.	#
#	18.05.2013 /mp											#
#													#
################################################################################################
### BEGIN INIT INFO
# Default-Start:	3 5
# Default-Stop:		0 6
# Short-Description:	Start: Resetting RX+TX; Stop: Internettraffic sichern
# Description:		längere Beschreibung noch verfassen
### END INIT INFO

PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
Schnittstelle=wlan0

echo "Running IP-Traffic...."

case "$1" in
	start)
		echo "Start: resetting RX + TX "
		# hier kommen alle Befehle hin, die beim Booten ausgeführt werden sollen
		# ggf. am Ende der Zeilen ein & einfügen, damit der Bootvorgang nicht stoppt
		Treiber=`/sbin/ethtool -i $Schnittstelle | grep driver | awk {'print $2'}`		# Treiber der Schnittstelle isolieren
		/sbin/modprobe -r $Treiber					 			        # Treiber stoppen
		sleep 1								# kurz warten
		/sbin/modprobe $Treiber					# und Treiber wieder starten -> RX und TX sind jetzt auf Null gesetzt
		# sleep 1								# nicht nötig, wenn die Schnittstelle vom NetworkManager verwaltet wird
		# ifup $Schnittstelle						# Bei NetworkManager nicht nötig
	;;
	stop)
		echo "Stop: Datentraffic ermitteln und sichern"
# hier kommen alle Befehle hin, die beim Herunterfahren des Systems ausgeführt werden sollen
# sonst wie oben
#
#
#
		#################################################################################################
#                                                                                               #
#       Wlan-Traffic protokollieren                                                             #
#       16.05.2013 /mp                                                                          #
#                                                                                               #
#       ifconfig muss für den user als sudo freigegeben sein!                                   #
#                                                                                               #
################################################################################################################################################################################################
#       Variablen definieren                                                                    #
################################################################################################
		Path="/var/log/"
		Datei="-Internetvolumen.log"
		PayDay=1                                                                                # der 1. des Monats ist Zahltag/Abrechnungstag?
		Monat=`date +%b`                                                                   # zur Unterscheidung der Log-Dateien den Monat auslesen
		#
		################################################################################################
#       Datum ermitteln, um ab Providerabrechnungstag wieder mit 0 zu beginnen                  #
################################################################################################
		#
		if test `date +%d` = $PayDay                                                     # Beginnt heute der neue Abrechnungszeitraum des Providers?
		then                                                                                       # ja
        		if test -e $Path$Monat$Datei                                              # nach einem Reboot könnte die Datei schon existieren
        		then                                                                               # ja, gibts schon
                		WlanRX_Bytes="`/sbin/ifconfig wlan0 | grep 'RX bytes:' | awk {'print $2'} | tr -d 'bytes:'`"
                		WlanTX_Bytes="`/sbin/ifconfig wlan0 | grep 'RX bytes:' | awk {'print $6'} | tr -d 'bytes:'`" 
				################################################################################################
#       Kein Ethernet-Verkehr, sonst hier analog ermitteln und addieren                         #
################################################################################################
				Sum_Traffic=`expr $WlanRX_Bytes + $WlanTX_Bytes`        # aktuellen Traffic von RX und TX addieren
				Sum_Traffic_Alt=`cat $Path$Monat$Datei`                       # Alten Traffic auslesen
				Sum_Traffic_Neu=`expr $Sum_Traffic + $Sum_Traffic_Alt`   # aktueller Traffic zzgl. altem Traffic = Neuer Traffic
				echo $Sum_Traffic_Neu > $Path$Monat$Datei                # Ergebnis sichern
			else                                                                               # nein, Log-Datei gibts noch nicht
				echo "0" > $Path$Monat$Datei                                    # Dann mit neuer Datei beginnen und IP-Traffic auf Null setzen 
				chmod 666 $Path$Monat$Datei                                   # Alle können lesen und schreiben
				Sum_Traffic_Neu=0 
			fi
		else                                                                                       # Heute ist nicht der Providerabrechnungstag
			if test -e $Path$Monat$Datei                                             # Existiert die Log-Datei?
			then                                                                              # ja, die Datei existiert
				WlanRX_Bytes="`/sbin/ifconfig wlan0 | grep 'RX bytes:' | awk {'print $2'} | tr -d 'bytes:'`"
				WlanTX_Bytes="`/sbin/ifconfig wlan0 | grep 'RX bytes:' | awk {'print $6'} | tr -d 'bytes:'`"
				################################################################################################
#       Kein Ethernet-Verkehr, sonst hier analog ermitteln und addieren                         #
################################################################################################
				Sum_Traffic=`expr $WlanRX_Bytes + $WlanTX_Bytes`                 # aktuellen Traffic von RX und TX addieren
				Sum_Traffic_Alt=`cat $Path$Monat$Datei`                                # Alten Traffic auslesen
				Sum_Traffic_Neu=`expr $Sum_Traffic + $Sum_Traffic_Alt`            # aktueller Traffic zzgl. altem Traffic = Neuer Traffic
				echo $Sum_Traffic_Neu > $Path$Monat$Datei                            # Ergebnis sichern
			else                                                                                            # nein, die Datei existiert nicht
				echo "0" > $Path$Monat$Datei                                                # Datei wird erzeugt
				chmod 666 $Path$Monat$Datei                                                # Alle können lesen und schreiben
				WlanRX_Bytes="`/sbin/ifconfig wlan0 | grep 'RX bytes:' | awk {'print $2'} | tr -d 'bytes:'`"
				WlanTX_Bytes="`/sbin/ifconfig wlan0 | grep 'RX bytes:' | awk {'print $6'} | tr -d 'bytes:'`"
				################################################################################################
#       Kein Ethernet-Verkehr, sonst hier analog ermitteln und addieren                         #
################################################################################################
				Sum_Traffic_Neu=`expr $WlanRX_Bytes + $WlanTX_Bytes`                    # aktuellen Traffic von RX und TX addieren
				echo $Sum_Traffic_Neu > $Path$Monat$Datei                                      # bisherigen Traffic in Datei sichern
			fi
		fi
#
#
#
	;;
	*)
	echo "Usage: `basename $0` {start|stop}" >&2
	exit 64
	;;
esac

exit 0

Habe die Kommentare so einigermaßen hingeschoben, damit es etwas übersichtlicher wird.

Danke Euch.
 
A

Anonymous

Gast
MiPl schrieb:
Im Internet habe ich gelesen, dass die Parameter „start“ und „stop“ durch die Namensgebung der Verlinkung in /etc/init.d/rc?.d/ festgelegt wird. Wenn der Link mit S??... beginnt wird „start“ übergeben, wenn er mit K??... anfängt ein „stop“. Das habe ich (von Hand – YaST legt das so nicht an!?) probiert, jedoch ohne Effekt außer, dass in YaST dann der markierte Runlevel 0 und 6 gelöscht wurde. In YaST hatte ich die Runlevel 0 3 5 6 aktiviert.
was du dort gelesen hast, dürfte für Suse 8 bis 9 Jahre überholt sein, zwar gibt es diese Links unter /etc/initd/rc?.d/ bei deinem 12.1 immer noch, nur ausgeführt/benutzt werden sie seit Jahren nur wenn die parallele Abarbeitung der Startscripte manuell abgeschalten worden ist.
Des weiteren musst du schon definieren wann das Script gestartet werden soll, es hat Abhängigkeiten, und zwar muss das Netzwerk laufen, sowohl bei Start und darf auch noch nicht beendet sein wenn du noch zählen willst was dort für Datenmengen gelaufen sind. Es muss also in deinem Fall zwingend "# Required-Start:" und "# Required-Stop:" definiert werden bevor Yast das Script an der richtigen Stelle im Bootprozess einordnen kann.
Schau mal hier, ist zwar in der Zwischenzeit auch schon in die Jahre gekommen, aber immer noch besser als das was du gelesen hast. Lesenswert für dich vor allem der letzte kleineAbsatz.

Erschwerend kommt noch dazu, das ab 12.1 es mehr als ein Systemstartkonzept gibt, entweder default ein 1/4 fertiges und noch keineswegs perfektes neues systemd oder wahlweise auch noch das alte initV. Mit dem Konzept von systemd ist deine Idee solche Informationen dort abzugreifen nicht unbedingt kompatibel.

robi
 
Du machst es dir ein wenig umständlich. Die Anzahl der gesendeten und empfangenen Bytes findest du unter /sys/class/net/wlan0/statistics in den Dateien tx_bytes und rx_bytes.

Wo liegt den jetzt dein Problem? Wird das Script beim Start nicht ausgeführt? Hast du das Script nach /etc/init.d/ kopiert und mit
Code:
chkconfig scriptname on
aktiviert? (Bei Sysv Init ohne systemd) Verwendest du systemd?
 
Danke für die Reaktionen.

In der Zwischenzeit habe auch ich weiterrecherchiert und mir das Skript Skeleton in /etc/init.d angesehen und dort auch die Angaben zum $networt und $localfs etc. gelesen. Das habe ich dann eingefügt:

Code:
### BEGIN INIT INFO
# Required-Start:       $syslog $remote_fs $network
# Required-Stop:        $syslog $remote_fs $network
# Default-Start:        3 5
# Default-Stop:         0 6
# Short-Description:    Start: Resetting RX+TX; Stop: Internettraffic sichern
# Description:          längere Beschreibung noch verfassen
### END INIT INFO

und schon wurden die Werte hinzuaddiert.

Somit danke für die Tipps von robi.

@spoensche: Deinen Tip zu den Daten RX und TX werde ich noch abarbeiten und ggf. verwenden. Danke dafür.

Ich möchte noch kurz die Funktion genau prüfen, um dann diesen Thread auf [gelöst] zu setzen - so hoffe ich.
 
Oben