Autostartscript für Teamspeak-Server und Counterstrike-Server (mit init.d)

Server

treuer Stammgast
Hallo zusammen,

ich hab auf meinen Linux Server (ubuntu 8.06; glaub ich ^^) den Teamspeak2 Server installiert (bzw. drauf kopiert)
wenn ich den server über den benutzer "ms" (server liegt in /home/ms/tss2_rc2) starte, geht alles wunderbar

wenn ich den server aber über diesen startscript "tss2" (in /etc/init.d/) automatisch starten lassen möchte, passiert nichts
obwohl die "verknüpfungen" (in /etc/rc2.d/ usw) alle gesetzt sind

wenn ich den script per ssh über root starten mocht kommt diese meldung:
Code:
root@ubuntu-Server:/etc/init.d# ./tss2
-bash: ./tss2: /bin/sh^M: bad interpreter: No such file or directory
root@ubuntu-Server:/etc/init.d#

mein startscript:
Code:
#!/bin/sh

PROG="/home/ms/tss2_rc2/server_linux"
OPTIONS="-PID=tsserver2.pid"

return=$rc_done

case $1 in
start)
echo -n "Initializing TSS2:"
startproc $PROG $OPTIONS || return=$rc_failed
echo -e "$return"
;;
stop)
echo -n "Shutting down TSS2:"
killproc -TERM $PROG || return=$rc_failed
echo -e "$return"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac

exit 0

von der seite hab ich den script:
Link (3. Beitrag)
auch der letzte beitrag hat mir nicht weiter geholfen

alleine bekomme ich dass wahrscheinlicht nicht hin
also schon mal vielen dank für eure hilfe
 
Ich bin jetzt nicht der absolute Linux-Profi, baer vielleicht ist's nur dies:

In der ersten Zeile Deines Scriptes steht der falsche Befehlsinterpreter.

Änder mal
Code:
#!/bin/sh

in
Code:
#!/bin/bash


hth
 
startet immer noch nicht
und beim starten als root kommt jetzt die meldung:
Code:
root@ubuntu-Server:/etc/init.d# ./tss2
-bash: ./tss2: /bin/bash^M: bad interpreter: No such file or directory
root@ubuntu-Server:/etc/init.d#
 
Was auch sein könnte: Unter welchem OS hast Du das Startscript geschrieben?
Wenn es ein DOS/Windows war: Du brauchst einen Texteditor, der das Script im Unix - Format abspeichert, sonst gibt es Kleinholz bei den Zeilenumbrüchen. Darauf könnte dieses komische ^M am Ende der Zeile hinweisen.
 
aaahaaaaa ^^
ich hab jetzt mal auf "Konvertiere in UNIX" geklickt (Notepad++ is einfach genial)
mal schauen was passiert

---

jetzt kommt keine fehlermeldung mehr
aber der will dass ich ihm sage ob er starten oder stoppen soll
(was natürlich beim autostart keiner machen kann)

weiß einer von euch was ich ändern muss?
(ja, ich = linux-noob)

---

könnte es so funktionieren:
Code:
#!/bin/bash

PROG="/home/ms/tss2_rc2/server_linux"
OPTIONS="-PID=tsserver2.pid"

return=$rc_done

echo -n "Initializing TSS2:"
startproc $PROG $OPTIONS || return=$rc_failed

exit 0
 
Zuletzt bearbeitet:
okay
das is mir etwas zu kompliziert

ich hab jetzt mal meine verkürzung ausprobiert
aber die funktioniert nicht
weißt du warum?

frage hat sich erledigt:
Code:
root@ubuntu-Server:/etc/init.d# ./tss2
Initializing TSS2:./tss2: line 9: startproc: command not found
root@ubuntu-Server:/etc/init.d#

neue frage: wie kann ichs lösen?
 
Was lösen?
Entschuldig wenn ich das ziemlich direkt sage, aber im letzten Beitrag habe ich echt keinen blassen Schimmer, was Du gemacht hast. Wenn Du das Script verkürzt, musst Du schon das vollständige neue Script zitieren, sonst kann man nicht helfen.

Zudem gilt folgendes:
Mit dem [code ] - Tag wird nur ein Code eingerahmt. Ein Zitat einer Fehlermeldung sollte immer mit dem [quote ] Tag zitiert werden, damit man sieht, was die Fehlermeldung und was das Script ist.

