delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2005/03/04/16:25:33

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-ID: <4228D319.24DBAF6D@dessent.net>
Date: Fri, 04 Mar 2005 13:28:57 -0800
From: Brian Dessent <brian AT dessent DOT net>
Organization: My own little world...
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: Re: Listing services
References: <200503041150 DOT 14903 DOT colin AT breame DOT net> <42289B1B DOT 7000103 AT acm DOT org>
X-IsSubscribed: yes
Reply-To: cygwin AT cygwin DOT com

David Rothenberger wrote:

> I do it with the following script which uses /proc.

That's an interesting script but it has a couple of deficiencies.  It
does not list services with names that start with a "." and it breaks on
services with a space in the name when -n is used.  It's also very slow
with -n, as there's no need to invoke awk once for each service, and
using forking /bin/cat to read each description is costly.

Here's a slightly tweaked version that fixes the above problems and runs
about 30 times faster.  (0m13.722s down to 0m0.489s on my system at
least.)

#!/bin/sh

usage() {
  cat <<EOF
usage: `basename $0` [-n] [--]
  -n: Display names
EOF
}

displayNames() { false; }
while getopts :n OPT; do
  case $OPT in
    n|+n)
      displayNames() { true; }
      ;;
    *)
      usage
      exit 2
  esac
done
shift `expr $OPTIND - 1`

srvKey=/proc/registry/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services

if displayNames; then
  find $srvKey/ -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | \
  sort -f | \
  ( while read s; do
    descr=""
    [ -f "$srvKey/$s/DisplayName" ] && \
      read descr <$srvKey/$s/DisplayName;
    echo -e "$s\t$descr"
  done ) | \
  awk -F \\t '{printf("%-30s: %s\n", $1, $2)}'
else
  find $srvKey/ -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | \
  sort -f
fi

---
Brian

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019