# -*-Shell-script-*- # # Common functions for PLC startup/shutdown scripts # # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # # $Id$ # export PATH=/sbin:/bin:/usr/bin:/usr/sbin # Source function library . /etc/init.d/functions # Total number of errors ERRORS=0 # Count the exit status of the last command check () { ERRORS=$(($ERRORS+$?)) } # Print status header dialog () { echo -n "PLC: $*: " >&3 } # Print result result () { if [ $ERRORS -eq 0 ] ; then success "$*" >&3 else failure "$*" >&3 fi echo >&3 } # Start up a program with a plc_ prefix plc_daemon () { base=${1##*/} # See if it's already running. Look *only* at the pid file. if [ -f /var/run/plc_${base}.pid ]; then local line p read line < /var/run/plc_${base}.pid for p in $line ; do [ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p" done fi [ -n "${pid:-}" -a -z "${force:-}" ] && return # And start it up. # Thierry -- June 18 2007 # when invoking, e.g. service plc start httpd from an ssh connection # ssh stupidly hangs when everything is done # it turns out the forked ssh daemon exhibits the following stack at that point # (gdb) where # #0 0x001d6402 in __kernel_vsyscall () # #1 0x003c2e7d in ___newselect_nocancel () from /lib/libc.so.6 # #2 0x004387b4 in main () from /usr/sbin/sshd # So I figured the various file descriptors used were not properly closed (exec 3>&- 4>&- ; exec -a plc_${base} $*) ret=$? if [ -f /var/run/${base}.pid ] ; then mv /var/run/${base}.pid /var/run/plc_${base}.pid fi return $ret } # Print IP address of hostname if resolvable gethostbyname () { python -c 'import socket; import sys; print socket.gethostbyname(sys.argv[1])' $1 2>/dev/null } # Forcefully make a symlink symlink () { mkdir -p $(dirname $2) rm -f $2 ln -s $1 $2 } # Argument(s) or stdin to lowercase stdout lower () { if [ ${#*} -ge 1 ] ; then tr A-Z a-z <<<$* else tr A-Z a-z fi } # Argument(s) or stdin to uppercase stdout upper () { if [ ${#*} -ge 1 ] ; then tr a-z A-Z <<<$* else tr a-z A-Z fi } # Make copies of stdout and stderr. The plc initscript redirects # stdout and stderr to a logfile if -v is not specified. [ ! -e /proc/self/fd/3 ] && exec 3>&1 [ ! -e /proc/self/fd/4 ] && exec 4>&2