Lies Dir die Links vom Ubuntu - Wiki noch mal genau durch. Es wird dort alles erklärt. Wenn Du konkret ein Problem nicht verstehst (und damit meine ich kein pauschales "ist mir zu kompliziert", das gilt nicht als Problem!), versuch es genauer zu beschreiben.
 
...
Initializing TSS2:./tss2: line 9: startproc: command not found
...

das Kommando 'startproc' wurde nicht gefunden...

P.S. Google hat dieses Fragment gefunden:
[anderer Kontext]
/etc/init.d scripts should now run whether your system uses
start-stop-daemon (Debian, Ubuntu), startproc (Red Hat, SuSe),
or neither.


hth
 
Zuletzt bearbeitet:
also ich hab mich jetzt mal ein bisschen schlau gemacht und folgenden script geschrieben, der den server auch startet:
Code:
#!/bin/bash

cd /home/ms/tss2_rc2/

case "$1" in
    start)
        su ms -c "./teamspeak2-server_startscript start"
        ;;
    stop)
        su ms -c "./teamspeak2-server_startscript stop"
        ;;
esac

exit 0

ich hab aber iwie nicht kapier wie ich die verknüpfungen so anlegen, dass die einen starten und die anderen stoppen

---

es hat funktioniert, aber ich weiß nicht warum
(kommt davon wenn man einfach den code kopiert der auf ner homepage steht ^^)
 
Jedes Start/Stop-Skript besitzt zwei Arten von Links. Eine beginnt mit "S" und die andere mit "K". Beim Betreten eines Runlevels werden zunächst die "K"-Links zum Beenden, danach die "S"-Links zum Starten von Diensten ausgeführt. Soll nun etwa ein Dienst nur im Runlevel 2 laufen, so liegt typischerweise in /etc/rc2.d ein "S"-Link, in allen anderen Runlevel-Verzeichnissen dagegen ein "K"-Link.

Also etwa so:
Code:
ln -s /etc/init.d/tss2 /etc/rc2.d/S10tss2
 
ich hab mir jetzt gedacht dass ich gleich mal versuche ob ichs bei meinem css server auch hinbekomme
leider hab ich jetzt noch ein kleines problem:


Code:
#!/bin/bash

cd /home/srcds/srcds/

case "$1" in
    start)
        su srcds -c "./srcds_run  -maxplayers 8 +map cs_assault -tickrate 66 -pidfile css.pid"
        ;;
    stop)
        su srcds -c "kill -TERM `cat css.pid´"
        ;;
esac

exit 0

und der fehler:
root@ubuntu-Server:/etc/init.d# ./css start
./css: line 10: unexpected EOF while looking for matching ``'
./css: line 15: syntax error: unexpected end of file
root@ubuntu-Server:/etc/init.d#
 
Zeile 10 ist die hier:
Code:
su srcds -c "kill -TERM `cat css.pid´"

./css: line 10: unexpected EOF while looking for matching ``'
Ich mus dazu sagen, ich kenne srcds nicht und kenne auch seine Parameter nicht. Aber an sich gibt die Zeile einfach keinen Sinn. Hast Du eine Quelle für dieses Startscript? Bitte Links immer mit angeben...

An sich müsste es etwa so gehen:
Code:
su kill -TERM "cat css.pid"

Wenn denn das mit dem pidfile so hinhaut. Da bin ich aber auch ehrlich gesagt etwas überfragt.


Manchmal sollte man abends echt nicht mehr schreiben...
Du hast also einen Nutzer srcd, unter dessen account der Server läuft? Es könnte sein, dass am Ende der Zeile einfach das falsche "Anführungszeichen" ist. Versuch mal "kill -TERM `cat css.pid`": Diese Zeichen "`" heißen "Kommandosubsttiution, also es wird das Ergebnis der Funktion und nicht die Funktion selber eingetragen.

Alternativ:
Halte Dich an die Tutorials im Ubuntuwiki, dort wird erklärt, wie Du das ganze ohne Initscripte installiert kriegst:
http://wiki.ubuntuusers.de/Dedizierter_Steam-Server

Edit:
oder nimm doch das aus dem Link aus dem ersten Posting:
Code:
#!/bin/sh
PROG="/home/darktr00per/server/hlds_l/hlds_run"
OPTIONS=" -game cstrike -nomaster +sv_lan 1 +map de_dust +maxplayers 12"
return=$rc_done
case $1 in
start)
echo -n "Initializing HLDS:"
startproc $PROG $OPTIONS || return=$rc_failed
echo -e "$return"
;;
stop)
echo -n "Shutting down HLDS:"
killproc -TERM $PROG || return=$rc_failed
echo -e "$return"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0
 
