%PDF- %PDF-
Direktori : /etc/rc4.d/ |
Current File : //etc/rc4.d/S01boinc-client |
#! /bin/sh ### BEGIN INIT INFO # Provides: boinc boinc-client # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Should-Start: x11-common network-manager x-display-manager gdm kdm xdm wdm ldm sdm nodm dbus lightdm # Should-Stop: x11-common # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: BOINC core client # Description: core client for the BOINC distributed computing # infrastructure ### END INIT INFO # Debian init.d script for the BOINC core client # Copyright © 2005, 2006, 2007, 2008 # Debian BOINC Maintainers <pkg-boinc-devel@lists.alioth.debian.org> # # This file is licensed under the terms of the GNU General Public License, # Version 2 or any later version published by the Free Software Foundation. set -e . /lib/lsb/init-functions # Default values for the variables that are also set in the defaults file. ENABLED=0 SCHEDULE=0 BOINC_USER=boinc BOINC_DIR=/var/lib/boinc-client BOINC_CLIENT=/usr/bin/boinc BOINC_OOM_ADJ=15 BOINC_OOM_SCORE_ADJ=1000 #VALGRIND_OPTIONS="-v --log-file=/tmp/valgrind_boinc.log " VALGRIND_OPTIONS="" # nice levels BOINC_NICE_CLIENT=10 BOINC_NICE_APP_DEFAULT=19 # minimal #BOINC_NICE_APP_GPU=5 # less than regular, not yet used # ionice classes BOINC_IONICE_CLIENT=3 # idle #BOINC_IONICE_APP_DEFAULT=3 # idle, not yet used #BOINC_IONICE_APP_GPU=2 # best effort, not yet used # Source defaults file. Edit that file to configure this script. if [ -e /etc/default/boinc-client ]; then . /etc/default/boinc-client fi # Quit quietly, if $ENABLED is 0. test "$ENABLED" != "0" || exit 0 if [ "$BOINC_CLIENT" = "/usr/bin/boinc" ]; then test -x "$BOINC_CLIENT" || exit 0 elif [ ! -x "$BOINC_CLIENT" ]; then log_failure_msg "BOINC client '$BOINC_CLIENT' does not exist or is not" \ "executable." exit 5 fi if [ ! -d "$BOINC_DIR" ]; then log_failure_msg "BOINC data directory '$BOINC_DIR' does not exist." exit 6 fi if [ -z "$BOINC_USER" ]; then log_failure_msg "BOINC_USER variable is empty. Set it to a user to run" \ "the BOINC core client." exit 6 fi if [ ! -z "$BOINC_OPTS" ]; then (echo $BOINC_OPTS | grep -- '--daemon' 1>/dev/null) && log_warning_msg "\`--daemon' option detected \ on /etc/default/boinc-client, this \ can cause problems on boinc. The option \ will be suppressed" BOINC_OPTS=`echo "$BOINC_OPTS" | sed 's/--daemon//g'` fi PIDFILE=/var/run/boinc.pid DESC="BOINC core client" NAME=`basename $BOINC_CLIENT` BOINC_OPTS="--check_all_logins --redirectio --dir $BOINC_DIR $BOINC_OPTS" is_running() { retval=1 if [ -r $PIDFILE ]; then pid=`cat $PIDFILE` if [ -e /proc/$pid ]; then procname=`/bin/ps h -p $pid` [ -n "$procname" ] && retval=0 fi fi return $retval } start() { log_begin_msg "Starting $DESC: $NAME" if is_running; then log_progress_msg "already running" else if [ -n "$DISPLAY" -a -x /usr/bin/xhost ]; then # grant the boinc client to perform GPU computing xhost +si:localuser:$BOINC_USER || echo -n "xhost error ignored, GPU computing may not be possible" fi if [ -n "$VALGRIND_OPTIONS" ]; then start-stop-daemon --start --quiet --background --pidfile $PIDFILE \ --make-pidfile --user $BOINC_USER --chuid $BOINC_USER \ --chdir $BOINC_DIR --exec /usr/bin/valgrind -- $VALGRIND_OPTIONS $BOINC_CLIENT $BOINC_OPTS else start-stop-daemon --start --quiet --background --pidfile $PIDFILE \ --make-pidfile --user $BOINC_USER --chuid $BOINC_USER \ --chdir $BOINC_DIR --exec $BOINC_CLIENT -- $BOINC_OPTS fi fi log_end_msg 0 if [ "$SCHEDULE" = "1" ]; then schedule fi } stop() { log_begin_msg "Stopping $DESC: $NAME" if ! is_running; then log_progress_msg "not running" else start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE \ --user $BOINC_USER --exec $BOINC_CLIENT # Wait until really stopped - $pid is set from is_running # (waiting for max 60s (600 cycles at 100ms)) i=0 while kill -0 "$pid" 2> /dev/null; do if [ $i = '600' ]; then break; else if [ $i = '0' ]; then echo -n " ... waiting " elif [ $(($i%10)) = 0 ]; then echo -n "." fi i=$(($i+1)) sleep .1 fi done fi rm -f "$BOINC_DIR/lockfile" rm -f $PIDFILE log_end_msg 0 } chrt_many() { POLICY="$1" PRIO="$2" NICE="$3" shift 3 for i in "$@"; do chrt -p $POLICY $PRIO $i || return # increasing compatibility with older versions of renice # in reaction to bug report #600134 renice $NICE -p $i > /dev/null || renice -n $NICE -p $i done } schedule() { log_begin_msg "Setting up scheduling for $DESC and children:" if ! is_running; then log_progress_msg "$NAME not running" else if [ ! -x "`which ionice 2>/dev/null`" ]; then log_progress_msg "ionice not found," else if ionice -c $BOINC_IONICE_CLIENT -p $pid 2>/dev/null; then log_progress_msg "idle," else log_progress_msg "ionice failed," fi fi children=`ps --ppid $pid -o pid= | tr '\n' ' '` if [ ! -x "`which chrt 2>/dev/null`" ]; then log_progress_msg "chrt not found" else # BOINC client needs higher priority than scientific apps renice $BOINC_NICE_CLIENT -p $pid > /dev/null || renice -n $BOINC_NICE_CLIENT -p $pid # Apps receive minimal priority if [ -n "$children" ]; then (chrt_many --idle 0 $BOINC_NICE_APP_DEFAULT $children >/dev/null \ && log_progress_msg "idleprio") || \ (chrt_many --batch 0 $BOINC_NICE_APP_DEFAULT $children >/dev/null \ && log_progress_msg "batch") || \ (chrt_many --other 0 $BOINC_NICE_APP_DEFAULT $children >/dev/null \ && log_progress_msg "normal") || \ log_progress_msg "chrt failed" fi fi for BPID in ${pid} ${children}; do # Fallback to old oom_adj if oom_score_adj doesn't exist if [ -w /proc/${BPID}/oom_score_adj ]; then echo ${BOINC_OOM_SCORE_ADJ} > /proc/${BPID}/oom_score_adj 2>/dev/null || true elif [ -w /proc/${BPID}/oom_adj ]; then echo ${BOINC_OOM_ADJ} > /proc/${BPID}/oom_adj 2>/dev/null || true else echo "Could not adjust oom_score of task" fi done fi log_end_msg 0 } status() { STATUS="Status of $DESC:" if is_running; then log_success_msg "$STATUS running" children=`ps --ppid $pid -o pid= | tr '\n' ' '` if [ -x "`which chrt 2>/dev/null`" ]; then log_success_msg "Scheduling of $DESC: $pid" chrt -p $pid if [ -n "$children" ]; then log_success_msg "Scheduling of $DESC's children: $children" for i in $children; do chrt -p $i done fi fi log_success_msg "OOM killer status for $DESC:" for BPID in ${pid} ${children}; do echo -n "PID ${BPID}: " if [ ! -d "/proc/${BPID}" ]; then echo "/proc/${BPID} not found" continue fi echo -n "adj " if [ -r "/proc/${BPID}/oom_adj" ]; then cat /proc/${BPID}/oom_adj else echo "?" fi echo ", score " if [ -r "/proc/${BPID}/oom_adj" ]; then cat /proc/${BPID}/oom_score else echo -n "?" fi echo done # Display $BOINC_USER's cpu_share: uid=`id -u $BOINC_USER` cpu_share_file="/sys/kernel/uids/$uid/cpu_share" if [ -f "$cpu_share_file" ]; then log_success_msg "cpu_share: `cat "$cpu_share_file"`" fi else log_success_msg "$STATUS stopped" fi } case "$1" in start) start ;; stop) stop ;; restart|force-reload) stop sleep 1 start ;; status) status ;; schedule) schedule ;; *) log_success_msg "Usage: $0 {start|stop|restart|force-reload|status|schedule}" >&2 exit 1 ;; esac exit 0