Formatierung der Ausgabe beim Boot

M

miketech

Routinier
Hi zusammen,

ihr kennt das ja, wenn Linux die Init-Skripte läd kommen immer entpsprechende Ausgaben wie:

Init XY [ ok ]

usw.

Wo steht denn die Formatierung, wie das aussieht? Also ob das ok z.B. grün erscheint, oder ob "DONE" dabei steht usw. Kann man das irgendwo verändern? Oder hängt das vom Init-System der jeweiligen Distribution ab? Das ist ja dann wahrscheinlich binär, d.h. so eine einfache Änderung wird nicht möglich sein. Oder weiß jemand, wie man das z.B. unter Debian/Ubuntu/Gentoo ändert?

Gruß

Mike
 
Unter /etc/init.d/ sind die INIT-Skripte, die du natürlich editieren kannst, z.B. alles nach Deutsch übersetzen usw.
Allerdings weiß ich nicht, wie man die Farben verändert.
 
Hi,

yup das ist prinzipiell klar. Aber da steht ja nicht, was ausgegeben wird, wenn es erfolgreich war, oder fehlgeschlagen ist, also der Teil hinter dem Text.

[ DONE ] [FAILED] [ ok ] [ failed]

usw.

Also zumindest finde ich das bei Gentoo nicht in den init-skripten. Denke eher, dass das dann im Programm, was die Init-Skripte ausführt interpretiert wird.

Gruß

Mike
 
Das kannst Du mit sog. Escapesequenzen erledigen... Diese funktionieren etwa nach folgendem Muster:

