Jump to content

UTServer service script


vortex-5

Recommended Posts

Posted

Ever wish you can run utorrent as a service?

I.E.

sudo service utorrent start

sudo service utorrent stop

sudo service utorrent status

sudo service utorrent restart

sudo service utorrent log

I wanted the same thing so I wrote a script



#!/bin/sh
#
# uTorrent start stop service script
#
# copy to /etc/init.d
# run "update-rc.d utorrent defaults" to install
# run "update-rc.d utorrent remove" to remove
#
# @author FanFan Huang (kaboom05+utorrentscript@gmail.com)
#
#

# BEGIN CONFIGURATION SECTION ####################################

# Path where you want store the log file
# (default recommended)
LOGFILE=/var/log/utorrent.log

# Path for the PID file where the process id is stored
# (default is for debian and ubuntu systems)
PIDFILE=/var/run/utorrent.pid

# Path were you extracted utorrent server
UTORRENT_PATH=/home/vortex-5/shared/utorrent/utorrent-server-v3_0

# Nice value
NICE=15

# END CONFIGURATION SECTION #####################################

uTorrentServer() {
nice -n $NICE $UTORRENT_PATH/utserver -settingspath $UTORRENT_PATH -daemon -logfile $1 -pidfile $2
}

case "$1" in
start)
if [ -e "$PIDFILE" ]; then
echo "uTorrent is already running please terminate first"
else
echo "uTorrent starting"
uTorrentServer $LOGFILE $PIDFILE

while [ ! -e $LOGFILE ]; do
sleep 1 #Wait for file to be generated
done
while [ "" = "$(cat $LOGFILE|grep 'IPv6 is installed')" ]; do
#wait until utorrent has finished bootup
echo -n ".$(cat $LOGFILE|grep 'IPv6 is installed')"
sleep 1
done

RESULT=$(cat $LOGFILE|grep 'bind failed')
if [ -n "$RESULT" ]; then
echo "Port bind failure detected uTorrent may have limited functionality"
else
echo "uTorrent started successfully"
fi
fi
;;
stop)
if [ -e "$PIDFILE" ]; then
echo -n "uTorrent is shutting down"
PID=$(cat $PIDFILE)
kill $PID
while [ -n "$(pidof "utserver")" ]; do
echo -n "."
sleep 1
done
echo "uTorrent Service Terminated"
rm $PIDFILE
rm $LOGFILE
else
echo "Service is not currently running!"
fi
;;
status)
if [ -e "$PIDFILE" ]; then
PID=$(cat $PIDFILE)
echo "uTorrent running pid: $PID"
else
echo "uTorrent not running"
fi
;;
restart)
$0 stop
$0 start
;;
log)
if [ -e "$LOGFILE" ]; then
LOG=$(cat $LOGFILE)
echo "$LOG"
else
echo "uTorrent is not running no active log file"
fi
;;
*)
echo "Usage {start|stop|restart|status|log}"
exit
esac

exit 0

A direct link to the up to date version can be found here https://github.com/vortex-5/utorrent_initd/blob/master/utorrent (which I'll keep updated)

This was originally written for Ubuntu but will work on debian and may work on other platforms as I'm using very standard bash commands.

Posted

The reference script doesn't do a few things

1. it doesn't make sure there was no port binding conflicts on startup (it doesn't read the log messages to make sure UTserver didn't freak out)

2. It doesn't have a log command which I like

3. it doesn't wait long enough for the process to fully terminate when you stop it causing rebind to fail on next startup

I've used the original author's format since he allows it to run as a user process and fixed those bugs


#!/bin/sh
#
#
# Original source: http://forum.utorrent.com/viewtopic.php?id=88044
#
# uTorrent start stop service script
#
# copy to /etc/init.d
# run "update-rc.d utorrent defaults" to install
# run "update-rc.d utorrent remove" to remove
#
#
# version 2 improvments by:
# @author FanFan Huang (kaboom05+utorrentscript@gmail.com)
#
#
#where you extracted your utserver executable
UTORRENT_PATH=SOMEBASEDIR/utorrent-server-v3_0

LOGFILE=/var/log/utorrent.log #must be a writable directory

USER=utorrent #any user account you can create the utorrent user if you like

