Automatisches Beenden von Diensten

Betrifft OS:
NetBSDFreeBSD

NetBSD und FreeBSD teilen sich eine Init-Implementierung, die vom NetBSD Projekt als Ablösung des weit verbreiteten System-V Init entwickelt wurde. Statt die korrekte Reihenfolge über Ausführungsstufen zu realisieren, kennen die Skripte bei rc(8) ihre Abhängigkeiten. Welche Dienste automatisch gestartet werden, wird in einer Datei Namens /etc/rc.conf festgelegt. Diese Dienste werden dann auch beim Herunterfahren oder Reboot automatisch sauber beendet.

Leider ist das für Dienste, die zur Laufzeit gestartet wurden und nicht in der rc.conf eingetragen sind nicht der Fall. Vor allem auf Entwicklersystemen bei denen Dienste hauptsächlich zum Ausprobieren gedacht sind, oder in wechselnden Umgebungen (Notebook) kommt es gelegentlich vor, dass Dienste manuell gestartet werden und manuell vor dem Herunterfahren gestoppt werden müssen.

Mit dem Parameter onestart können Dienste in /etc/rc.d und /usr/local/etc/rc.d manuell, ohne Eintrag in die rc.conf. gestartet werden. Entsprechend funktionieren auch onestop und onerestart.

Dynamisch Einträge in der rc.conf

Die Lösung des Problems sind dynamische Einträge in der rc.conf. Die Datei rc.conf ist lediglich ein Shell-Skript in dem Variablen für das rc-System angelegt werden können. Entsprechend können wie in Shell-Skripten Variablen bedingt erzeugt werden.

Die meisten Dienste legen einen sogenannten PID-File (eine Datei in der die Process ID des Dienstes hinterlegt ist) an. Oft reicht die Existenz der Datei als Hinweis einen Dienst implizit zu aktivieren, damit er später automatisch gestoppt wird. Das folgende Beispiel sorgt dafür das VPNC, ein Client für Cisco-VPNs, automatisch beendet wird. Das ist besonders wichtig, da viele Cisco-VPNs konfiguriert sind über einen längeren Zeitraum keine Logins mehr zuzulassen, wenn eine Sitzung nicht ordentlich beendet wurde:

test -e /var/run/vpnc/pid && vpnc_enable="YES"

Unter NetBSD fällt das _enable-Suffix weg. Der Eintrag hieße also vpnc=„YES“.

Andere Dienste legen leider kein PID-File an, in einem solchen Fall kann kann pgrep Abhilfe schaffen:

pgrep -x postgres > /dev/null && postgresql_enable="YES"

Beispiele

Das folgende Beispiel ist die /etc/rc.conf des Autors (Stand 26.11.2009), die dynamischen Einträge befinden sich am Ende:

####################
# Basic settings
#
 
# The hostname.
hostname="mobileKamikaze.norad"
 
# Network configuration.
ifconfig_bge0="192.168.1.12/16"
wlans_wpi0="wlan0"
 
# German keyboard.
keymap="german.iso"
 
# Device access ruleset from devfs.rules.
devfs_system_ruleset="localrules"
 
# Clear /tmp during boot.
clear_tmp_enable="YES"
 
####################
# i386 tree
#
 
ldconfig32_paths="/usr/lib32 /usr/local32/lib /usr/local32/lib/compat/pkg"
 
####################
# Base services
#
 
# Service mapper (finger).
inetd_enable="YES"
 
# Print spooler.
lpd_enable="YES"
 
# CPU speed stepping.
powerd_enable="YES"
powerd_flags="-a adaptive -b minimum"
 
# Linux compatibility.
linux_enable="YES"
 
# Deactivate annoying sendmail stuff.
sendmail_msp_queue_enable="NO"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_enable="NO"
 
# Activate moused for the touchpad.
moused_enable="YES"
# Touchpad tracking from 80Hz to 200Hz.
moused_flags="-3 -F 200"
# USB mouse tracking from 125Hz to 1kHz.
moused_ums0_flags="-F 1000 -r 4000"
# USB mouse tracking from 125Hz to 1kHz.
moused_ums1_flags="-F 1000 -r 4000"
 
# NFS mounting is nice to have.
nfs_client_enable="YES"
 
####################
# Local services
#
 
# My personal automounter, better than HAL. :)
automounter_enable="YES"
 
# My personal wlan daemon.
wi_device="wlan0"
 
# Skip musicpd if the music is missing.
test -d /home/musicpd/music &&	musicpd_enable="YES"
 
# User mode file systems.
fusefs_enable="YES"
fusefs_safe="YES"
fusefs_safe_evil="YES"
 
# Time synchronization.
openntpd_enable="YES"
#ntpd_enable="YES"
#ntpd_sync_on_start="YES"
 
# Enable wacom USB tablet support.
#wacom_enable="YES"
 
# Interprocess communication daemon.
dbus_enable="YES"
 
# C build distribution via distcc.
distccd_flags="-a 127.0.0.0/8 --listen 127.0.0.1 -a 192.168.0.0/16 --listen 192.168.1.12 --user distcc --daemon -P /var/run/distccd.pid"
 
# The hardware abstraction layer, kernel panic, probably conflicts with
# automounter.
#hald_enable="YES"
 
# Default vpnc setup.
: {vpnc_conf="hska1.conf dukath.conf"}
: {vpnc_conf_dir="/usr/local/etc/vpnc"}
 
####################
# Clean shutdown of optional daemons.
#
 
test -e /var/run/wi.pid && wi_enable="YES"
test -e /var/run/vpnc/pid && vpnc_enable="YES"
test -e /var/run/httpd.pid && apache22_enable="YES"
test -e /var/run/tor/tor.pid && tor_enable="YES"
test -e /var/run/privoxy/privoxy.pid && privoxy_enable="YES"
pgrep -x postgres > /dev/null && postgresql_enable="YES"
pgrep -x ppp > /dev/null && ppp_enable="YES"

Verweise

  • Die Manual-Pages rc(8), rc.conf(5) und rc.subr(8)
  • Die Manual-Page pgrep(1)