Package: console-tools
Version: 1:0.2.3dbs-64
Severity: normal
Tags: patch

console-screen.sh init script spawns many really unncessary processes.
I'm providing patch along with commentary to fix this.

--- console-screen.sh.orig      2006-08-09 02:04:35.000000000 +0200
+++ console-screen.sh   2006-08-09 02:02:38.000000000 +0200
@@ -82,16 +82,15 @@
 
     # start vcstime
     if [ "${DO_VCSTIME}" = "yes" -a -x ${VCSTIME} ] ; then
-       echo -n Starting clock on text console: `basename ${VCSTIME}`
+       echo Starting clock on text console: ${VCSTIME}

Spawning process to canoncalize executable name seems unncessary for me...

        ${VCSTIME} ${VCSTIME_OPT} &
-       echo .

Style...  I really don't like "echo -n"; ...; echo "done" combo.
This is just personal thing, "echo" is shell built-in so it doesn't do
harm, please ignore this if you like different way.  (and it seems you
do :)

     fi
 
 
     # Global default font+sfm
     if [ "${SCREEN_FONT}" ]
        then
-       echo -n "Setting up general console font... "
+       echo "Setting up general console font."
        SCREEN_FONT="-f ${SCREEN_FONT}"
 
        # maybe use an external SFM
@@ -101,76 +100,56 @@
        # _before_ getty and so only one console running. So,
        # Set for the first 6 VCs (as they are allocated in /etc/inittab)
        NUM_CONSOLES=`fgconsole --next-available`
-       NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
+       NUM_CONSOLES=$(($NUM_CONSOLES - 1))