GROUP=users
NICE=15
SCRIPTNAME=/etc/init.d/utorrent #must match this file name

DESC="uTorrent Server for Linux"
CHDIR=$UTORRENT_PATH
NAME=utserver
UT_SETTINGS=$UTORRENT_PATH
UT_LOG=$LOGFILE

DAEMON_ARGS="-settingspath ${UT_SETTINGS} -logfile ${UT_LOG}"
DAEMON=$CHDIR/$NAME
PIDFILE=/var/run/utorrent.pid
STOP_TIMEOUT=5
INIT_VERBOSE=yes

FAILURE=false

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
FAILURE=false
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
# 3 if port bind failed

start-stop-daemon --start --nicelevel $NICE --quiet --make-pidfile --pidfile $PIDFILE --chuid $USER:$GROUP --chdir $CHDIR --background --exec $DAEMON --test > /dev/null
if [ "$?" = "1" ]; then
return 1
fi

start-stop-daemon --start --nicelevel $NICE --quiet --make-pidfile --pidfile $PIDFILE --chuid $USER:$GROUP --chdir $CHDIR --background --exec $DAEMON -- $DAEMON_ARGS
if [ "$?" != "0" ]; then
return 2
fi

#bind validation
while [ ! -e $LOGFILE ]; do
sleep 1 #Wait for file to be generated
done

while [ ! -n "$(cat $LOGFILE|grep 'IPv6 is installed')" ]; do
#wait until utorrent has finished bootup (IPv6 MESSAGE is the last message)
sleep 1
done

RESULT=$(cat $LOGFILE|grep 'bind failed')
if [ -n "$RESULT" ]; then
return 3
fi

return 0
}

#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
if [ "$RETVAL" = 2 ]; then
return 2
fi

start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
RETVAL="$?"
if [ "$RETVAL" = 2 ]; then
return 2
fi

#block process until server is completed shutting down fully
while [ -n "$(pidof "$NAME")" ]; do
sleep 1
done

# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
rm -f $LOGFILE #we don't want to keep our logfile
return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}

msg_start() {
case "$1" in
0|1)
if [ "$VERBOSE" != no ]; then
log_end_msg 0
fi
;;
2)
if [ "$VERBOSE" != no ]; then
log_end_msg 1
fi
;;
3)
if [ "$VERBOSE" != no ]; then
log_daemon_msg "Port bind failure detected uTorrent may have limited functionality please change the bind port and restart uTorrent"
log_end_msg 1
fi
;;
esac
}

msg_stop() {
case "$1" in
0|1)
if [ "$VERBOSE" != no ]; then
log_end_msg 0
fi
;;
*)
if [ "$VERBOSE" != no ]; then
log_daemon_msg "Failed to stop service exit status $STATUS"
log_end_msg 1
fi
esac
}

case "$1" in
start)
if [ "$VERBOSE" != no ]; then
log_daemon_msg "Starting $DESC"
fi
do_start
msg_start "$?"
;;
stop)
if [ "$VERBOSE" != no ]; then
log_daemon_msg "Stopping $DESC"
fi
do_stop
msg_stop "$?"
;;
status)
if [ -e "$PIDFILE" ]; then
PID=" PID:($(cat $PIDFILE))"
else
PID=""
fi
status_of_proc "$DAEMON" "uTorrent$PID"

if [ "$?" != "0" ]; then
exit $?
fi
;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC"
do_stop
STATUS="$?"
if [ "$STATUS" -ne 0 ] && [ "$STATUS" -ne 1 ]; then
log_daemon_msg "Could not stop exit status $STATUS"
log_end_msg 1
exit 1
fi

do_start
STATUS="$?"
case "$STATUS" in
0)
log_end_msg 0
;;
*)
log_daemon_msg "Restart failed start exist status $STATUS"
log_end_msg 1
esac
;;
log)
if [ -e "$LOGFILE" ]; then
LOG=$(cat $LOGFILE)
echo "$LOG"
else
echo "uTorrent is not running no active log file"
fi
;;

*)

echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload|log}" >&2
exit 3
;;
esac

The original URL still stands as it's in a versioning system: https://github.com/vortex-5/utorrent_initd/blob/master/utorrent

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...