ShoutCast Server Init-Script

Fireball22

Registered User
Hallo,

ich habe jetzt für meinen ShoutCast-Server ein Start/Stop/Restart Script runtergezogen und ein bisschen geändert, es sieht nun wie folgt aus:

Code:
#!/bin/bash
# Startup script for the SHOUTcasting Server
#
# chkconfig: - 85 15

# Source networking configuration.
#. /etc/sysconfig/network

# Check that networking is up. This line may cause an error on incompatible
# distributions. Remove it if necessary. Also remove if the startup always
# fails for no apparent reason.
[[ ${NETWORKING} = "no" ]] && exit 0


stop() {
  echo "Killing old shoutcast servers."
  for oldpid in `ps -A | grep sc_serv | cut -c 0-6`; do
         kill -9 $oldpid
  done
  rm -f /home/shoutcast/shoutcast.pid
}


start() {
  servcount=`expr 0`
  for cfile in `ls /home/shoutcast/`; do
         echo -n $cfile
         echo -n " -> "
         grep ^RelayServer /etc/shoutcast/$cfile
         # This is the line where we actually run the shoutcast program!
         #sudo -u nobody /home/shoutcast/sc_serv /home/shoutcast/$cfile > /dev/null &
         /home/shoutcast/sc_serv /home/shoutcast/$cfile > /dev/null &
         let servcount=servcount+1
  done
  #Create the pid file...
  ps -A | grep sc_serv | cut -c 0-6 > /home/shoutcast/shoutcast.pid
  #Done now!
  echo "Started $servcount servers."
}
case "$1" in
  start)
  if [[ ! -e /home/shoutcast/shoutcast.pid ]]
  then
       start $2

       if [[ -e /home/shoutcast/shoutcast.pid ]]
       then
               echo "Startup                                           [SUCCESS]"
       fi

  else
       echo "Startup                                           [FAILED]"
  fi
       ;;
  restart)
       stop $2
       sleep 4
       start $2
       if [[ -e /home/shoutcast/shoutcast.pid ]]
       then
               echo "Startup                                           [SUCCESS]"
       fi
       ;;
  stop)
  if [[ -e /home/shoutcast/shoutcast.pid ]]
  then
       stop $2
       echo "Shoutcast shutdown                                        [SUCCESS]"
  else
       echo "There are no registered shoutcast servers running right now. Attempting to kill anyways."
       stop $2
  fi
       ;;
  *)
       echo "Usage: shoutcast (start|stop|restart)"
       ;;
esac

Damit möchte ich jetzt erreichen, dass der Server immer automatisch beim Systemstart startet.

Ich habe mir dann gedacht, dass ich dieses Script in den Ordner /etc/init.d stecke und dann eine Verknüfung in dem Ordner rc3.d anlegen.
Und das einmal mit dem Namen S26shoutcast und K26shoutcast und diese werden dann auf das Script verlinkt?

Passt der Verlauf so oder muss ich da noch mehrere Einstellungen vornehmen, ich habe nämlich noch von was unter Gentoo gelesen, aber ich arbeite ja unter Suse.

Fireball22
 
Ja, im Allgemeinen hast Du damit den Mechanismus bei Linux erfasst.
Dazu siehe auch (zum Nachschlagen und wegen der Einleitung)
SysV Init - VDR Wiki
Man beachte die Einleitung, ich kenne nun nur eine Hand voll Distributionen und dabei nicht mal die aktuellen Versionen ;> . Gentoo gehoert nicht dazu.

Bei Dir ist noch die Frage, ob Plesk da mit rein pfuscht, wenn denn nicht kannst Du so natuerlich auch Deinen named dauerhaft "nicht starten".
Ausserdem sind die manpages von chkconfig vielleicht interessant
man chkconfig

Ciao,
Mercy.
 
Vielen Dank für deine Antwort, die Links habe ich alle sauber angelegt und das Script in die /etc/init.d geschoben.

Danach habe ich noch "chkconfig -a shoutcast" ausgeführt und fertig!

Jetzt bin ich mal gespannt ob alles beim neustart funktioniert!

Wo ist eigentlich der Unterschied bei den Ordnern /etc/init.d und /etc/rd.d?

Fireball22
 
Also Plesk sollte Dir keinerlei Probleme beim StartUp bereiten. Bei mir hat Plesk zumindest noch nie im Runlevel rumgepfuscht (das wäre ja auch noch schöner ;)).