Code:
^[[0;32;40mDein eingefärbter Text in grün, ^[[0m jetzt nach Standardvorgabe

Also die 'NULL' legt die Formatierung fest (Hell, Dunkel, Fett, Invers sogar blinkend!) der nächste Wert bezeichnet die Vordergrund(also die schrift-)farbe wobei Kombinationen von 0 bis 7 möglich sind. Die letze Ziffer stellt die Hintergrundfarbe dar (wiederum von 0 bis 7).

Also noch ein Beispiel:

Code:
echo "^[[1;31;40mDieser Text ist hellrot, ^[[1;34;40mnun ist er blau und jetzt ^[[0mwieder normal"

Mitunter kann man auch solche Konstrukte sehen:

Code:
echo "\003[1;31;40mDieser Text ist hellrot, \003[1;34;40mnun ist er blau und jetzt \003[0mwieder normal"

dann wird die Escapesequenz halt als Oktalzahl angegeben (wird aber bei meinem Debian nicht unterstützt, vielleicht weiß jemand warum?!).
Nun mußt Du halt die entsprechenden Escapesequenzen in den Initscripts verwenden um deren Ausgaben 'einzufärben'.
Hier ist nochmal ein Beispiel für ein Initscript zum Starten des Sambaservers:

Code:
case "$1" in
	start)
		echo -n "Starte: Samba Daemonen:"

		echo -n " nmbd"
		start-stop-daemon --start --quiet --exec /usr/sbin/nmbd -- -D

		if [ "$RUN_MODE" != "inetd" ]; then
			echo -n " smbd"
			start-stop-daemon --start --quiet --exec /usr/sbin/smbd -- -D
		fi

		echo "."
		;;
	stop)
		echo -n "Stoppe: Samba Daemonen "

		start-stop-daemon --stop --quiet --pidfile $NMBDPID
		# Wait a little and remove stale PID file
		sleep 1
		if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
		then
			# Stale PID file (nmbd was succesfully stopped),
			# remove it (should be removed by nmbd itself IMHO.)
			rm -f $NMBDPID
		fi
		echo -n "nmbd"

		if [ "$RUN_MODE" != "inetd" ]; then
			start-stop-daemon --stop --quiet --pidfile $SMBDPID
			# Wait a little and remove stale PID file
			sleep 1
			if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
			then
				# Stale PID file (nmbd was succesfully stopped),
				# remove it (should be removed by smbd itself IMHO.)
				rm -f $SMBDPID
			fi
			echo -n " smbd"
		fi

		echo "."

Mehr zu diesem Thema gibt es unter: http://www.selflinux.org/selflinux/html/bash_farben01.html#d28e173

MfG
 
Hi,

danke schön. Aber damit mache ich doch nur den Part "Samba Daemon" oder so andersfarbig. Der Part dahinter "DONE", oder [DONE] wird dadurch nicht verändert. Der müsste irgendwo im Programm, was die Init-Scripte ausführt definiert sein, oder?

Gruß

Mike
 
ja, es ist ein wenig kompliziert...
Die einfachste (einzigste die mir einfällt!) Möglichkeit ist die Initscripte nach TXT-ausgaben zu durchforsten. In meinem Sambabeispiel werden ja die Sambadaemonen: smb und nmb gestartet.

Der Aufruf im Originalscript lautet etwa so:
Code:
echo -n "Stopping Samba daemons
		start-stop-daemon --stop --quiet --pidfile $NMBDPID
		# Wait a little and remove stale PID file
		sleep 1
		if [ -f $NMBDPID ] && ! ps h `cat $NMBDPID` > /dev/null
		then
			# Stale PID file (nmbd was succesfully stopped),
			# remove it (should be removed by nmbd itself IMHO.)
			rm -f $NMBDPID
		fi
		echo -n "nmbd"

		if [ "$RUN_MODE" != "inetd" ]; then
			start-stop-daemon --stop --quiet --pidfile $SMBDPID
			# Wait a little and remove stale PID file
			sleep 1
			if [ -f $SMBDPID ] && ! ps h `cat $SMBDPID` > /dev/null
			then
				# Stale PID file (nmbd was succesfully stopped),
				# remove it (should be removed by smbd itself IMHO.)
				rm -f $SMBDPID
			fi
			echo -n " smbd"
		fi

		echo "."

Ich habe also an allen Aufrufen von 'echo' eine entspr. Sequenz vorrangestellt.
Mitunter fassen einige Initscripte diese Ausgaben zusammen, z. Bsp.: folgender Art:
Code:
echo -n Starting $DESC $NAME
Diese Aufrufe werden dann je nachdem ein paar mal wiederholt. Ein Anwendung habe ich im folgenden meinem PCMCIA-Initzscript entnommen:
Code:
	echo -n "Starte: PCMCIA Dienste: "

	# Move scheme file if it's at the old location
	if [ -d /var/lib/pcmcia ] ; then
	    mv /var/lib/pcmcia/scheme /var/lib/misc/pcmcia-scheme || true
	    rm -rf /var/lib/pcmcia
	fi

	SC=/var/lib/misc/pcmcia-scheme
	RUN=/var/run

	if [ -L $SC -o ! -O $SC ] ; then rm -f $SC ; fi
	if [ ! -f $SC ] ; then umask 022 ; touch $SC ; fi
	if [ "$SCHEME" ] ; then umask 022 ; echo $SCHEME > $SC ; fi
	    
	if ! grep -q pcmcia /proc/devices ; then
	    module_is_loaded pcmcia_core || modprobe -q pcmcia_core $CORE_OPTS \
		|| failed_to_load pcmcia_core
	    # Treat i82365 specially, as many people with yenta_socket
	    # incorrectly has PCIC set to i82365 for historical reasons
	    if [ "$PCIC" = i82365 ]; then
		if ! bridge_module_loaded ; then
		    # On 2.6 kernels, we must not load any other bridge
		    # modules than the right one
		    if cardbus_bridge_present ; then
			echo "using yenta_socket instead of $PCIC"
			load_module yenta_socket || failed_to_load yenta_socket
		    else
			load_module $PCIC $PCIC_OPTS >/dev/null 2>&1 ||
			(load_module yenta_socket >/dev/null 2>&1 &&
			    echo "using yenta_socket instead of $PCIC") ||
			load_module $PCIC $PCIC_OPTS || failed_to_load $PCIC
		    fi
		fi
	    else
		load_module $PCIC $PCIC_OPTS || failed_to_load $PCIC
	    fi
	    load_module ds || failed_to_load ds
	fi

	if [ -s /var/run/cardmgr.pid ] && \
	    kill -0 `cat /var/run/cardmgr.pid` 2>/dev/null ; then
	    echo "cardmgr is already running."
	else
	    if [ -r $RUN/stab ] ; then
		cat $RUN/stab | cleanup
	    fi
	    /sbin/cardmgr $CARDMGR_OPTS
	fi

	echo "done."
	touch /var/lock/subsys/pcmcia 2>/dev/null
	EXITCODE=0
	;;

Wie Du siehst, wird die Nachricht, das der Daemon startet blau, (welcher genau es ist: grün) die erkannten sockets grün, und die Bestätigung: rot eingefärbt.
Wie gesagt es ist ein bisserl friemelig, kannst wohl einen Abend darauf verwenden...
 
man könnte auch eine Art Wrapper schreiben und sich somit viel Editierarbeit sparen. Wie genau weiß ich nicht, vorstellen kann ich es mir aber.
 
Sehr wahrscheinlich, das Ganze funktioniert dank (n)Curses-Lib ja auch unter C, Bspw.: mit printf()...
Es ist ebenso wahrscheinlich dass bei einem Liveupdate alle edititerten Scripts wieder OHNE Escapesequenzen da stehen, und die ganze Arbeit ist dahin. Aber für eine selbsterst. LiveCD, würde die Arbeit sich schon lohnen !
 
ärgerlich, dass ich nun gerade nicht daheim bin, sonst würde ich an sowas jetzt hacken...

Aber für eine selbsterst. LiveCD, würde die Arbeit sich schon lohnen !
hach, im Linuxbereich oder generell im OpenSource-Bereich ist das mit dem "lohnen" so eine Sache, da man ja eh vieles nur aus kosmetischen Gründen macht ;).

Sehr wahrscheinlich, das Ganze funktioniert dank (n)Curses-Lib ja auch unter C, Bspw.: mit printf()...

Programmiersprache spielt eigentlich keine Rolle, da die meiste Sprachen eine Lib für ncurses haben. Selbst die ganzen Scriptsprachen haben es :).
 
