wok rev 11976
boinc: add edited init script to stuff
author | Samuel Trassare <samuel_trassare@yahoo.com> |
---|---|
date | Fri Mar 02 11:55:07 2012 -0800 (2012-03-02) |
parents | af8ffb10039b |
children | 062741b552e9 |
files | boinc/stuff/boinc-client |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/boinc/stuff/boinc-client Fri Mar 02 11:55:07 2012 -0800 1.3 @@ -0,0 +1,378 @@ 1.4 +#!/bin/bash 1.5 +# 1.6 +# BOINC - start and stop the BOINC client daemon on Unix 1.7 +# 1.8 +# Unix start/stop script to run the BOINC client as a daemon at 1.9 +# system startup, as the 'boinc' user (not root!). 1.10 +# 1.11 +# This version should work on unixes that have bash, zsh, or ksh. If 1.12 +# started with another Bourne compatible shell, it will attempt to restart 1.13 +# in bash, zsh, or ksh. 1.14 +# 1.15 +# Metadata for chkconfig and the SUSE equivalent INIT info are included below. 1.16 +# 1.17 +# Usage: boinc { start | stop | status | reload | restart } 1.18 +# 1.19 + 1.20 +# Defaults, which can be overridden by putting new NAME=value lines 1.21 +# in /etc/sysconfig/boinc-client, /etc/default/boinc-client, 1.22 +# /etc/boinc-client.conf, or the same files under ${sysconfdir} 1.23 + 1.24 +## These 4 installation dirs set by autoconf. ########################## 1.25 +prefix=`dirname /usr/.` 1.26 +exec_prefix=`dirname /usr/.` 1.27 +bindir=`dirname ${exec_prefix}/bin/.` 1.28 +sysconfdir=`dirname ${prefix}/etc/.` 1.29 +######################################################################## 1.30 + 1.31 +# set the basic PATH 1.32 +PATH=/sbin:/bin:/usr/sbin:/usr/bin 1.33 +export PATH 1.34 + 1.35 +# Use ps 1.36 +PS=ps 1.37 + 1.38 +# Name of user to run as: 1.39 +# 1.40 +BOINCUSER=boinc 1.41 + 1.42 +# Working directory. Could be /home/boinc, /var/lib/boinc, etc.. 1.43 +# The reason I prefer /var/lib/boinc is that this works best for a 1.44 +# cluster of computers where /home/anything might be shared between machines 1.45 +# 1.46 +BOINCDIR=/var/lib/boinc 1.47 + 1.48 +# Name of the client executable. This is the file "boinc" if you 1.49 +# unpacked the download file boinc_M.mm.rr_i686-pc-linux-gnu.sh, 1.50 +# but I like to rename it and put it in a public place. 1.51 +# (Hint: move boincmgr to /usr/local/bin too so anyone can easily use it). 1.52 +# 1.53 +BOINCEXE_NAME=boinc_client 1.54 +BOINCEXE=${bindir}/${BOINCEXE_NAME} 1.55 +BOINCCMD_NAME=boinccmd 1.56 +BOINCCMD=${bindir}/${BOINCCMD_NAME} 1.57 + 1.58 +# Log files (you should rotate these occasionally) 1.59 +# 1.60 +LOGFILE=/var/log/${BOINCEXE_NAME}.log 1.61 +ERRORLOG=/var/log/${BOINCEXE_NAME}_err.log 1.62 + 1.63 +# PID file 1.64 +PIDFILE=/var/run/${BOINCEXE_NAME}.pid 1.65 + 1.66 +# BOINC options: for the command line when running the client. 1.67 +# Be aware that --allow_remote_gui_rpc opens up your machine to the world! 1.68 +# 1.69 +# Add this option if you want to allow boinc manager connections from remote 1.70 +# machines 1.71 +#BOINCOPTS="--allow_remote_gui_rpc" 1.72 +# Add this option if you want to turn off all logging 1.73 +#BOINCOPTS="--daemon" 1.74 +# Add this option if you want to redirect logging to the files stderrdae.txt 1.75 +# and stdoutdae.txt in BOINCDIR rather than LOGFILE and ERRORLOG 1.76 +#BOINCOPTS="--redirectio" 1.77 +# Add this option if you want to run only when no logins from anywhere are 1.78 +# active 1.79 +#BOINCOPTS="--check_all_logins" 1.80 +# The default is no options. 1.81 +BOINCOPTS="--dir $BOINCDIR" 1.82 + 1.83 +# Subsys lock file ... 1.84 +LOCKFILE=/var/lock/${BOINCEXE_NAME} 1.85 + 1.86 +# su on Linux seems to need this to be set to work properly in a script 1.87 +export TERM=dumb 1.88 + 1.89 +## 1.90 +# Init script function library. This stuff is Red Hat specific, 1.91 +# but if the functions are not found we create our own simple replacements. 1.92 +# (The idea for replacing the functions comes from OpenAFS. Thanks guys!) 1.93 + 1.94 +if printf "Hello" >/dev/null 2>/dev/null ; then 1.95 + # printf works 1.96 + printcol='printf \033[60G%s' 1.97 +elif echo -en "Hello" >/dev/null 2>/dev/null ; then 1.98 + # echo -en works 1.99 + printcol='echo -en \033[60G' 1.100 +else 1.101 + # no printf make do with echo -n 1.102 + printcol="echo -n .........." 1.103 +fi 1.104 +function echo_success () { $printcol "[OK]" ; } 1.105 +function echo_failure () { $printcol "[FAILED]" ; } 1.106 +function echo_warning () { $printcol "[WARNING]" ; } 1.107 +function killproc() { 1.108 + PID=`local_pidof $1` 1.109 + [ $PID ] && kill $PID 1.110 +} 1.111 + 1.112 +# Define pidof 1.113 +function local_pidof() { 1.114 + pidof -s -o $$ -o $PPID -o %PPID $1 1.115 +} 1.116 + 1.117 +# Define runuser 1.118 +RUNUSER=su 1.119 + 1.120 +# Some additional places to look for executables 1.121 +# (Should do this after init.d/functions and sysconfig/boinc, which sets PATH) 1.122 +export PATH=${PATH}:${exec_prefix}/sbin:${bindir} 1.123 + 1.124 + 1.125 +## Look for any local configuration settings which override all above 1.126 +## Note: ./boinc-client.conf and ./boinc.conf are for testing purposes 1.127 +config_files=" 1.128 +./boinc-client.conf 1.129 +./boinc.conf 1.130 +/etc/boinc-client.conf 1.131 +/etc/boinc.conf 1.132 +none 1.133 +" 1.134 + 1.135 +## find the correct config file 1.136 +for config_file in $config_files ; do 1.137 + if [ -f ${config_file} ] ; then 1.138 + break; 1.139 + fi 1.140 +done 1.141 + 1.142 +if [ "${config_file}" != "none" ]; then 1.143 + # check whether we are using a deprecated name 1.144 + if [ "x$NOWARNING" != "xyes" -a -z "`echo ${config_file} | grep boinc-client`" ]; then 1.145 + fn=`basename $config_file` 1.146 + dn=`dirname $config_file` 1.147 + newname=`echo $fn | sed 's/boinc/boinc-client/'` 1.148 + echo -n "The filename '${config_file}' is deprecated..." 1.149 + echo_warning 1.150 + echo 1.151 + echo -n "Please rename your config file to '${dn}/${newname}'" 1.152 + echo_warning 1.153 + echo 1.154 + fi 1.155 + # execute the config file. 1.156 + . ${config_file} 1.157 +fi 1.158 + 1.159 + 1.160 +## Add ${BOINCDIR} to the path, just in case the executables are stored there. 1.161 +export PATH=${PATH}:${BOINCDIR} 1.162 + 1.163 +## Create the working directory if it doesn't exist: 1.164 +if [ ! -d $BOINCDIR ]; then 1.165 + echo -n "Creating $BOINCDIR " 1.166 + if mkdir -p $BOINCDIR 2>/dev/null ; then 1.167 + if [ -n "$BOINCUSER" ] ; then 1.168 + if chown $BOINCUSER $BOINCDIR ; then 1.169 + echo_success 1.170 + else 1.171 + echo_failure 1.172 + echo 1.173 + exit 7 1.174 + fi 1.175 + fi 1.176 + else 1.177 + echo_failure 1.178 + echo 1.179 + exit 7 1.180 + fi 1.181 +fi 1.182 + 1.183 +## Check what user we are running as: 1.184 +# we can't rely on the existence of "whoami" or "logname", so we'll use ps. 1.185 +USERNOW=`${PS} u $$ | tail -1 | awk '{print $2}'` 1.186 +if [ -z "$BOINCUSER" ] ; then 1.187 + BOINCUSER="${USERNOW}" 1.188 +fi 1.189 + 1.190 +## Check that BOINCUSER actually exists 1.191 +if [ -z "`grep ^${BOINCUSER}: /etc/passwd`" ] ; then 1.192 + if [ -z "`ypcat passwd 2>/dev/null | grep ^${BOINCUSER}:`" ] ; then 1.193 + if [ -z "`nidump passwd / 2>/dev/null | grep ^${BOINCUSER}:`" ] ; then 1.194 + echo -n ERROR: user ${BOINCUSER} does not exist. 1.195 + echo_failure 1.196 + echo 1.197 + exit 9 1.198 + fi 1.199 + fi 1.200 +fi 1.201 + 1.202 +# if we are running as root, print a warning. 1.203 +if [ "x$NOWARNING" != "xyes" -a "$BOINCUSER" = "root" ] ; then 1.204 + echo -n WARNING: boinc-client will be running as root 1.205 + echo_warning 1.206 + echo 1.207 +fi 1.208 + 1.209 +# check whether we will be able to write to the BOINC directory 1.210 +if [ "${USERNOW}" = "${BOINCUSER}" ] ; then 1.211 + if [ ! -O ${BOINCDIR} ] ; then 1.212 + echo -n ERROR: $BOINCDIR is not owned by $BOINCUSER. 1.213 + echo_failure 1.214 + echo 1.215 + exit 8 1.216 + fi 1.217 +elif [ "${USERNOW}" = "root" ] ; then 1.218 + cmd="if test -O ${BOINCDIR} ; then echo success ; fi" 1.219 + if [ -z `su $BOINCUSER -c "$cmd"` ]; then 1.220 + echo -n ERROR: $BOINCDIR is not owned by $BOINCUSER. 1.221 + echo_failure 1.222 + echo 1.223 + exit 8 1.224 + fi 1.225 +fi 1.226 + 1.227 + 1.228 +## Locate the executable, either boinc_client, boinc, 1.229 +## or boinc_M.mm_.... with highest version number 1.230 +## We only do this if BOINCEXE set above isn't found or is not executable. 1.231 +if [ ! -x $BOINCEXE ]; then 1.232 + BOINCEXE=`$WHICH $BOINCEXE_NAME 2>/dev/null` 1.233 + if [ ! -x "$BOINCEXE" ]; then 1.234 + BOINCEXE=`$WHICH boinc 2>/dev/null` 1.235 + fi 1.236 +fi 1.237 + 1.238 +if [ ! -x "$BOINCEXE" ]; then 1.239 + echo -n "Cannot find an executable for the BOINC client." 1.240 + echo_failure 1.241 + echo 1.242 + exit 2 1.243 +fi 1.244 + 1.245 +## boinccmd will probably be in the same place as the boinc_client 1.246 +if [ ! -x $BOINCCMD ]; then 1.247 + BOINCCMD=`$WHICH $BOINCCMD_NAME 2>/dev/null` 1.248 + if [ ! -x "$BOINCCMD" ]; then 1.249 + BOINCCMD=`dirname $BOINCEXE 2>/dev/null`/${BOINCCMD_NAME} 1.250 + fi 1.251 +fi 1.252 + 1.253 + 1.254 +if [ "x$NOWARNING" != "xyes" -a ! -x $BOINCCMD ]; then 1.255 + echo -n "Cannot find the boinccmd executable. Reload will fail." 1.256 + echo_warning 1.257 + echo 1.258 +fi 1.259 + 1.260 +## Functions: $1 is one of start|stop|status|reload|restart 1.261 + 1.262 +export NOWARNING=no 1.263 + 1.264 +case "$1" in 1.265 + start) 1.266 + cd $BOINCDIR 1.267 + PID=`local_pidof $BOINCEXE_NAME` 1.268 + 1.269 + if [ -f lockfile -o -f $LOCKFILE ] ; then 1.270 + if [ -z "$PID" ] ; then 1.271 + # a lockfile exists, but boinc_client isn't running 1.272 + /bin/rm -f lockfile $LOCKFILE $PIDFILE 2>&1 > /dev/null 1.273 + else 1.274 + echo -n "Another instance of BOINC is running (PID=${PID})." 1.275 + echo_failure 1.276 + echo 1.277 + exit 1 1.278 + fi 1.279 + fi 1.280 + 1.281 + if [ ! -d projects ] ; then 1.282 + echo -n "The BOINC client requires initialization." 1.283 + echo_warning 1.284 + echo 1.285 + fi 1.286 + 1.287 + touch ${LOGFILE} ${ERRORLOG} 1.288 + NOCORE="ulimit -c 0 2>&1 >/dev/null" 1.289 + echo -n "Starting BOINC client as a daemon: " 1.290 + if [ "${BOINCUSER}" = "${USERNOW}" ] ; then 1.291 + # I am BOINCUSER. Just start client as me. 1.292 + $NOCORE 1.293 + $BOINCEXE $BOINCOPTS >>$LOGFILE 2>>$ERRORLOG & 1.294 + else 1.295 + chown ${BOINCUSER} ${LOGFILE} ${ERRORLOG} 1.296 + if [ -f gui_rpc_auth.cfg ] ; then 1.297 + chmod g+r gui_rpc_auth.cfg 1.298 + fi 1.299 + ${RUNUSER} - $BOINCUSER -c "$NOCORE ; $BOINCEXE $BOINCOPTS >>$LOGFILE 2>>$ERRORLOG" 2>/dev/null > /dev/null & 1.300 + fi 1.301 + sleep 3 1.302 + PID=`local_pidof $BOINCEXE_NAME` 1.303 + if [ $PID ]; then 1.304 + echo $PID > $PIDFILE 1.305 + touch $LOCKFILE && echo_success || ( echo_failure ; echo ) 1.306 + fi 1.307 + echo 1.308 + ;; 1.309 + stop) 1.310 + cd $BOINCDIR 1.311 + if [ ! -f $PIDFILE -a ! -f lockfile -a ! -f $LOCKFILE ] ; then 1.312 + echo -n "BOINC is not running (no lockfiles found)." 1.313 + echo_success 1.314 + else 1.315 + echo -n "Stopping BOINC client daemon: " 1.316 + if [ -f $PIDFILE ] ; then 1.317 + PID=`cat $PIDFILE` 1.318 + if [ -n "`${PS} $PID | grep $PID`" ] ; then 1.319 + kill `cat $PIDFILE` 1.320 + sleep 5 1.321 + fi 1.322 + echo_success 1.323 + else 1.324 + killproc $BOINCEXE_NAME && echo_success || echo_failure 1.325 + fi 1.326 + # clean up in any case 1.327 + rm -f lockfile 2>/dev/null >/dev/null 1.328 + rm -f $LOCKFILE 2>/dev/null 1.329 + rm -f $PIDFILE 2>/dev/null 1.330 + fi 1.331 + echo 1.332 + ;; 1.333 + reload) 1.334 + if [ ! -f lockfile -a ! -f $LOCKFILE ] ; then 1.335 + echo "BOINC is not running (no lockfiles found) -- starting service." 1.336 + $0 start 1.337 + else 1.338 + $BOINCCMD --read_cc_config >>$LOGFILE 2>>$ERRORLOG && echo_success || $0 restart 1.339 + fi 1.340 + ;; 1.341 + restart) 1.342 + $0 stop 1.343 + $0 start 1.344 + ;; 1.345 + 1.346 + status) 1.347 + PID=`cat $PIDFILE 2>/dev/null` 1.348 + if [ "$PID" != "" ]; then 1.349 + # is it still running? 1.350 + if [ -z "`${PS} $PID | grep $PID`" ]; then 1.351 + # not running. Try the other tests. 1.352 + PID="" 1.353 + fi 1.354 + fi 1.355 + if [ "$PID" == "" ]; then 1.356 + PID=`local_pidof $BOINCEXE_NAME` 1.357 + fi 1.358 + if [ "$PID" == "" ]; then 1.359 + PID=`local_pidof $BOINCEXE` 1.360 + fi 1.361 + if [ "$PID" != "" ]; then 1.362 + echo "BOINC client is running (pid $PID)." 1.363 + else 1.364 + if [ -f $BOINCDIR/lockfile -o -f $LOCKFILE ]; then 1.365 + echo "BOINC is stopped but lockfile(s) exist." 1.366 + exit 2 1.367 + else 1.368 + echo "BOINC client is stopped." 1.369 + exit 3 1.370 + fi 1.371 + fi 1.372 + ;; 1.373 + 1.374 + *) 1.375 + echo "Usage: boinc {start|stop|restart|reload|status}" 1.376 + exit 1 1.377 +esac 1.378 + 1.379 +exit 1.380 + 1.381 +#EOF#