Zu dem named "Problem" - die einfachste Variante wäre wohl, es mit yast aus den Runleveln zu entfernen. Inwiefern Plesk dann allerdings anfängt zu meckern, kann ich nicht genau sagen. Versuch macht Klug! (... und bitte von den Erfahrungen berichten *g*)
 
Ja das schlimme ist ja, dass "named" ja nicht mal irgendwo in den Runlevels drin steckt ;)

Also ich denke wirklich dass das Plesk gleich mitstartet und man so auf keinen grünen Zweig kommt.

Ich habe jetzt aufjedenfall mal BIND in Yast deinstalliert und so lasse ich das ganze jetzt laufen, es funktioniert alles noch, auch Plesk.
Wenn ich es brauchen sollte bin ich mit 3 Tastendrucks wieder am Start :)

Fireball22
 
Hallo,
Code:
#!/bin/bash
# Startup script for the SHOUTcasting Server
#
# chkconfig: - 85 15
...

Und das einmal mit dem Namen S26shoutcast und K26shoutcast und diese werden dann auf das Script verlinkt?
Das Script oben enthält in der Zeile mit chkconfig die Information, dass es (dem Urheber des Scripts nach) S85shoutcast und K15shoutcast sein sollten.
Die Zahlenwerte geben dabei die Reihenfolge an.
In diesem Fall wird relativ spät gestartet und früh beendet (was Sinn macht, da Beenden logischerweise in umgekehrter Reihenfolge laufen sollte.)

Wenn dir der Befehl chkconfig zur Verfügung steht (weiß nicht, wie das bei nicht-Fedora-Systemen ist) kannst du auch so die Symlinks (Beispiel für RLs 3, 4 und 5) setzen lassen:
Code:
chkconfig --level 345 shoutcast on
 
Ist das oben nicht auskommentiert?

Und eigentlich heißt das oben "... for Apache Webserver"...
Ich habe das nur bissel umbenannt :D

Vielen Dank auch nochmals für deinen genauen Befehl!

Das ganze hat auch schon vorcher perfekt funktioniert, nur hatte ich da das Problem, dass der Server da mit dem Paramter "start" gestartet wird.
Und ich weiß selber nicht warum, aber da braucht der Shoutcasting Server gleich 5x soviel Recousen.

Ich habe dann einfach mal ne Datei erstellt mit den direkten Prozessen, das ging zwar aber dann ging danach gar nix mehr und im moment ist deshalb mein Server offline, Strato muss das jetzt beheben, es hilft nur noch ein Server-Reset im Rechenzentrum.

Muss eigentlich jeder Prozess in der init.d auch wieder gekillt werden oder macht das nicht auch das OS automatisch?

Fireball22
 
Und eigentlich heißt das oben "... for Apache Webserver"...
Ich habe das nur bissel umbenannt :D

Du erlaubst ... rofl ;>
Ich hab' mir das script da jetzt auch mal mehr als nur angesehen ;>=>.
Na das Lehrgeld hast Du ja jetzt bezahlt.

Um es zu verdeutlichen ... Wenn ich nur das hier nehme
Code:
#!/bin/bash
  for cfile in `ls /home/hl2/srcds_l/`; do
         echo -n " -> "
         echo  $cfile 
         let servcount=servcount+1
  done
dann kommt das raus
Code:
 -> bin
 -> cstrike
 -> debug.log
 -> hl2
 -> hldsupdatetool.bin
 -> InstallRecord.blob
 -> log.txt
 -> run_css
 -> run_css~
 -> run_css2
 -> run_css2~
 -> srcds_amd
 -> srcds_i486
 -> srcds_i686
 -> srcds_run
 -> srcds_run~
 -> steam
 -> test1.so
 -> test2.so
 -> test3.so
 -> text.txt
 -> update
Und Du wuerdest fuer jede dieser Zeilen einmal
/home/shoutcast/sc_serv /home/shoutcast/$cfile > /dev/null &
ausfuehren.
Je nach Anzahl der Dateien in Deinem "/home/shoutcast/"(das sind nicht zufaellig ungefaehr 5 Stueck?) hast Du den Server also genau so oft gestartet und wenn Du Pech hast, laufen dann auch genau so viele Instanzen.

nur hatte ich da das Problem, dass der Server da mit dem Paramter "start" gestartet wird.
Und ich weiß selber nicht warum, aber da braucht der Shoutcasting Server gleich 5x soviel Recousen.
Das duerfte damit hoechst wahrscheinlich geklaert sein. <schmunzel>