avarus schrieb:
Programmiersprache spielt eigentlich keine Rolle, da die meiste Sprachen eine Lib für ncurses haben. Selbst die ganzen Scriptsprachen haben es .
Ach sooo...
Bin ein ambitionierter (aber hoffnungslos blutiger) Anfänger im C coden. Hab vorher schon mal kleinere bash-Scripts geschustert. Aber überwiegend im Webbereich mit PHP/JScript gearbeitet. hab unter WiN32 schon mit C++ (O.K., nicht zu 'Fuß' sondern mit den MFCs) ein paar Anwendungen entwickelt, macht aber viel mehr Spaß mit C in Hardwarenähe zu coden, nicht über X verschiedene API-Wrapper hinweg. Da ist UNiX/LiNUX einfach verdammt cool.

avarus schrieb:
ärgerlich, dass ich nun gerade nicht daheim bin, sonst würde ich an sowas jetzt hacken...
:)) Respekt, eben mal schnell 'nen Textausgabewrapper 'hacken' :))
Hast Du das aus einem der 'Gallileo'-Publikationen ?! Oder kann man bez. der Herangehensweise auch Online nachschlagen ? (interessiert mich, jetzt doch sehr !!!)
 
die Herangehensweise ? mmh, ich würde mir jetzt halt den Initvorgang genauer ansehen und dann mal schauen, inwiefern man das auswerten kann.

Und was genau meinst du mit "Galileo"?
 
Gallileo Computing, ist so ein Verlag für EDV-Bücher, die sich vor allem durch das Verlegen verständlicher Fachliteratur im UNiX/LiNUX-Bereich...
Aus dem Verlag ist auch das Buch: "Shell Programmierung" von Jürgen Wolff, das ich sehr gelungen finde.
 

Ähnliche Themen

System hängt nach: JDB: barrier-based sync failed on md1-8 - disabling barriers

Zurück
Oben