Zuletzt bearbeitet:
jetzt kommt keine fehlermeldung mehr,
aber wenn ich den server stoppen will sagt er dass er die datei css.pid nicht findet

besteht die möglichkeit, dass wenn ich den server über screen starte,
dass ich ihn dann auch irgendwie über screen beende?
(ich hab in der hilfe nichts dergleichen gefunden)

edit:
die befehle startproc und killproc findet er nicht
 
Ich hab ehrlich gesagt nicht verstanden, wie das mit dem pid - File wirklich geht, aber ich glaub, das ist ein Parameter für die Aufrufe "startproc" und "killproc". Die werden in Deinem Script ja gar nicht verwendet.

Im Prinzip müsst folgendes gehen:
Code:
killprog -TERM /home/srcds/srcds/srcds_run

Noch mal die Frage: Wo hast Du das Script her?
Ich würd mal folgendes probieren:

Wenn ich jetzt mal aus allen Scripten zusammenkopiere, scheint mir so was in der Art am solidesten:
Code:
#!/bin/sh
PROG="/home/srcds/srcds/srcds_run"
OPTIONS=" -maxplayers 8 +map cs_assault -tickrate 66"
USER=srcds
return=$rc_done
case $1 in
start)
echo -n "Initializing HLDS:"
startproc -u $USER $PROG $OPTIONS || return=$rc_failed
echo -e "$return"
;;
stop)
echo -n "Shutting down HLDS:"
killproc -TERM $PROG || return=$rc_failed
echo -e "$return"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0

Siehe http://www.digipedia.pl/man/startproc.8.html
 
Zuletzt bearbeitet:
der funktioniert aber nicht:

root@ubuntu-Server:/etc/init.d# ./css2 start
Initializing HLDS:./css2: line 8: startproc: command not found

root@ubuntu-Server:/etc/init.d#


root@ubuntu-Server:/etc/init.d# ./css2 stop
Shutting down HLDS:./css2: line 13: killproc: command not found

root@ubuntu-Server:/etc/init.d#
 
Die Befehle gibt es wohl nur bei Suse :unsure:
Schau Dir doch einfach mal andere Scripte in Deinem System an, ob da andere Befehle stattdessen genutzt werden...

Noch mal die Frage:
WO HAST DU DEN ENTWURF HER???


Etwas rabiat und funktioniert nur, wenn nur ein Steam - Server läuft, da es alle entsorgt:

killall srcds_run
In das andere Script.

Wenn das auch nicht geht, bin ich überfragt.

Wie dem auch sei, Google spuckt dieses initscript aus:
http://www.counter-strike.de/content/server/srcds

Code:
#! /bin/bash
#
# Start the Counter-Strike: Source dedicated server.
#
# AUTHORS :
#
# Julien Escario ( pandemik@azilog.net )
# &
# Cedric Rochat ( crochat@younics.org )
# &
# Cmdr._Firewalker ( cmdr._firewalker@web.de )
#
# ===========================================
#
# What you need:
#
# Linux :)
# awk
# screen
# the srcds_l & cstrike files (obtainable via steam)
#
# How to use:
#
# Edit the CS_USER-Var to the user running your cs-servers
# Edit the DIR-Var to fit your system (just contains the path to the dir that contains srcds_run)
# Edit the PARAMS-Var to fit your needs
# - standard is startup as internet server
# if you use multiple scripts on one system you should change the NAME-var (otherwise
#   all will be stopped if you run the script with "stop", and status will be useless)
#
# When this is done, copy the file to /etc/rc.d/init.d (or whereever your system stores the
# scripts for starting the services) and set the execute permission.
# Now you can link the script to your runlevel-dir, here's an example for runlevel 3:
# ln -s /etc/rc.d/init.d/srcds /etc/rc.d/rc3.d/S90srcds
# ln -s /etc/rc.d/init.d/srcds /etc/rc.d/rc3.d/K50srcds
# or use update-rc.d if you got a system using that tool (like Debian, see manpage)
#
# Or use it manually like:
# ./srcds start
# ./srcds stop
#
# To see the server-console start the script with the parameter "watch".
#
# DOC by jwm (jwm@counter-strike.de)