Wenn Du nur einen Server starten musst nimm lieber das Startscript von TS2 als Vorlage, loesch die Funktion / den Case fuer "passwords)" und pack Dein Shoutcast-binary dahin wo das server_linux-binary steht und benenn die PID-files um. Danach nochmal durchlesen, ob's auch richtig ist und zuerst manuell testen.

Muss eigentlich jeder Prozess in der init.d auch wieder gekillt werden oder macht das nicht auch das OS automatisch?
Stell es Dir so vor: Das geschieht automatisch:
Das OS klappert fuer einen runlevel das dazu gehoerige rc<X>.d Verzeichnis ab also z.B. rc3.d fuer runlevel 3 also Multiuser+Netzwerk-Betrieb und fuehrt die dortigen Verknuepfungen aus; Beim Wechsel in den runlevel die S<xy>-Scripts mit dem Parameter Start, beim Beenden die K<xy>-Scripts mit dem Parameter Stop wobei die Scripts alphabetisch sortiert werden daher gibt die Numerierung die Reihenfolge an.
Wenn Dein System hochfaehrt geht es in den runlevel 3 (oder 5 mit XServer) wenn es beendet wird in runlevel 0, wenn es neugestartet wird in runlevel 6.
Durch die Verknuepfungen werden dann die Dienste automatisch beim Starten des Systems gestartet und beim "Beenden" des System auch wieder beendet.

In init.d sollten die scripts in Originalform liegen, dort kannst Du sie auch manuell mit den Parametern aufrufen um einen Dienst manuell zu beenden, neuzustarten und zu starten (einige unterstuetzen noch mehr Funktionen).

Chkconfig nun ist bereits ein kleines Administrationswerkzeug, das Dir die Verwaltung der Dienste erleichtern soll; Wenn Du jetzt aber manuell Links in den rc*.d Verzeichnissen angelegt hast UND den Dienst mit chkconfig quasi angelegt hast, dann wirst Du immer mehrmals das Startscript ausfuehren und das wird wohl jedesmal 5 x den Dienst starten ;> .
Wenn Du damit nach einem Serverneustart noch Stress hast starte den Server im rescue System, mounte Dein root-Dateisytem und loesche die Verknuepfungen auf das Shoutcast startscript in den rc*.d Verzeichnissen.
Und dann das Ganze nochmal von vorn, mit anderem Startscript und nur entweder mit chkconfig oder manuell.

Was den Unterschied zwischen rc.d und init.d angeht nochmal das hier vorweg
Achtung: Jedes Linux System hat Besonderheiten bei den Bootvorgängen! Nicht jedes System verwendet SysV Scripte und selbst Systeme damit unterscheiden sich u.U. sehr stark!
Bei elias5000 und mir sieht das so aus, dass in /etc/rc.d alles liegt, was fuer die Steuerung dieser Mechanismen noetig ist, mitunter auch init.d und die rc*.d Verzeichnisse; In /etc haben wir dann nur Verknuepfungen auf init.d und die rc*.d Verzeichnisse. Was in init.d und den rc*.d liegt hatte ich ja schon vorweg genommen.

Ciao,
Mercy.
 
Vielen Dank für deine Antwort!

Das erklärt also die ganzen Probleme mit dem total hohen Recousen-Auslastungen!

Gottseidank hab ich das Script nicht selber programmiert, das gab es in so nem I-Net Forum bei ner suche in Google... :D

Das System läuft inzwischen wieder, ich habe das Rettungssystem gestartet und die Verknüpfungen inkl. dem Script gelöscht.

Ich werde das ganze jetzt mal mit dem TS2 Startscript probieren, mal schauen ob dann noch was läuft... :D

Fireball22
 
Ich bin jetzt gerade dabei das TS2 Startscript zu modifizieren, aber dabei fällt mir auf, dass mein Shoutcast-Server nie eine PID-File anlegt, woran könnte denn das liegen?

Fireball22
 
Wir kommen zwar immer weiter vom eigentlichen Topic ab, und mit vServern hat das auch nichts Spezielles zu tun, aber das koennen wir glaube ich auch zuegig zuende bringen.
Ich habe mir mal das Shoutcast-Server Paket angesehen, die Dokumentation auf der homepage ist ja reichlich unuebersichtlich, es reicht aber fuer den Anfang.
Hier mal ein startscript, das ich fuer einen LAN-CS:S Server irgendwann mal eben schnell dahin geschmiert habe:
Code:
#!/bin/bash
# description: SRCDS
# chkconfig: 345 99 00
start ()
{
 /mnt/disk/hdc1/hl2/srcds_l/run_css >/dev/null 2>&1 &
 touch /var/lock/subsys/SRCDS
}

