Update Script für World & Kernel

Fusselbär

Makefile Voyeur
Früher mit meinem alten Athlon XP war das ja nicht zu überhören,
wenn das Ding laut röhrend World & Kernel gebaut hat, aber heute die dicken Mehrkerner bauen das ja so unauffällig, dass ich es gar nicht mitbekomme, wenn es durch gerannt ist.

Darum benutze ich seit einer Weile ein base_update.sh Script,
das mir Tipparbeit erspart und wenn es bis zum mergemaster durch gerannt ist auf KDE ein PopUp macht, oder wenn kein X-Server läuft,
dann eine knallrot hinterlegte Meldung auf der Konsole.
Das Script teile ich gerne mit euch, möge es nützlich sein.
Habe es bei mir als:
/usr/src/base_update.sh
Code:
#!/bin/sh

make cleanworld && \
make cleandir && \
time make -j8 buildworld && \
time make -j8 buildkernel && \
make installkernel && \
make installworld && \
if [ "$(pgrep Xorg)" ]
 then
        sudo -u KDE4_USERNAME notify-send -i dialog-ok-apply.png "FreeBSD Basebuild is ready! :-)" 
 else printf "\033[41mFreeBSD Basebuild is ready! :-)\033[0m"
fi \
&& mergemaster -cv 
exit

KDE4_USERNAME muss im Script angepasst werden auf den eignen Usernamen der KDE benutzt während das Script durchläuft.
Das make -j8 sollte auch auf die verwendete CPU angepasst werden.

Für das mergemaster habe ich eine:
/etc/mergemaster.rc
Code:
### /etc/mergemaster.rc
### see man mergemaster`

# Automatically install files that do not exist on the system already
AUTO_INSTALL=yes

# Automatically upgrade files that have not been user modified
AUTO_UPGRADE=yes

# Files to always avoid comparing
IGNORE_FILES='/etc/devfs.conf /etc/group /etc/hosts /etc/master.passwd /etc/motd /etc/rc.d/gsched'
Wegen sich fragt, was das mit dem gsched ist:
http://www.bsdforen.de/showpost.php?p=217111&postcount=15
 
Zuletzt bearbeitet:
Ich ahnte schon, dass es hier zu Weiterentenwicklung führt. :)
time vor den make Aufrufen für World und Kernel ist ja auch völlig überflüssig. Sollte ich eigentlich auch mal irgendwann aufräumen. :ugly:
 
Zuletzt bearbeitet:
So, noch nicht perfekt, aber vermutlich schon brauchbar.

- Variablen für Username, Kernel Config Datei, Mergetool (etcupdate / mergemaster), Notify Tool (zenity, notify-send,
xmessage, terminal)
- Automatisches Bestimmen der Makejobs
- Ausgabe der Make Targets
- Anzeige, wie lange jedes Target gebraucht hat
- Voraussetzung: für die grafische Benachrichtigung muss sudo installiert sein, eins der Notify Tools und ggf.
sysutils/etcupdate

notify-send klappt bei mir aus irgendeinem Grund nicht (bin Fluxbox Benutzer), aber mit xmessage, zenity und auf
dem Terminal ging es.

Lob und Beschwerden bitte hier oder per Mail. :)

Code:
#!/bin/sh

#   Copyright (C) 2011 by Lars Engels <lars@0x20.net>
#
#   BSD-style copyright, license and standard disclaimer apply.


# Where are your sources?
srcdir="/usr/src"

# The username to whom the message is sent to
username="lars"

# Specify 'etcupdate' or 'mergemaster'
mergetool="etcupdate"
# Set your preferred flags for the merge tool.
mergetool_flags=""

# Pick one of 'zenity', 'notify-send', 'xmessage' or 'terminal'
notifytool="terminal"

# Optional: Kernel config, may already be set in /etc/make.conf
kernconf="MILHOUSE"

####################### End of config section #######################

# Use two build jobs per CPU
max_jobs=$(($(sysctl -n hw.ncpu) * 2))
tmpfile="$(mktemp /tmp/$(basename ${0}).XXXXXX)"
# Don't use the shell's builtin time command, output and append to
# the logfile.
time_cmd="/usr/bin/time -a -o ${tmpfile}"

# Catch SIGINT remove the tmpfile, and exit
trap "notify_user; rm ${tmpfile}; exit 1" 2

notify_user() {
	case ${notifytool} in
		zenity)
		echo -e "Basebuild finished!\n" | cat - ${tmpfile} | 
		    sudo -u ${username} env DISPLAY=:0 \
		    zenity --text-info --title 'Basebuild finished' --window-icon=info --width=800 --height=600
		;;
		notify-send)
		sudo -u ${username} env DISPLAY=:0 notify-send $(echo -e "Basebuild finished!\n" | cat - ${tmpfile})
		    
		;;
		xmessage)
		echo -e "Basebuild finished!\n" | cat - ${tmpfile} | 
		    sudo -u ${username} env DISPLAY=:0 xmessage -buttons Close -center -file -
		;;
		terminal)
		echo -e "Basebuild finished!\n"
		cat ${tmpfile}
		;;
		*)
		;;
	esac
}

error_catcher() {
	error_source=${1}

	echo "Error in \"make ${error_source}\"!"
	notify_user
	exit 1
}

if [ -n "${kernconf}" ]; then
	kernconf="KERNCONF=${kernconf}"
fi

### Check if all needed programs are installed

for prog in ${mergetool} ${notifytool} sudo; do
	[ "${prog}" = "terminal" ] && continue
	found="$(which ${prog} 2>/dev/null)"
	[ -z "${found}" ] && { echo "${prog} not found!"; exit 1; }