# !!!!!!!!!!!!!! CHANGE THIS TO THE USER YOU USE FOR YOUR SERVER !!!!!!!!!!!!!!!
CS_USER=cssserveruser

PATH=/bin:/usr/bin:/sbin:/usr/sbin

# # DON'T FORGET TO CHANGE THE PATH TO YOUR NEEDS!
DIR=/srcds

DAEMON=srcds_run

# LAN server:
# PARAMS="-game cstrike -nomaster -insecure +sv_lan 1 +maxplayers 16 +map de_dust"
# Internet server:
PARAMS="-game cstrike +map de_dust +maxplayers 12 -port 27015"

NAME=cssserver
DESC="CS:S dedicated server"

# No edits (should be) necessary beyond this line

if [ ! -x `which awk` ]; then echo "You need awk for this script"; exit 1; fi
if [ ! -x `which screen` ]; then echo "You need screen (the program, moron!) for this script"; exit 1; fi

if [ `whoami` = root ]
then
 usagetype=root
else
 usagetype=nonroot
fi

start() {
   if [ ! -d $DIR ]; then echo " ... No such directory: $DIR!";  exit 1; fi
   if [ ! -x $DIR/$DAEMON ]; then echo "$DIR/$DAEMON does not exist or is not executable!"; exit 1; fi
   if status; then echo " ... $DESC: $NAME is already running!"; exit 1; fi

   case "$usagetype" in
   root)
    su - $CS_USER -c "cd $DIR ; screen -AmdS $NAME ./$DAEMON $PARAMS"
   ;;
   nonroot)
    cd $DIR ; screen -AmdS $NAME ./$DAEMON $PARAMS
   ;;
   esac

}

stop () {
   if ! status; then echo " ... $DESC $NAME could not be found. Probably not running."; exit 1; fi

   case "$usagetype" in
   root)
    tmp=$(su - $CS_USER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
    su - $CS_USER -c "screen -r $tmp -X quit"
   ;;
   nonroot)
    screen -r $(screen -ls | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}') -X quit
   ;;
   esac
}

status () {
   case "$usagetype" in
   root)
    su - $CS_USER -c "screen -ls" | grep [.]$NAME[[:space:]] > /dev/null
   ;;
   nonroot)
    screen -ls | grep [.]$NAME[[:space:]] > /dev/null
   ;;
   esac
}

watch () {
   if ! status; then echo "$DESC $NAME could not be found. Probably not running."; exit 1; fi

   case "$usagetype" in
   root)
    tmp=$(su - $CS_USER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
    su - $CS_USER -c "screen -r $tmp"
   ;;
   nonroot)
    screen -r $(screen -ls | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
   ;;
   esac
}

case "$1" in
 start)
  echo "Starting $DESC: $NAME"
  start
  echo " ... done."
 ;;

 stop)
  echo "Stopping $DESC: $NAME"
  stop
  echo " ... done."
 ;;

 restart)
  echo "Restarting $DESC: $NAME"
  status && stop
  start
  echo " ... done."
 ;;

 status)
  if status
  then echo "$DESC: $NAME is UP"
  else echo "$DESC: $NAME is DOWN"
  fi
 ;;
 watch)
  watch
 ;;

 *)
   echo "Usage: $0 {start|stop|status|restart|watch}\nWhile watching press ctrl-a, ctrl-d to stop watching without stopping the server."
   exit 1
   ;;

esac


exit 0
(Quelle: HL² Deathmatch Linux-Server Setup)

Scheint wesentlich professioneller zu sein als unser Diletantismus hier.
 
Zuletzt bearbeitet:
den entwurf hab ich von der seite zu der ein link im 1. beitrag ist

die komplettlösung sieht gut aus
ich werd sie dann mal testen

EDIT:

funktioniert wunder bar

VIELEN DANK!
 
Zuletzt bearbeitet:
den entwurf hab ich von der seite zu der ein link im 1. beitrag ist

Mit genauem Link bitte! linuxforen ist ziemlich alt und sehr groß, da dürfte man ungefähr drei Dutzend dieser Startscripte allein für CS finden ;)

Mich würde es sehr interessieren, da mal mehr zu lesen. Denn der Fehler mit dem nicht funktionierenden Programmstopp über das pid - File müsste dort ja auch aufgefallen sein. Und eventuell wäre er dort auch anderes gelöst worden. In dem Script, dass Du jetzt verwendest, wird das ganze ja mit dem Programm screen umgangen.
 
Oben