$((expression)) works with dash/ash, no need for expr.


        [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
-       for vc in `seq 0 ${NUM_CONSOLES}` 
+       i=0
+       while [ $i -lt $NUM_CONSOLES ]
            do
-           ${SETFONT} --tty=${DEVICE_PREFIX}$vc ${SETFONT_OPT} ${SCREEN_FONT} 
${SCREEN_FONT_MAP} || { echo " failed."; break; }
-           if [ "$vc" -eq ${NUM_CONSOLES} ]; then echo " done."; fi 
+           ${SETFONT} --tty=${DEVICE_PREFIX}$i ${SETFONT_OPT} ${SCREEN_FONT} 
${SCREEN_FONT_MAP} || { echo "$i failed."; break; }
+           i=$(($i + 1))
        done
     fi

seq of course spawns process... "[" and "$((expression))" is built-in.


Here goes tricky part, I wont explain this -- I dont use SFMs so I
fixed ACMs and copied changes here...  I haven't tested font+sfm
part!  (It should work, though.)
 
-    # Per-VC font+sfm
-    PERVC_FONTS="`set | grep "^SCREEN_FONT_vc[0-9]*="  | tr -d \' `"
-    if [ "${PERVC_FONTS}"  ]
+    # Per-VC SFMs
+    VCS="`set | grep '^SCREEN_FONT_vc[0-9]*=' | sed -e 's/^SCREEN_FONT_vc//' 
-e 's/=.*//'`"
+    if [ "${VCS}" ]
        then
-       echo -n "Setting up per-VC fonts: "
-       for font in ${PERVC_FONTS}
+       echo "Setting up per-VC fonts."
+       for vc in ${VCS}
          do
-           # extract VC and FONTNAME info from variable setting
-         vc=`echo $font | cut -b15- | cut -d= -f1`
          eval font=\$SCREEN_FONT_vc$vc
-         if [ X"$QUIET_PERVC" != X1 ] ; then
-             echo -n "${DEVICE_PREFIX}${vc}, "
-         fi
-           # eventually find an associated SFM
          eval sfm=\${SCREEN_FONT_MAP_vc${vc}}
          [ "$sfm" ] && sfm="-u $sfm"
-
          ${SETFONT} --tty=${DEVICE_PREFIX}$vc ${SETFONT_OPT} -f $font $sfm
        done
-       echo "done."
     fi
 

-
     # Global ACM
     [ "${APP_CHARSET_MAP}" ] && ${CHARSET} G0 ${APP_CHARSET_MAP}

ACMs start here:

-
     # Per-VC ACMs
-    PERVC_ACMS="`set | grep "^APP_CHARSET_MAP_vc[0-9]*="  | tr -d \' `"
-    if [ "${PERVC_ACMS}" ]
+    VCS="`set | grep '^APP_CHARSET_MAP_vc[0-9]*=' | sed -e 
's/^APP_CHARSET_MAP_vc//' -e 's/=.*//'`"


Here, by use of different construct I got list of numbers instead of
APP_CHARSET_MAP_vc-thing that need to be parsed in every iteration of loop.


+    if [ "${VCS}" ]
        then
-       echo -n "Setting up per-VC ACM's: "
-       for acm in ${PERVC_ACMS}
+       echo "Setting up per-VC ACM's."
+       for vc in ${VCS}
          do
-           # extract VC and FONTNAME info from variable setting
-         vc=`echo $acm | cut -b19- | cut -d= -f1`

That saves many processess per iteration...

          eval acm=\$APP_CHARSET_MAP_vc$vc

-         if [ X"$QUIET_PERVC" != X1 ] ; then
-             echo -n "${DEVICE_PREFIX}${vc} ($acm), "
-         fi

Personal style... sorry for that. ;)

-         eval "${CHARSET} --tty='${DEVICE_PREFIX}$vc' G0 '$acm'"
+         ${CHARSET} --tty="${DEVICE_PREFIX}$vc" G0 "$acm"

eval wasn't needed there, was it?

        done
-       echo "done."
     fi
 
 
     # Go to UTF-8 mode as necessary
     # 
-    ENV_FILE="/dev/null"
+    ENV_FILE=''
     [ -r /etc/environment ] && ENV_FILE="/etc/environment"
     [ -r /etc/default/locale ] && ENV_FILE="/etc/default/locale"
-    for var in LANG LC_ALL LC_CTYPE ; do
-       value=$(egrep "^\s*${var}=" $ENV_FILE | tail -n1 | cut -d= -f2)
-       eval $var=$value
-    done
-    CHARMAP=`LANG=$LANG LC_ALL=$LC_ALL LC_CTYPE=$LC_CTYPE locale charmap`
-    if   test "$CHARMAP" = "UTF-8" 
+    [ "$ENV_FILE" ] && CHARMAP=$(set -a && . "$ENV_FILE" && locale charmap)

This is fast -- by use of auto export shell option this work
flawlessly (I hope).

+    if test "$CHARMAP" = "UTF-8" 
     then
         unicode_start 2> /dev/null || true
-
     else
         unicode_stop 2> /dev/null|| true
     fi
@@ -212,14 +191,16 @@
     # Allow user to remap keys on the console
     if [ -r /etc/console-tools/remap ]
        then
-       dumpkeys < ${DEVICE_PREFIX}1 |sed -f /etc/console-tools/remap |loadkeys 
--quiet
+       dumpkeys < ${DEVICE_PREFIX}1 | sed -f /etc/console-tools/remap | 
loadkeys --quiet

Couldn't resist.

     fi
     # Set LEDS here
     if [ "$LEDS" != "" ]
        then
-       for i in `seq 1 ${NUM_CONSOLES}`
+       i=1
+       while [ $i -lt $NUM_CONSOLES ]
          do
           setleds -D $LEDS < $DEVICE_PREFIX$i
+         i=$(($i + 1))
        done

Yet another remove-seq, use-builtins fixes.

     fi
 }


These changes save about 90 pids!  Main offenders are now consolechars
and charset by itself ("consolechars -f font -m acm" spawns 7 pids).

Please consider using parts (non-cosmetic ones) of my patch.

Thanks for your work!


Here goes patch without commentary:

--- console-screen.sh.orig      2006-08-09 02:04:35.000000000 +0200
+++ console-screen.sh   2006-08-09 02:02:38.000000000 +0200
@@ -82,16 +82,15 @@
 
     # start vcstime
     if [ "${DO_VCSTIME}" = "yes" -a -x ${VCSTIME} ] ; then
-       echo -n Starting clock on text console: `basename ${VCSTIME}`
+       echo Starting clock on text console: ${VCSTIME}
        ${VCSTIME} ${VCSTIME_OPT} &
-       echo .
     fi
 
 
     # Global default font+sfm
     if [ "${SCREEN_FONT}" ]
        then
-       echo -n "Setting up general console font... "
+       echo "Setting up general console font."
        SCREEN_FONT="-f ${SCREEN_FONT}"
 
        # maybe use an external SFM
@@ -101,76 +100,56 @@
        # _before_ getty and so only one console running. So,
        # Set for the first 6 VCs (as they are allocated in /etc/inittab)
        NUM_CONSOLES=`fgconsole --next-available`
-       NUM_CONSOLES=`expr ${NUM_CONSOLES} - 1`
+       NUM_CONSOLES=$(($NUM_CONSOLES - 1))
        [ ${NUM_CONSOLES} -eq 1 ] && NUM_CONSOLES=6
-       for vc in `seq 0 ${NUM_CONSOLES}` 
+       i=0
+       while [ $i -lt $NUM_CONSOLES ]
            do
-           ${SETFONT} --tty=${DEVICE_PREFIX}$vc ${SETFONT_OPT} ${SCREEN_FONT} 
${SCREEN_FONT_MAP} || { echo " failed."; break; }
-           if [ "$vc" -eq ${NUM_CONSOLES} ]; then echo " done."; fi 
+           ${SETFONT} --tty=${DEVICE_PREFIX}$i ${SETFONT_OPT} ${SCREEN_FONT} 
${SCREEN_FONT_MAP} || { echo "$i failed."; break; }
+           i=$(($i + 1))
        done
     fi
 
 
-    # Per-VC font+sfm
-    PERVC_FONTS="`set | grep "^SCREEN_FONT_vc[0-9]*="  | tr -d \' `"
-    if [ "${PERVC_FONTS}"  ]
+    # Per-VC SFMs
+    VCS="`set | grep '^SCREEN_FONT_vc[0-9]*=' | sed -e 's/^SCREEN_FONT_vc//' 
-e 's/=.*//'`"
+    if [ "${VCS}" ]
        then
-       echo -n "Setting up per-VC fonts: "
-       for font in ${PERVC_FONTS}
+       echo "Setting up per-VC fonts."
+       for vc in ${VCS}
          do
-           # extract VC and FONTNAME info from variable setting
-         vc=`echo $font | cut -b15- | cut -d= -f1`
          eval font=\$SCREEN_FONT_vc$vc
-         if [ X"$QUIET_PERVC" != X1 ] ; then
-             echo -n "${DEVICE_PREFIX}${vc}, "
-         fi
-           # eventually find an associated SFM
          eval sfm=\${SCREEN_FONT_MAP_vc${vc}}
          [ "$sfm" ] && sfm="-u $sfm"
-
          ${SETFONT} --tty=${DEVICE_PREFIX}$vc ${SETFONT_OPT} -f $font $sfm
        done
-       echo "done."
     fi
 
-
     # Global ACM
     [ "${APP_CHARSET_MAP}" ] && ${CHARSET} G0 ${APP_CHARSET_MAP}
 
-
     # Per-VC ACMs
-    PERVC_ACMS="`set | grep "^APP_CHARSET_MAP_vc[0-9]*="  | tr -d \' `"
-    if [ "${PERVC_ACMS}" ]
+    VCS="`set | grep '^APP_CHARSET_MAP_vc[0-9]*=' | sed -e 
's/^APP_CHARSET_MAP_vc//' -e 's/=.*//'`"
+    if [ "${VCS}" ]
        then
-       echo -n "Setting up per-VC ACM's: "
-       for acm in ${PERVC_ACMS}
+       echo "Setting up per-VC ACM's."
+       for vc in ${VCS}
          do
-           # extract VC and FONTNAME info from variable setting
-         vc=`echo $acm | cut -b19- | cut -d= -f1`
          eval acm=\$APP_CHARSET_MAP_vc$vc
-         if [ X"$QUIET_PERVC" != X1 ] ; then
-             echo -n "${DEVICE_PREFIX}${vc} ($acm), "
-         fi
-         eval "${CHARSET} --tty='${DEVICE_PREFIX}$vc' G0 '$acm'"
+         ${CHARSET} --tty="${DEVICE_PREFIX}$vc" G0 "$acm"
        done
-       echo "done."
     fi
 
 
     # Go to UTF-8 mode as necessary
     # 
-    ENV_FILE="/dev/null"
+    ENV_FILE=''
     [ -r /etc/environment ] && ENV_FILE="/etc/environment"
     [ -r /etc/default/locale ] && ENV_FILE="/etc/default/locale"
-    for var in LANG LC_ALL LC_CTYPE ; do
-       value=$(egrep "^\s*${var}=" $ENV_FILE | tail -n1 | cut -d= -f2)
-       eval $var=$value
-    done
-    CHARMAP=`LANG=$LANG LC_ALL=$LC_ALL LC_CTYPE=$LC_CTYPE locale charmap`
-    if   test "$CHARMAP" = "UTF-8" 
+    [ "$ENV_FILE" ] && CHARMAP=$(set -a && . "$ENV_FILE" && locale charmap)
+    if test "$CHARMAP" = "UTF-8" 
     then
         unicode_start 2> /dev/null || true
-
     else
         unicode_stop 2> /dev/null|| true
     fi
@@ -212,14 +191,16 @@
     # Allow user to remap keys on the console
     if [ -r /etc/console-tools/remap ]
        then
-       dumpkeys < ${DEVICE_PREFIX}1 |sed -f /etc/console-tools/remap |loadkeys 
--quiet
+       dumpkeys < ${DEVICE_PREFIX}1 | sed -f /etc/console-tools/remap | 
loadkeys --quiet
     fi
     # Set LEDS here
     if [ "$LEDS" != "" ]
        then
-       for i in `seq 1 ${NUM_CONSOLES}`
+       i=1
+       while [ $i -lt $NUM_CONSOLES ]
          do
           setleds -D $LEDS < $DEVICE_PREFIX$i
+         i=$(($i + 1))
        done
     fi
 }



-- System Information:
Debian Release: testing/unstable
  APT prefers testing
  APT policy: (500, 'testing'), (10, 'unstable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/dash
Kernel: Linux 2.6.17-riddly3
Locale: LANG=C, LC_CTYPE=pl_PL (charmap=ISO-8859-2)

Versions of packages console-tools depends on:
ii  debconf [debconf-2.0]      1.5.2         Debian configuration management sy
ii  libc6                      2.3.6-15      GNU C Library: Shared libraries
ii  libconsole                 1:0.2.3dbs-64 Shared libraries for Linux console
ii  sysvinit                   2.86.ds1-15   System-V-like init utilities

Versions of packages console-tools recommends:
ii  console-common                0.7.60     Basic infrastructure for text cons
ii  console-data                  2:1.0-2    Keymaps, fonts, charset maps, fall

-- no debconf information


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to