done

for target in cleanworld cleandir buildworld buildkernel installkernel installworld; do
	if [ "$(echo ${target} | cut -c1-5)" = "build" ]; then
		jobs=${max_jobs}
	else
		jobs=1
	fi
	echo >> ${tmpfile}    "############################################################"
	echo >> ${tmpfile}    "                  Starting: ${target}"
	echo -e >> ${tmpfile} "############################################################\n"
	${time_cmd} make -C ${srcdir} -j ${jobs} ${kernconf} ${target} 2>> ${tmpfile} ||
	    error_catcher "${target}"
done

notify_user
rm ${tmpfile}

echo "Starting ${mergetool}"
${mergetool} ${mergetool_flags}
 
Zuletzt bearbeitet:
Hallo laemodost,

Wow, das Script sieht ja beeindruckend aus.
Das notify-send ist so ein KDE4x Ding, Firefox nutzt es aber auch.

pkg_info -W
Code:
/usr/local/bin/notify-send was installed by package libnotify-0.7.3_1

package 'libnotify-0.7.3_1' is required by these other packages
and may not be deinstalled:
Code:
firefox-7.0.1_3,1
ibus-1.3.9_1
kde4-4.7.2_1
kdeadmin-4.7.2
kdeutils-4.7.2
kdeutils-printer-applet-4.7.2
libxul-6.0
py27-notify-0.1.1_8
system-config-printer-1.1.16_3
system-config-printer-kde-4.7.2
http://www.freshports.org/devel/libnotify/

So sieht das notify-send PopUp bei mir unter KDE4 aus (unten rechts im Screenshot):

(Klicken zum vergrößern)
 
max_jobs=$(($(sysctl -n hw.ncpu) * 2))
Hast du mal gemessen ob das Sinn macht?

Meiner Erfahrung nach ist ncpu+1 das höchste was Sinn macht, vor allen bei Single-Cores. Bei Quad-Cores liegt der Unterschied zwischen ncpu und ncpu+1 in der Messungenauigkeit.

Bei einem Quad-Core sollte man sich dann schon eher um die Festplatten Gedanken machen. /usr/obj async mounten ist mal das mindeste.
 
@Fusselbär:
notify-send ist bei mir schon installiert. Aber wenn ich das aufrufe, kommt nix. $? ist dann trotzdem 0. Also benutz ich zenity, das ist eh noch ein bisschen schlanker. :)

@Kamikaze:
Nein, gemessen habe ich das bisher nicht. Aber mit dem Skript bekomme ich ja jetzt immer angezeigt, wie lange es dauert. Da kann ich also mal Tests durchführen.
 
Hallo laemodost,

dein Script rennt hier erfolgreich durch, das notify-send Kommando habe ich etwas abgeändert um den Okay Haken im PopUp zu haben:
Code:
sudo -u ${username} env DISPLAY=:0 notify-send [COLOR="Red"]-i dialog-ok-apply.png[/COLOR] $(echo -e "Basebuild finished!\n" | cat - ${tmpfile})

(Klicken zum vergrößern)
 
Ah, ich hab da eh noch nen kleinen Fehler drin gehabt.
Das "notify_user" muss augerufen werden, bevor das Logfile gelöscht wird. Habs jetzt oben noch mal korrigiert. Dann wird jetzt auch angezeigt, wie lange die einzelnen Schritte benötigt haben.
 
Dann siehts so aus:
Code:
Basebuild finished!

############################################################
                  Starting: cleanworld
############################################################

       20.64 real         0.24 user         1.76 sys
############################################################
                  Starting: cleandir
############################################################

       60.60 real        26.68 user         8.02 sys
############################################################
                  Starting: buildworld
############################################################

time: command terminated abnormally
       11.54 real         4.00 user         0.44 sys

Da hab ich den build nach kurzer Zeit mit ctrl+c abgebrochen.
 
Ah, ich hab da eh noch nen kleinen Fehler drin gehabt.
Das "notify_user" muss augerufen werden, bevor das Logfile gelöscht wird. Habs jetzt oben noch mal korrigiert. Dann wird jetzt auch angezeigt, wie lange die einzelnen Schritte benötigt haben.

Da musste ich noch eine kleine Änderung machen, das notify-send reagierte auf das cat äußerst allergisch.
Bei der ersten Version wurde ja durch den früh erfolgten rm Befehl die Datei frühzeitig gelöscht, so dass wohl trap das aufgefangen hatte.
Nach dem umstellen hing es dann fest.
Nun habe ich den Abschnitt für das notify-send so:
Code:
                ;;                                                                                                                                                                                                                                                             
                notify-send)                                                                                                                                                                                                                                                   
                sudo -u ${username} env DISPLAY=:0 notify-send -i dialog-ok-apply.png $(echo -e "Basebuild finished!\n")
                cat ${tmpfile}
Die Zeitanzeige kommt damit auf der KDE Konsole raus, in der ich den Build rennen lasse:
Code:
############################################################
                  Starting: cleanworld
############################################################

        3,24 real         0,05 user         3,18 sys
############################################################
                  Starting: cleandir
############################################################

       24,15 real        16,45 user         7,80 sys
############################################################
                  Starting: buildworld
############################################################

     1184,49 real      3053,29 user       631,51 sys
############################################################
                  Starting: buildkernel
############################################################

      368,78 real       595,66 user       110,93 sys
############################################################
                  Starting: installkernel
############################################################

       10,82 real         6,05 user         2,37 sys
############################################################
                  Starting: installworld
############################################################

       41,68 real        18,63 user        19,88 sys
Starting mergemaster
 
Zurück
Oben