• If you need help or want to discuss things, you now can also join us on our Discord Server!
  • Happy New Year everyone! A new version (1.0.0-beta.16) is out for Linux, fixing an issue that could lock the bot up when using it with TS3. Please visit the resources section or the main page (https://www.sinusbot.com) for the new package.

Startscript direkt mitliefern

Status
Not open for further replies.

Huskynarr

Member
Ein wichtiger Punkt der mich bei vielen Dingen wie Minecraft, Teamspeak & Co. aufregt, sind die Starter.
Einen einfachen Starter hinzufügen das wäre super.

sinusbot.sh mit Start und Stop Befehlen die man dann auch per update.rc dann einfügen könnte. :)
 

flyth

is reticulating splines
Staff member
Developer
Contributor
Ja, ich vergesse das nur immer wieder... :) Ich guck mal, dass ich bei der nächsten Version eins für Debian und Ubuntu mitliefere...
 
@Hushynarr
Solltest du nach einer sh suchen, kann ich meine anbieten. Nicht die beste aber erfüllt ihren Zweck :D
#!/bin/sh
#/etc/init.d/musikbot
### BEGIN INIT INFO
# Provides: musikbotautostart
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

case "$1" in
'start')
echo "--------------------------------------------------"
echo " Der Musik-Bot wird gestartet "
echo "--------------------------------------------------"
cd /opt/ts3soundboard
screen -dmS "bot1" script -a --flush -c "sudo -u bot xinit /opt/ts3soundboard/ts3bot -- /usr/bin/Xvfb :1 -screen 0 800x600x16 -ac"
;;
'stop')
echo "--------------------------------------------------"
echo " Der Musik-Bot wird gestoppt "
echo "--------------------------------------------------"
killall -r screen
;;
*) echo "usage (Start | Stop | Restart)" ;;
esac
exit 0
 

ch4os

New Member
Hier mal mein Startscript, was ich aktuell verwende.
Erlaubt u.a. wieder das Öffnen der Konsole:


#! /bin/bash

##################################################################################
# #
# Usage: ./launch.sh {start|stop|status|restart|console} #
# - start: start the bot #
# - stop: stop the bot #
# - status: display the status of the bot (down or up) #
# - restart: restart the bot #
# - console: display the bot console #
# To exit the console without stopping the server, press CTRL + A then D. #
# #
##################################################################################

SCREEN_NAME="sinusbot"
USER="sinusbot"
DIR_ROOT="/home/sinusbot"
BOT_RUNCMD="xinit ./ts3bot -- /usr/bin/Xvfb :1 -screen 0 800x600x16 -ac"

# No edits necessary beyond this line
PATH=/bin:/usr/bin:/sbin:/usr/sbin
if [ ! -x `which awk` ]; then echo "ERROR: You need awk for this script (try apt-get install awk)"; exit 1; fi
if [ ! -x `which screen` ]; then echo "ERROR: You need screen for this script (try apt-get install screen)"; exit 1; fi

function start {
if [ ! -d $DIR_ROOT ]; then echo "ERROR: $DIR_ROOT is not a directory"; exit 1; fi
if status; then echo "$SCREEN_NAME is already running"; exit 1; fi

# Start bot
if [ `whoami` = root ]
then
su - $USER -c "cd $DIR_ROOT ; screen -AmdS $SCREEN_NAME $BOT_RUNCMD"
else
cd $DIR_ROOT
screen -AmdS $SCREEN_NAME $BOT_RUNCMD
fi
}

function stop {
if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

if [ `whoami` = root ]
then
su - $USER -c "killall ts3bot -u $USER"
else
killall ts3bot -u $USER
fi
}

function status {
if [ `whoami` = root ]
then
su - $USER -c "screen -ls" | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
else
screen -ls | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
fi
}

function console {
if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

if [ `whoami` = root ]
then
tmp=$(su - $USER -c "screen -ls" | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}')
su - $USER -c "screen -r $tmp"
else
screen -r $(screen -ls | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}')
fi
}

function usage {
echo "Usage: $0 {start|stop|status|restart|console}"
echo "On console, press CTRL+A then D to stop the screen without stopping the server."
}

case "$1" in

start)
echo "Starting $SCREEN_NAME..."
start
sleep 5
echo "$SCREEN_NAME started successfully"
;;

stop)
echo "Stopping $SCREEN_NAME..."
stop
sleep 5
echo "$SCREEN_NAME stopped successfully"
;;

