#!/bin/sh # # BOINC - start and stop the BOINC client daemon on Unix # # Unix start/stop script to run the BOINC client as a daemon at # system startup, as the 'boinc' user (not root!). # # This version works on Red Hat Linux, Fedora, Mandrake, Debian, # and Slackware Linux, and should work on generic Linux systems # provided that they have 'pidof' (most do). # Metadata for chkconfig and the SUSE equivalent INIT info are included below. # # Usage: boinc { start | stop | status | reload | restart } # ### # chkconfig: - 98 02 # description: This script starts the local BOINC client as a daemon # For more information about BOINC (the Berkeley Open Infrastructure # for Network Computing) see http://boinc.berkeley.edu # processname: boinc # config: /etc/sysconfig/boinc # ### BEGIN INIT INFO # Provides: boinc # Required-Start: $network # Required-Stop: $network # Default-Start: # Default-Stop: 0 1 2 6 # Short-Description: This script monitors the BOINC client. # Description: This script starts the local BOINC client as a daemon # For more information about BOINC (the Berkeley Open Infrastructure # for Network Computing) see http://boinc.berkeley.edu ### END INIT INFO # # Eric Myers <myers@vassar.edu> - 27 July 2004 # Department of Physics and Astronomy, Vassar College, Poughkeepsie NY # Eric Myers <myers@spy-hill.net> # Spy Hill Research, Poughkeepsie, New York # @(#) $Id: boinc,v 1.10 2007/12/27 20:09:09 myers Exp $ ######################################################################## # Defaults, which can be overridden by putting new NAME=value lines # in /etc/sysconfig/boinc (for Red Hat/Fedora Linux and variants) # or /etc/default/boinc (for Debian/Ubuntu and variants) # Name of user to run as: # BOINCUSER=boinc # Working directory. Could be /home/boinc, /var/lib/boinc, etc.. # The reason I prefer /var/lib/boinc is that this works best for a # cluster of computers where /home/anything might be shared between machines # BOINCDIR=/var/lib/boinc # Name of the client executable. This is the file "boinc" if you # unpacked the download file boinc_M.mm.rr_i686-pc-linux-gnu.sh, # but I like to rename it and put it in a public place. # (Hint: move boincmgr to /usr/local/bin too so anyone can easily use it). # BOINCEXE=/usr/bin/boinc_client BOINCCMD=/usr/bin/boinc_cmd # Log and error files (you should rotate these occasionally) # LOGFILE=/var/log/boinc.log ERRORLOG=/var/log/boincerr.log # Subsys lock file ... # If there is the subsys directory, then use it ... if [ -d /var/lock/subsys/ ]; then LOCKFILE=/var/lock/subsys/boinc-client elif [ -d /var/lock ]; then LOCKFILE=/var/lock/boinc-client fi # su on Linux seems to need this to be set to work properly in a script export TERM dumb ## # Init script function library. This stuff is Red Hat specific, # but if the functions are not found we create our own simple replacements. # (The idea for replacing the functions comes from OpenAFS. Thanks guys!) if [ -f /etc/rc.d/init.d/functions ] ; then . /etc/rc.d/init.d/functions else export PATH=/sbin:/bin:/usr/sbin:/usr/bin function echo_success () { gprintf " [ OK ] " ; } function echo_failure () { gprintf " [FAILED] " ; } function echo_warning () { gprintf " [WARNING] " ; } function killproc() { PID=`pidof -s -x -o $$ -o $PPID -o %PPID $1` [ $PID ] && kill $PID ; } fi ## Look for any local configuration settings which override all above if [ -f /etc/sysconfig/boinc ]; then . /etc/sysconfig/boinc elif [ -f /etc/default/boinc ]; then . /etc/default/boinc fi ## Verify the working directory exists: if [ ! -d $BOINCDIR ]; then gprintf "Cannot find BOINC directory %s " "$BOINCDIR" echo_failure echo exit 7 fi # BOINC options: for the command line when running the client. # Be aware that --allow_remote_gui_rpc opens up your machine to the world! # #BOINCOPTS="--allow_remote_gui_rpc" BOINCOPTS="--daemon --dir $BOINCDIR" # Some additional places to look for the client executable # (Should do this after init.d/functions and sysconfig/boinc, which sets PATH) export PATH=$BOINCDIR:/usr/local/bin:$PATH ## Locate the executable, either boinc_client, boinc, ## or boinc_M.mm_.... with highest version number ## We only do this if BOINCEXE set above isn't found or is not executable. if [ ! -x $BOINCEXE ]; then BOINCEXE=`/usr/bin/which boinc_client 2>/dev/null` if [ ! -x "$BOINCEXE" ]; then BOINCEXE=`/usr/bin/which boinc 2>/dev/null` fi fi if [ ! -x "$BOINCEXE" ]; then gprintf "Cannot find an executable for the BOINC client." echo_failure echo exit 2 fi ## Functions: $1 is one of start|stop|status|reload|restart case "$1" in start) cd $BOINCDIR if [ ! -d projects ] ; then gprintf "The BOINC client requires initialization (no projects attached)." echo_warning echo fi gprintf "Starting BOINC client as a daemon: " # Check that we're a privileged user if [ `id -u` != 0 ] ; then gprintf "Insufficient rights." echo_failure echo exit 4 fi daemon --check $BOINCEXE --user $BOINCUSER +19 "$BOINCEXE $BOINCOPTS" >>$LOGFILE 2>>$ERRORLOG & try=0 while [ $try -lt 10 ] ; do PID=`pidof -s -x -o $$ -o $PPID -o %PPID $BOINCEXE` if [ $PID ]; then touch $LOCKFILE && echo_success || echo_failure break else sleep 1 fi let try+=1 done; if [ -z $PID ]; then echo_failure fi echo ;; stop) cd $BOINCDIR if [ ! -f lockfile -a ! -f $LOCKFILE ] ; then gprintf "BOINC is not running (no lockfiles found)." echo_success else gprintf "Stopping BOINC client daemon: " killproc $BOINCEXE && echo_success || echo_failure # clean up in any case rm -f $BOINCDIR/lockfile rm -f $LOCKFILE fi echo ;; reload) if [ ! -f lockfile -a ! -f $LOCKFILE ] ; then gprintf "BOINC is not running (no lockfiles found) -- starting service." $0 start else gprintf "Reading configuration: " $BOINCCMD --read_cc_config >>$LOGFILE 2>>$ERRORLOG && echo_success || echo_failure fi echo ;; force-reload) $0 reload $0 restart ;; condrestart|try-restart) $0 status || exit 0 $0 restart ;; restart) $0 stop $0 start ;; status) PID=`pidof -x -o $$ -o $PPID -o %PPID boinc_client` if [ "$PID" == "" ]; then PID=`pidof -x -o $$ -o $PPID -o %PPID $BOINCEXE` fi if [ "$PID" != "" ]; then gprintf "BOINC client is running (pid %s).\n" "$PID" else if [ -f $BOINCDIR/lockfile -o -f $LOCKFILE ]; then gprintf "BOINC is stopped but lockfile(s) exist.\n" exit 2 else gprintf "BOINC client is stopped.\n" exit 3 fi fi ;; *) gprintf "Usage: boinc {start|stop|restart|condrestart|try-restart|reload|force-reload|status}\n" exit 2 esac exit #EOF#