Le script de démarrage ci-après est fourni avec le système (fichier /etc/init.d/init.srm) et est exécuté avec un argument de démarrage lorsque le système passe au niveau d'exécution 2 ou 3 (mode multi-utilisateurs). Il est également exécuté avec un argument d'arrêt lors de l'arrêt du système.
#!/bin/sh
#
# Copyright (c) 1998 by Sun Microsystems, Inc.
# All rights reserved.
#
# Copyright 1995-1997 Softway Pty. Ltd.
#
# Start/stop Solaris Resource Manager v1.0
#
#ident "@(#)init.srm 1.17 98/10/27 SMI"
#######################################################################
# Default values.
DATADIR=/var/srm
ShareDb=$DATADIR/srmDB
LimdaemonOptions=
ChargeOptionsOn="limits=y:share=y:adjgroups=y:limshare=y"
ChargeOptionsOff="limits=n:share=n:adjgroups=n:limshare=n"
LostLnode=srmlost
IdleLnode=srmidle
#######################################################################
# ECHO=echo # For a verbose startup and shutdown
ECHO=: # For a quiet startup and shutdown
SRMDIR=/usr/srm
SRMBIN=$SRMDIR/bin
SRMSBIN=$SRMDIR/sbin
ETCSRM=/etc/srm
PATH=/sbin:/usr/sbin:/bin:$PATH:$SRMSBIN:$SRMBIN
export PATH
case "$1" in
'start')
if [ ! -x $SRMBIN/srmadm ]; then
echo "Solaris Resource Manager *not* installed." \
"Missing srmadm command."
exit
fi
# Only bother if sched/SHR is loaded.
if [ `$SRMBIN/srmadm` != yes ]
then
#
# Usually this is because /etc/system doesn't have the usual
# set initclass="SHR"
# or at least a set extraclass="SHR"
#
echo "Solaris Resource Manager *not* loaded."
exit
else
echo "Enabling Solaris Resource Manager v1.0."
if [ `$SRMBIN/srmadm show fileopen` = yes ]; then
echo "SRM database file already open - stopping first."
limdaemon -k
sleep 2
srmadm set $ChargeOptionsOff
sync
srmadm set fileopen=n
$ECHO "SRM inactive"
fi
$ECHO "Starting SRM..."
fi
# Check the limconf file.
if [ ! -s $ETCSRM/limconf ]; then
echo "SRM - file $ETCSRM/limconf is missing " >&2
echo "SRM not started."
exit 1
fi
if [ ! -f "$ShareDb" ]; then
echo "SRM database '$ShareDb' not present - " \
"creating empty database"
if [ ! -d "$DATADIR" ]; then
mkdir "$DATADIR"
chmod 400 "$DATADIR"
chown root "$DATADIR"
chgrp root "$DATADIR"
fi
touch "$ShareDb" ||
{
echo "Failed to create '$ShareDb'" >&2
echo "SRM not started"
exit 1
}
chmod 400 "$ShareDb"
chown root "$ShareDb"
chgrp root "$ShareDb"
fi
CreateLnodes=0
if [ ! -s "$ShareDb" ]; then
$ECHO "SRM Warning: Using empty database" >&2
CreateLnodes=1
fi
$ECHO "SRM starting ... \c"
# Open Lnode file.
srmadm set -f "$ShareDb" fileopen=y
if [ $? != 0 ]; then
echo
echo "srmadm set -f $ShareDb failed" >&2
echo "SRM not started"
exit 1
fi
# Set SRM global options.
srmadm set $ChargeOptionsOn
if [ $? != 0 ]; then
echo
echo "srmadm set $ChargeOptionsOn failed" >&2
echo "SRM not completely enabled"
exit 1
fi
# Create if needed the other lnode.
liminfo other 2>/dev/null | grep "^Login name: *other " >/dev/null 2>&1
if [ $? -ne 0 ]; then
# If user "other" exists but has no lnode, create one.
limadm set cpu.shares=1 other 2>/dev/null
limadm set sgroup=root other 2>/dev/null
fi
# Create if needed, and set the lost lnode.
if [ x"$LostLnode" != x ]; then
liminfo "$LostLnode" 2>/dev/null | \
grep "^Login name: *$LostLnode " >/dev/null 2>&1
if [ $? -ne 0 ]; then
limadm set cpu.shares=1 "$LostLnode"
limadm set sgroup=root "$LostLnode"
fi
srmadm set lost="$LostLnode" ||
$ECHO "SRM - Warning: No user '$LostLnode' for lost lnode"
fi
# Create if needed, and set the idle lnode.
if [ x"$IdleLnode" != x ]; then
liminfo "$IdleLnode" 2>/dev/null | \
grep "^Login name: *$IdleLnode " >/dev/null 2>&1
if [ $? -ne 0 ]; then
limadm set cpu.shares=0 "$IdleLnode"
limadm set sgroup=root "$IdleLnode"
fi
srmadm set idle="$IdleLnode" ||
$ECHO "SRM - Warning: No user '$IdleLnode' for idle lnode"
fi
# If creating SRM database, set up existing users.
if [ "$CreateLnodes" -eq 1 ]; then
echo "SRM - creating user lnodes; may take a while"
# We now want to catch any other users which were not found
# on the filesystems. First we need to decide what the maximum
# uid value we will create an l-node entry for in the database.
# We choose less than the uid for 'nobody' so that we can try
# and minimise the apparent size of the database (which is a sparse
# file). If the user 'nobody' does not exist then we just have
# to take our chances with using all possible uid values.
# Unfortunately all this means that there are certain circumstances
# where not all users will be taken into account.
MaxUID=`awk -F: "\\$1==\"nobody\" { print \\$3 - 100 }" /etc/passwd`
if [ $? -eq 0 -a x"$MaxUID" != x ] ; then
Cond="uid >= 0 && uid < $MaxUID && !flag.real"
else
Cond="uid >= 0 && !flag.real"
fi
UIDS=`limreport "$Cond" '%d\n' uid | wc -l`
if [ $UIDS -gt 0 ]; then
$ECHO "$UIDS other lnodes to be created " \
"due to passwd entries"
limreport "$Cond" 'limadm set -u sgroup=0:cpu.shares=1 %d\necho " uid %7d\r\c"\n' uid uid | sh
echo
fi
fi
limdaemon $LimdaemonOptions
echo "Solaris Resource Manager v1.0 Enabled."
;;
'stop')
# SRM shutdown should be done as late as possible before
# filesystems are unmounted.
if [ -x $SRMBIN/srmadm ] && $SRMBIN/srmadm show fileopen > /dev/null
then
limdaemon -k
sleep 2
srmadm set $ChargeOptionsOff
srmadm set fileopen=n
sync
$ECHO "Solaris Resource Manager Disabled"
fi
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
Ce script crée le noeud limite dans le groupe d'ordonnancement par défaut (other si cet utilisateur existe dans la table des mots de passe, root autrement) et transmet un message à l'administrateur système pour lui rappeler de transférer le nouveau noeud limite à l'endroit approprié dans la hiérarchie d'ordonnancement.
#!/bin/sh
#
#ident "@(#)nolnode.sh 1.6 98/10/28 SMI"
#
# Copyright (c) 1998 by Sun Microsystems, Inc.
# All rights reserved.
#
# Copyright 1995-1997 Softway Pty. Ltd.
#
# A script that called by the PAM module to create a lnode
#
PATH=/usr/srm/bin:/sbin:/bin export PATH
LOCALE=C export LOCALE
if [ "$DEBUG" = "true" ]
then
exec >> /tmp/nolnodelog 2>&1
echo
date
echo "Attempting to create lnode for $USER"
else
exec > /dev/null 2>&1
fi
err=`limadm set -u cpu.shares=1 "$UID" 2>&1`
if [ $? -eq 0 ]
then
cat <<-EOF | /usr/lib/sendmail root
Subject: New lnode created for "$USER"
Remember to change scheduling group and shares for
"$USER".
`limreport lname=='"'"$USER"'"' 'Currently in group "%s" with %d shares\\n' sgroupname cpu.shares`
EOF
else
cat <<-EOF | /usr/lib/sendmail root
Subject: Could not create lnode for "$USER"
after "$SERVICE" attempt on tty "$TTY", uid "$UID",
rhost \""$RHOST"\",
limadm said \""$err"\"
EOF
exit 1 # deny access
fi
# permit access
exit 0