restart)
echo "Restarting $SCREEN_NAME..."
status && stop
sleep 10
start
sleep 5
echo "$SCREEN_NAME restarted successfully"
;;

status)
if status
then echo "$SCREEN_NAME is UP"
else echo "$SCREEN_NAME is DOWN"
fi
;;

console)
echo "Open console on $SCREEN_NAME..."
console
;;

*)
usage
exit 1
;;

esac

exit 0
 

Huskynarr

Member
@Klopapiermeister an sowas einfaches dachte ich.
@ch4os ... wow :D Gut ausgearbeitet, wäre es aber nicht sicherer wenn man ne pid File anlegt um die Prozess ID zu überprüfen?
Also doppelte Prüfung Session und pid.
 

ch4os

New Member
Naja, startest Du denn mehrere ts3bot-Prozesse mit dem gleichen User? Die Schwierigkeit ist hier, dass ich ja die PID vom ts3bot-Prozess benötige, der gerade gestartet wurde.

Man könnte also die PID ermitteln vom screen-Prozess, z.B. mit:
screen -ls | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}'

Aber dann müsste ich ja die PID ermitteln des ts3bot-Prozesses, der von xinit gestartet wurde, das von [screen mit PID] gestartet wurde. Da bin ich mir nicht ganz sicher, wie man das elegant lösen soll. Daher hab ich einfach killall verwendet ;)
 

tommytom

New Member
Man könnte direkt nach dem Starten des ts3bot noch folgendes ausführen:
& echo $! > pid.pid

Das schreibt die PID des zuletzt gestarteten Programmes in die Datei "pid.pid".
Hilft das weiter? Wie das in der Kombination mit xinit aussieht kann ich gerade nicht genau sagen. Schwierig..
 

ch4os

New Member
Ah, sehr praktisch @ $! ... Könnte man mal probieren. Muss aber ehrlich sagen, das killall funktioniert aktuell so gut, ich seh da gar keinen Bedarf, das nochmal anzupassen ^^
 

Huskynarr

Member
tommytom und ich haben halt etwas gesprichen und das Problem ist. Manche wie ich und er haben ts3bots parallel laufen.
So würde er einfach den killen den er findet, auch wenn er es nicht sollte.
Das ist ein potentielles Risiko.
 

Shahannass

Member
Warum mehrere? Dafür gibt es die Instanzen ; ) Und das Limit für die Instanzen zu umgehen ist sicher nicht erwünscht.
 

W0nd3r

Member
Wie schaut das aus mit dem 1. Script was hier gepostet wurde?
Muss sich nicht auch das Script erst mit dem Bot-User sprich in meinem Fall "su bot" einloggen?
Sonst wird es doch mit dem rootuser gestartet, oder?
 

flyth

is reticulating splines
Staff member
Developer
Contributor
Da steht ein "sudo -u bot" im Command mit drin^^
 

maggos

Donor
is awesome!
Ich habe jetzt einen crontab Eintrag gemacht "@reboot /home/bot/sinusbot.sh start > /home/bot/bot.log 2>&1" - nach einem reboot startet der Bot auch und spielt ab.
Nun wollte ich noch eine Überwachung einbauen die alle x Minuten schaut ob der Bot noch da ist und falls gecrasht neu startet.
Eine watch.sh angelegt mit folgendem Inhalt:

# cat watch.sh
#!/bin/bash
/bin/ps -ef | grep ts3bot > /home/bot/watch.log 2>&1
if [ $? -ne 1 ]
then
/home/bot/sinusbot.sh start > /home/bot/restart.log 2>&1
else
sleep 0
fi

Ich habe mir das Script aus Google gesucht weil ich davon keine Ahnung habe :)
Der Bot startet zwar, aber nicht die TS3 Instanzen.

1. Geht das überhaupt so wie ich mir das vorstelle und wenn ja dann
2. Was mache ich falsch?

Debian 8 in einer VM
sinusbot.sh ist das Script von ch4os mit angepassten Pfaden

Ich danke schonmal für eure Hilfe
Grüße
Markus

@edit: da ich noch keinen Crash hatte bisher, tue ich den Bot stoppen um zu testen, damit per cron die watch.sh gestartet wird. Liegt eventl. da der Fehler?
 
Last edited:

Xuxe

