On Mon, Apr 23, 2007 at 11:08:27AM +0930, Tim wrote: > On Sun, 2007-04-22 at 17:43 +0530, Vikram Goyal wrote: > > I have tried to make the boot faster by staggering some processes in > > background through an added service staggered. > > I seem to recall reading that there was a move to load some start-up > services concurrently rather than consecutively, but I hadn't noticed it > being done anywhere. Is this better than the readahead_early and > readahead_later services that come with FC6? > readahead_* services are for file caching. and do not load the services in the background to let the booting go faster as far as I know. Recently the clamav package had a change and it was taking about a min to load stalling the rest of the boot. I got irritated and put it in /etc/rc.local. Then I thought of putting such services in a script but I had to switch them off to stall them from loading at boot from init scripts. Things got a bit complicated so I wrote this script. To manage this kind of booting I had to create a service staggered. I have rewritten what I had posted earlier, and I presume it is much better than the last one. Since I wrote it initially for myself but can be used in a general way also so I thought of sharing it. The script forfastboot must be in /root/bin/ Once executed manually from there it creates two files: /etc/init.d/staggered /etc/sysconfig/staggered and adds service staggered. >From then on the service staggered manages the services mentioned in /etc/sysconfig/staggered I have included only clamav and ntpd services to be staggered and the rest are in the excluded list for people to test and see whats happening. The services in the excluded list are not affected. If you are comfortable with it then you may include other services also If file /etc/sysconfig/staggered gets corrupted while editing, delete it and a new default one will be created by the service itself. previous one is obsolete. posting the new file below. save this file as forfastboot in /root/bin/ ----------------------------------------------------------------------- #/bin/bash # NAME: forfastboot # PLACE: /root/bin/ # AUTHOR: vikram goyal <vikigoyal@xxxxxxxxx> 230407 # # The file is to be called as: # The first time call is the filename itself and then its through service call # # service staggered start # # So that these services load up in the background & save boot time # [ -z "$STLOG" ] && STLOG=/dev/tty # DEBUGGING #echo \$1=$1 >> $STLOG SERVICEDIR=/etc/init.d SERVICENAME=staggered STAGGERTIME=7s addchkserv() { # ADD/CHK THE SERVICE # ~~~~~~~~~~~~~~~~~~~ # If service file has changed copy the new one. If it does not # exist yet make a new one. if [ -f $SERVICEDIR/$SERVICENAME ]; then fchk=`mktemp` createserv $fchk [ -n "`diff $fchk $SERVICEDIR/$SERVICENAME`" ] && \ /sbin/chkconfig --del staggered && \ mv -f $fchk $SERVICEDIR/$SERVICENAME setperms else createserv $SERVICEDIR/$SERVICENAME echo service staggered added. setperms fi } addservnames() { # Add the sample file staggered services names list in /etc/sysconfig servicesnames=`cat /etc/init.d/staggered|grep servicesnames=|cut -d = -f2` if [ ! -f $servicesnames ]; then eval cat >$servicesnames <<EOF # # The services mentioned here should be in the right priority # as mentioned in chkconfig. # # In general no service should be here below around 25 start priority # # This is the list of services which one may want to stagger now # or in future. So include any service which you want staggerd. # STAGGERED_SERVICES=' lm_sensors cups apcupsd ntpd clamav dovecot sendmail spamassassin smartd nasd jexec avahi-daemon wine ' # # This is the services list which tells staggerd to stay away. # # 1} Service may not be in use at the moment. # 2} Temporarily you may want it out of staggered. # # NOTE: One must switch on the service if it was staggered but # has been excluded and you want to use it. # EXCLUDE=' lm_sensors cups apcupsd dovecot sendmail spamassassin smartd nasd jexec avahi-daemon wine ' EOF echo $servicesnames was created. >> $STLOG fi } setperms() { /bin/chmod +x $SERVICEDIR/$SERVICENAME /sbin/chkconfig staggered on } createserv() { # Create service file in /etc/init.d/ eval cat >$1 <<EOF #!/bin/sh # # chkconfig: 2345 99 2 # description: This is modification of boot process. It staggeres \\ # the boot services mentioned in /etc/sysconfig/staggered # Source function library. . /etc/rc.d/init.d/functions [ -f /etc/sysconfig/staggered ] && \ export servicesnames=/etc/sysconfig/staggered name='staggered' exec='/root/bin/forfastboot' lockfile="/var/lock/subsys/\$name" # Hash STLOG for debug output on console export STLOG=/var/log/staggered.log RETVAL=0 start() { echo -n \$"Starting service staggered: " #if [ -f \$lockfile ]; then # echo_failure # echo # return #fi \$exec servicecall & > /dev/null 2>&1 #touch \$lockfile echo_success && echo } stop() { echo -n \$"Stopping service staggered: " #rm -f \$lockfile echo_success && echo } case "\$1" in start|stop) \$1 ;; restart) stop start ;; *) echo $"Usage: \$0 {start|stop|restart}" exit 1 ;; esac exit \$RETVAL EOF } START () { FN="$1" R=`/sbin/runlevel|cut -d ' ' -f2` echo -e "\n\t`date`\nSTART:" >> $STLOG # DEBUGGING #echo \$R=$R >> $STLOG for x in $STAGGERED_SERVICES do [ ! -f $SERVICEDIR/$x ] && echo "error: file $SERVICEDIR/$x not found" >> $STLOG && continue [ -n "$EXCLUDE" ] && \ [ -n "`echo $EXCLUDE|grep -w $x`" ] && echo "service $x in exclude list" >> $STLOG && continue # Switch off the service. We will manage it ourselves. /sbin/chkconfig $x off >> $STLOG 2>&1 & unset C C=`cat $SERVICEDIR/$x|grep chkconfig|tr '[ ]' '[:]'|tr -s '[:]'|cut -d ":" -f3|grep [\-$R]` # DEBUGGING #echo \$C=$C \$R=$R >> $STLOG # Since the service x has been turned off. Check if it is supposed # to run in this level. If yes start it. if [ -n "$C" ]; then if [ -n "`echo $C|grep \-`" -a -z "`echo $R|grep [2345]`" ]; then echo "$R not one of 2,3,4,5 :$x not started" >> $STLOG continue fi /sbin/service $x status >> $STLOG 2>&1 && continue [ $? -gt 0 ] && \ /sbin/service $x start >> $STLOG 2>&1 && \ sleep $STAGGERTIME else echo "error: $x not to start in $R" >> $STLOG fi done rm -f "/tmp/$FN" echo -e "\n\t`date`\nEND:" >> $STLOG } if [ -n "$servicesnames" ]; then . $servicesnames else # Not called from service file. It may not exist yet. addchkserv addservnames fi if [ -f "$1" ]; then # Tmp lock file has been created, so call the function. # DEBUGGING #echo "loop \$1=$1 exe" >> $STLOG START $1 exit 0 elif [ "$1" != servicecall ]; then echo "call $0 from service staggered." exit 1 fi LF=`mktemp` touch "$LF" || exit 1 $0 "$LF" & exit ----------------------------------------------------------------------- I have checked it and it's working fine at my end. Thanks! -- vikram... |||||||| |||||||| ^^'''''^^||root||^^^'''''''^^ // \\ )) //(( \\// \\ // /\\ || \\ || / )) (( \\ -- Maybe we could paint GOLDIE HAWN a rich PRUSSIAN BLUE -- -- O ~|~ = Registered Linux User #285795