stop ()
{
 killall srcds_amd
 rm -f /var/lock/subsys/SRCDS
}

case "$1" in
'start')
  if [[ -e /var/lock/subsys/SRCDS ]]
    then
      stop
    fi
  start
 ;;
'stop')
  stop
 ;;
*)
 echo "Usage: $0 { start | stop }"
 ;;
esac
Da es auch fuer den SC Server hinreichend sein sollte nur einen Server zu starten ist das vergleichbar, die PID-files ersetzt hier ein lock-file (das mit seiner Existenz einfach nur signalisiert, dass bereits ein Server laufen sollte).
/mnt/disk/hdc1/hl2/srcds_l/
Ist das Verzeichnis, in dem die auszufuehrende Datei liegt.
Ist die ausfuehrbare Datei (in diesem Fall ein Script, kann aber natuerlich auch das sc_serv binary sein).
Wenn noch Parameter uebergeben werden sollen/muessen kommen die wie gewohnt dahinter (beim SC-Server ist das zu verwendende Konfigfile zu uebergeben also z.B. /home/shoutcast/gute.conf).
/var/lock/subsys/SRCDS
Das ist mein lockfile, das kann auch "/home/shoutcast/ein_server_laeuft" heissen.
killall srcds_amd
Hierzu (das Zwangsbeenden des Servers) "man killall" anschaun.
Das Argument schreibt man sich von der Ausgabe eines "ps ax" ab in diesem Fall sieht das so aus:
3101 pts/2 Sl 0:10 ./srcds_amd -console -norestart -game cstrike -port 2 ...

Das script ist recht minimalistisch, das kannst Du dann mit der Zeit aufbohren.
Z.B. implementiert start() bereits ein restart(), es gibt keine Fehlermeldungen / Warnungen, es werden keien returncodes ausgewertet (das ist schlampig weil dann das lockfile evtl. faelschlicher Weise erstellt wird schadet diesem Ablauf aber ja nicht), etc.p.p. .
Aber fuer's Erste ist das denke ich gut ueberschaubar und Zweckmaessig.
Was fuer Dich bei dem environment interessant wird ist, das Ding nicht im Kontext von root laufen zu lassen.

Ciao,
Mercy.

P.S.: Laut Dokumentation sollte sich uebrigens Dein sc_serv auch beschweren und umgehend beenden, wenn er mehrfach mit derselben Konfiguration gestartet wird.
P.P.S.: Wenn die Anwendung keine PID-Files anlegt machts erstmal nichts, solange Du nicht mehrere Instanzen parallel betreibst, die Du dann gezielt einzeln killen willst brauchst Du sie auch nicht.
 
Last edited by a moderator:
Ich habe Mercys Wink mit dem Zaunpfahl verstanden und das Thema mal hier hin verschoben und den Titel angepasst - Stichwort "Boardsuche" ;)
 
Vielen Dank für das Script, das werde ich gleich nach meinem Italien-Urlaub ausprobieren!

Ich bin im Moment gerade dabei zu lernen wie man BASH-Scripte programmiert und habe da bei google einige Seiten gefunden, aber irgendwie sind das nicht die richtigen für mich, ich möchte ja nur Dienste Starten, beenden und halt alles mögliche Systemseitig machen und unter anderem auch die Grundkenntnisse können.

Kennt ihr da vielleicht eine gute Seite wo man dieses BASH so lernen kann?

Fireball22
 
Linux.Fibel.org Version 0.6.0
Dort die Kapitel 4, 5, 7, 12, 13.1, 13.2, 15, 20.1.4, 21 fuer's Erste. ;)
Die Dokumentation ist so gut aufgebaut, dass man sie auch nach Bedarf als Nachschlagewerk benutzen kann und fuer Fragen zu Einzelheiten und Unklarheiten die dort nicht geklaert werden haelt sicher auch das hiesige Linux-Forum geduldig her.

Ciao,
Mercy.
 
So, jetzt hab ich mir endlich mal die ganzen Seiten durchgelesen und dabei ist jetzt folgendes entstanden:

Fireball22
 
Back
Top