Containerholic
Staff member
is awesome!
V.I.P.
Contributor
Insider
@edit: da ich noch keinen Crash hatte bisher, tue ich den Bot stoppen um zu testen, damit per cron die watch.sh gestartet wird. Liegt eventl. da der Fehler?
Stoppst du auch den Screen? Wenn ich das so richtig sehe fragst du den Screen ab ob der da ist oder nicht.

Es gab hier im Forum mal nen Startscript, das hatte ich auch selber in Verwendung allerdings ging das mit der 0.9.9 nicht mehr vernünftig, hatte bis jetzt aber noch nicht geschaut was Falsch ist.. ich schau da denke ich gleich mal drüber.

Wenn der Sinusbot "crasht" bleibt der glaube ich aber im Screen, zumindest war es bisher so wenn er mal gecrasht ist. das heißt dein Watch Script da könnte nichts wirklich ausrichten, das müsste man dann anders abfragen (Webserver Port, PID oder so).
 

Xuxe

Containerholic
Staff member
is awesome!
V.I.P.
Contributor
Insider
So da bin ich grad wieder, ich habe das Script von @ch4os für die 0.9.9 angepasst.
Getestet es geht unter Ubuntu 14.04. Debian sollte also auch kein ding sein.

Code:
#! /bin/bash

##################################################################################
# #
# Usage: ./launch.sh {start|stop|status|restart|console} #
# - start: start the bot #
# - stop: stop the bot #
# - status: display the status of the bot (down or up) #
# - restart: restart the bot #
# - console: display the bot console #
# To exit the console without stopping the server, press CTRL + A then D. #
# #
##################################################################################

SCREEN_NAME="ts3bot"
USER="xuxe"
DIR_ROOT="/opt/ts3soundboard/"
BOT_RUNCMD="./sinusbot"

# No edits necessary beyond this line
PATH=/bin:/usr/bin:/sbin:/usr/sbin
if [ ! -x `which awk` ]; then echo "ERROR: You need awk for this script (try apt-get install awk)"; exit 1; fi
if [ ! -x `which screen` ]; then echo "ERROR: You need screen for this script (try apt-get install screen)"; exit 1; fi

function start {
if [ ! -d $DIR_ROOT ]; then echo "ERROR: $DIR_ROOT is not a directory"; exit 1; fi
if status; then echo "$SCREEN_NAME is already running"; exit 1; fi

# Start bot
if [ `whoami` = root ]
then
su - $USER -c "cd $DIR_ROOT ; screen -AmdS $SCREEN_NAME $BOT_RUNCMD"
else
cd $DIR_ROOT
screen -AmdS $SCREEN_NAME $BOT_RUNCMD
fi
}

function stop {
if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

if [ `whoami` = root ]
then
su - $USER -c "killall sinusbot -u $USER"
else
killall ts3bot -u $USER
fi
}

function status {
if [ `whoami` = root ]
then
su - $USER -c "screen -ls" | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
else
screen -ls | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
fi
}

function console {
if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

if [ `whoami` = root ]
then
tmp=$(su - $USER -c "screen -ls" | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}')
su - $USER -c "screen -r $tmp"
else
screen -r $(screen -ls | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}')
fi
}

function usage {
echo "Usage: $0 {start|stop|status|restart|console}"
echo "On console, press CTRL+A then D to stop the screen without stopping the server."
}

case "$1" in

start)
echo "Starting $SCREEN_NAME..."
start
sleep 5
echo "$SCREEN_NAME started successfully"
;;

stop)
echo "Stopping $SCREEN_NAME..."
stop
sleep 5
echo "$SCREEN_NAME stopped successfully"
;;

restart)
echo "Restarting $SCREEN_NAME..."
status && stop
sleep 10
start
sleep 5
echo "$SCREEN_NAME restarted successfully"
;;

status)
if status
then echo "$SCREEN_NAME is UP"
else echo "$SCREEN_NAME is DOWN"
fi
;;

console)
echo "Open console on $SCREEN_NAME..."
console
;;

*)
usage
exit 1
;;

esac

exit 0



-------
Einfach als root in /etc/init.d/ts3bot packen und die Werte wie user, screen_name und dir_root anpassen.

dann:

chmod +x /etc/init.d/ts3bot
update-rc.d ts3bot defaults


Der Bot sollte dann beim Booten Starten.
über den befehl: service ts3bot status lässt sich der Status anzeigen.
 
Last edited by a moderator:

Raphraph

Donor
is awesome!
Contributor
Insider
Noch ein kleines update :D

Ich habe hier eine alternative, für die die den "killall" aus irgendwelchen Gründen nicht ausführen können ^^

Code:
#! /bin/bash

##################################################################################
# #
# Usage: ./launch.sh {start|stop|status|restart|console} #
# - start: start the bot #
# - stop: stop the bot #
# - status: display the status of the bot (down or up) #
# - restart: restart the bot #
# - console: display the bot console #
# To exit the console without stopping the server, press CTRL + A then D. #
# #
##################################################################################

SCREEN_NAME="ts3bot"
USER="xuxe"
DIR_ROOT="/opt/ts3soundboard/"
BOT_RUNCMD="./sinusbot"

# No edits necessary beyond this line
PATH=/bin:/usr/bin:/sbin:/usr/sbin
if [ ! -x `which awk` ]; then echo "ERROR: You need awk for this script (try apt-get install awk)"; exit 1; fi
if [ ! -x `which screen` ]; then echo "ERROR: You need screen for this script (try apt-get install screen)"; exit 1; fi

function start {
if [ ! -d $DIR_ROOT ]; then echo "ERROR: $DIR_ROOT is not a directory"; exit 1; fi
if status; then echo "$SCREEN_NAME is already running"; exit 1; fi

# Start bot
if [ `whoami` = root ]
then
su - $USER -c "cd $DIR_ROOT ; screen -AmdS $SCREEN_NAME $BOT_RUNCMD"
else
cd $DIR_ROOT
screen -AmdS $SCREEN_NAME $BOT_RUNCMD
fi
}

function stop {
if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

if [ `whoami` = root ]
then
su - $USER -c "screen -S $SCREEN_NAME -X stuff '\003'"
else
screen -S $SCREEN_NAME -X stuff '\003'
fi
}

function status {
if [ `whoami` = root ]
then
su - $USER -c "screen -ls" | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
else
screen -ls | grep [.]$SCREEN_NAME[[:space:]] > /dev/null
fi
}

function console {
if ! status; then echo "$SCREEN_NAME could not be found. Probably not running."; exit 1; fi

if [ `whoami` = root ]
then
tmp=$(su - $USER -c "screen -ls" | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}')
su - $USER -c "screen -r $tmp"
else
screen -r $(screen -ls | awk -F . "/\.$SCREEN_NAME\t/ {print $1}" | awk '{print $1}')
fi
}

function usage {
echo "Usage: $0 {start|stop|status|restart|console}"
echo "On console, press CTRL+A then D to stop the screen without stopping the server."
}

case "$1" in

start)
echo "Starting $SCREEN_NAME..."
start
sleep 5
echo "$SCREEN_NAME started successfully"
;;

stop)
echo "Stopping $SCREEN_NAME..."
stop
sleep 5
echo "$SCREEN_NAME stopped successfully"
;;

restart)
echo "Restarting $SCREEN_NAME..."
status && stop
sleep 10
start
sleep 5
echo "$SCREEN_NAME restarted successfully"
;;

status)
if status
then echo "$SCREEN_NAME is UP"
else echo "$SCREEN_NAME is DOWN"
fi
;;

console)
echo "Open console on $SCREEN_NAME..."
console
;;

*)
usage
exit 1
;;

esac

exit 0

Die Änderung ist bei der "stop"-Funktion, in der einfach "Ctrl + C" an den screen übergeben wird :)
 

maggos

Donor
is awesome!
Ich habe jetzt komplettes Chaos verursacht und alles gelöscht.
Jetzt habe ich die aktuelle Beta drauf und neu eingerichtet. Erstmal läuft der Bot wieder - puh.

Startscript probier ich am Nachmittag
 
Last edited:

Patschi

Head of troll department / Xuxe dominator
Tier III
is awesome!
V.I.P.
is uber awesome!
Insider
Ich habe hier eine alternative, für die die den "killall" aus irgendwelchen Gründen nicht ausführen können ^^

Doof gefragt: Hast du das Paket psmisc installiert, was den Befehl mitliefert?
 

Raphraph

Donor
is awesome!
Contributor
Insider
:D ich kenne mich mit Linux gut genug aus ;) Es ist nur so, dass ein paar der von mir benutzten Root-Server, mit einer Virtualisierungs-Software (PROXMOX) virtualisiert wurden. :) Und der V-Server auf dem der SinusBot läuft, braucht diesen Befehl nicht und soll ihn auch nicht ausführen können :)
 
Status
Not open for further replies.
Top