SHOUTCast Start-Stop-Restart-Status Script

Fireball22

Registered User
Hallo,

nach meinem einwöchigen Italien-Urlaub hab ich mir die in einem anderen Thread genannten BASH-Syntaxen durchgelesen und jetzt mein erstet BASH-Script geschrieben.

Nur funktioniert es anscheinend noch nicht ganz, wegen irgendeinem Operator-Fehler, aber ich glaube da habe ich so eine komische If-Syntax noch nicht ganz richtig verstanden, aber ich bekomme das einfach nicht hin, keine Ahnung woran es da genau liegt... :confused:

Und ist das Script so OK oder muss man da noch was dran verbessern?

Hier ist es:

Code:
#!/bin/bash
# Startprogramm für den SHOUTCasting-Server

#################################### KONFIGURATION ########################################
###########################################################################################
## Pfad zur Datei sc_serv des SHOUTCasting-Servers (Dateinamen nicht mehr mit angeben)
patch_shoutcast="/home/shoutcast"
###########################################################################################
## Screens zur Überwachung des Servers verwenden (Aufrufbar mit screen -r sc1) ( 0 = Aus / 1 = Ein)
use_screen="1"
###########################################################################################
## Speziellen Benuzter wählen der den SHOUTCasting-Server starten soll (Erhöht die Sicherheit; User muss angelegt sein) ( 0 = Aus / 1 = Ein)
use_user="1"
username="shoutcast"
###########################################################################################
#################################### KONFIGURATION ENDE ###################################

if [ $use_user="1" ] ;
	then
	su $username
fi	

case "$1" in

start)
if [ $start = "0" ] ;
	then
	if [ $use_screen = "1" ] ; #Falls Screen aktiviert
		then
		screen -S sc1 && "$patch_shoutcast""/sc_serv"
		if [ $? = "0" ] ; #Wenn Kommando fehlerfrei, dann Variable auf gestartet setzen
			then
			echo "done"
			start = "1"
			export start
			
			else
			echo "false"
		fi
		
		else #Falls Screen nicht aktiviert oder nicht eindeutig
		"$patch_shoutcast""/sc_serv"
		if [ $? = "0" ] ; #Wenn Kommando fehlerfrei, dann Variable auf gestartet setzen
			then
			echo "done"
			start = "1"
			export start
			
			else
			echo "false"
		fi
	fi
		
	else
	echo "Server scheint bereits online zu sein!"
fi;;

restart)
if [ $start = "1" ] ;
	then
	if [ $use_screen = "1" ] ;
		then
		screen -r sc1 && killall -9 "$patch_shoutcast""/sc_serv" && "$patch_shoutcast""/sc_serv"
		if [ $? = "0" ] ;
			then
			echo "done"
			start = "0"
			export start
				
			else
			echo "false"
		fi
		
		else
		killall -9 "$patch_shoutcast""/sc_serv" && "$patch_shoutcast""/sc_serv"
		if [ $? = "0" ] ;
			then
			echo "done"
			start = "0"
			export start
				
			else
			echo "false"
		fi
	fi
	
	else
	echo "Der Server scheint nicht online zu sein, bitte erst starten!"
fi;;

status)
if [ $start = "1" ] ;
	then
	echo "Server scheint online zu sein!"
	
	elif [ $start = "0" ] ;
	then
	echo "Server scheint offline zu sein!"
fi;;

stop)
if [ $start = "1" ] ;
	then
	if [ $use_screen = "1" ] ;
		then
		screen -r sc1 && killall -9 "$patch_shoutcast""/sc_serv"
		if [ $? = "0" ] ;
			then
			echo "done"
			
			else
			echo "false"
		fi	
		
		else
		killall -9 "$patch_shoutcast""/sc_serv"
		if [ $? = "0" ] ;
			then
			echo "done"
			
			else
			echo "false"
		fi
	fi
	
	elif [ $start = "0" ] ;
		then
		echo "Server scheint nicht online zu sein, bitte erst starten!"
fi;;

*)
echo "Syntax: \n"
echo "shoutcast (start|stop|status|restart)"
exit 2
;;


esac

Fireball22

EDIT:

Achja, fast hätte ich es vergessen:
Es sind noch einige unmögliche stellen im Script, da ich nicht so richtig weiß wie ich jetzt einen speziellen Code mit einem speziellen User in einem Screen ausführe und diesen dann wieder in den Hintergrund stecke ohne ihn zu schließen!
Wie geht denn das Codemäßig?
 
Last edited by a moderator:
Ich hatte das Ganze mal in PHP geloest. Betonung liegt auf "hatte". Es hat sich als nicht allzu praktikabel erwiesen (war ohne screen).

Mit der bash Syntax kenne ich mich da gar nicht aus.
Wenn sich jemand erbarmt zu helfen, waere ich auch an dem Skript interessiert (sofern eine Verwendung erlaubt ist).
 
Ja das wäre wirklich super wenn mir da jemand kurz sagen könnte wo der kleine Fehler steckt, weil dabei bin ich jetzt wirklich etwas überfragt.

Ja, kein Problem, das Script wollte ich dann auch anderen zum kostenlosen Download auf meiner Homepage anbieten!

Ich werde es dann nur noch etwas komfortabler umbauen dann kannst du es ohne Probleme verwenden :)

Fireball22
 
Aender das mal so ab.

Code:
#!/bin/bash
# Startprogramm für den SHOUTCasting-Server

#################################### KONFIGURATION ########################################
###########################################################################################
## Pfad zur Datei sc_serv des SHOUTCasting-Servers (Dateinamen nicht mehr mit angeben)
patch_shoutcast="/home/shoutcast"
###########################################################################################
## Screens zur Überwachung des Servers verwenden (Aufrufbar mit screen -r sc1) ( 0 = Aus / 1 = Ein)
use_screen="1"
###########################################################################################
## Speziellen Benuzter wählen der den SHOUTCasting-Server starten soll (Erhöht die Sicherheit; User muss angelegt sein) ( 0 = Aus / 1 = Ein)
use_user="1"
username="shoutcast"
###########################################################################################
#################################### KONFIGURATION ENDE ###################################

if [ "${use_user}" == "1" ]; then
        su "${username}"
fi      

case "${1}" in
        start)
                if [ "${start}" == "0" ]; then

                        # Falls Screen aktiviert
                        if [ "${use_screen}" == "1" ]; then
                                screen -S sc1 && "${patch_shoutcast}/sc_serv"

                                # Wenn Kommando fehlerfrei, dann Variable auf gestartet setzen
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="1"
                                else
                                        echo "false"
                                fi

                        # Falls Screen nicht aktiviert oder nicht eindeutig
                        else
                                "${patch_shoutcast}/sc_serv"

                                # Wenn Kommando fehlerfrei, dann Variable auf gestartet setzen
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="1"
                                else
                                        echo "false"
                                fi
                        fi
                else
                        echo "Server scheint bereits online zu sein!"
                fi
        ;;
        restart)
                if [ "${start}" == "1" ]; then
                        if [ "${use_screen}" == "1" ]; then
                                screen -r sc1 && killall -9 "${patch_shoutcast}/sc_serv" && "${patch_shoutcast}/sc_serv"
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="0"
                                else
                                        echo "false"
                                fi
                        else
                                killall -9 "${patch_shoutcast}/sc_serv" && "${patch_shoutcast}/sc_serv"
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="0"
                                else
                                        echo "false"
                                fi
                        fi
                else
                        echo "Der Server scheint nicht online zu sein, bitte erst starten!"
                fi
        ;;
        status)
                if [ "${start}" == "1" ]; then
                        echo "Server scheint online zu sein!"
                elif [ $start = "0" ]; then
                        echo "Server scheint offline zu sein!"
                fi
        ;;
        stop)
                if [ "${start}" == "1" ]; then
                        if [ "${use_screen}" == "1" ]; then
                                screen -r sc1 && killall -9 "$patch_shoutcast""/sc_serv"
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                else
                                        echo "false"
                                fi
                        else
                                killall -9 "${patch_shoutcast}/sc_serv"
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                else
                                        echo "false"
                                fi
                        fi
        
                elif [ "${start}" == "0" ]; then
                        echo "Server scheint nicht online zu sein, bitte erst starten!"
                fi
        ;;
        *)
                echo "Syntax: \n"
                echo "shoutcast (start|stop|status|restart)"
                exit 2
        ;;
esac
 
Last edited by a moderator:
Vielen Dank für deine Hilfe!

Leider bekomme ich beim ausführen nun folgende Meldung:

Code:
./shoutcast_startscript_own: line 20: syntax error near unexpected token `fi'
./shoutcast_startscript_own: line 20: `fi      '

Ich habe schon nachgecheckt wo der Fehler liegen könnte, aber konnte leider nicht's ausfindig machen...

Fireball22
 
Vielen Dank, nun funktioniert soweit alles!

Bis darauf, dass er halt immer manuel die Shell für den User "shoutcast" öffent, dass sollte eigentlich immer nur im Hintergrund passieren.
Und das Problem ist ja auch noch der Logikfehler mit dem stoppen, er sollte nämlich erst wieder in den Screen reingehen, dann die Tastenkombination als Befehl ausführen <STRG> + <C> und dann mit exit den Screen schließen.

So soll er es auch beim Starten machen, er soll hier nämlich den Screen befehlsseitig "minimieren".

Wie kann man das machen?

Fireball22
 
Hallo Fireball22,

ich hoffe dir ist bewusst, dass du gegen die Boardregeln verstoßen hast, da du den Thread gepusht hast...
Das ist hier unerwünscht!

Zu deiner Frage:

mit
Code:
screen -dmS <NAME> <CMD>
kannst du den Screen ausführen und automatisch minimieren!

Lg
Free
 
Vielen Dank für deine Hilfe!
Sry, das war keine Absicht...

Vielen Dank, das funktioniert perfekt, aber wie kann ich denn noch per Befehl den Screen inkl. im Moment laufenden Prozess schließen?

Fireball22
 
Hi,

wenn der SCREEN gekillt wird, dann ist auch der Prozess beendet.

Wenn du es so machst wie ich dir gesagt habe, dann hat der SCREEN ja einen Namen.
Über dien kannst du killen.

Entweder
Code:
killall <NAME>

Oder du grepst ihn und kilslt das ergebnis.

Lg
Free
 
Vielen Dank für deine Antwort, ich habe das ganze jetzt mal so geschrieben, ich hoffe das stimmt alles so wie ich das jetzt auch mit "su -d ..." un den Screens geregelt habe.

Code:
#!/bin/bash
# Startprogramm für den SHOUTCasting-Server
# Copyright by Michael Kaps; www.michis-homepage.net

#################################### KONFIGURATION ########################################
###########################################################################################
## Pfad zur Datei sc_serv des SHOUTCasting-Servers (Dateinamen nicht mehr mit angeben)
patch_shoutcast="/home/shoutcast"
###########################################################################################
## Screens zur Überwachung des Servers verwenden (Aufrufbar mit screen -r sc1) ( 0 = Aus / 1 = Ein)
use_screen="1"
###########################################################################################
## Speziellen Benuzter wählen der den SHOUTCasting-Server starten soll (Erhöht die Sicherheit; User muss angelegt sein) ( 0 = Aus / 1 = Ein)
use_user="1"
username="shoutcast"
###########################################################################################
#################################### KONFIGURATION ENDE ###################################    

case "${1}" in
        start)
                if [ "${start}" != "1" ]; then

                        # Falls Screen aktiviert
                        if [ "${use_screen}" == "1" ]; then
                        	if [ "${use_user}" == "1" ]; then
                                	su -d '"${patch_shoutcast}/sc_serv"' "${username}"
                                else
                                	screen -dmS sc1 "${patch_shoutcast}/sc_serv"
                                fi

                                # Wenn Kommando fehlerfrei, dann Variable auf gestartet setzen
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="1"
                                else
                                        echo "false"
                                fi

                        # Falls Screen nicht aktiviert oder nicht eindeutig
                        else
                        	if [ "${use_user}" == "1" ]; then
                                	su -d '"${patch_shoutcast}/sc_serv"' "${username}"
                                else
                                	"${patch_shoutcast}/sc_serv"
                                fi

                                # Wenn Kommando fehlerfrei, dann Variable auf gestartet setzen
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="1"
                                else
                                        echo "false"
                                fi
                        fi
                else
                        echo "Server scheint bereits online zu sein!"
                fi
        ;;
        restart)
                if [ "${start}" == "1" ]; then
                        if [ "${use_screen}" == "1" ]; then
                        	if [ "${use_user}" == "1" ]; then
                        		su -d "killall -9 sc1" "${username}"
                        		su -d 'screen -dmS sc1 "${patch_shoutcast}/sc_serv"' "${username}"
                        	else
                        		killall -9 sc1
                        		screen -dmS sc1 "${patch_shoutcast}/sc_serv"
                        	fi
                        	
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="0"
                                else
                                        echo "false"
                                fi
                        else
                                if [ "${use_user}" == "1" ]; then
                               		su -d 'killall -9 "${patch_shoutcast}/sc_serv" && "${patch_shoutcast}/sc_serv"' "${username}"'
                               	else
                               		killall -9 "${patch_shoutcast}/sc_serv" && "${patch_shoutcast}/sc_serv"' "${username}"
                               	fi
                               	
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                        export start="0"
                                else
                                        echo "false"
                                fi
                        fi
                else
                        echo "Der Server scheint nicht online zu sein, bitte erst starten!"
                fi
        ;;
        status)
                if [ "${start}" == "1" ]; then
                        echo "Server scheint online zu sein!"
                elif [ ${start} == "0" ]; then
                        echo "Server scheint offline zu sein!"
                fi
        ;;
        stop)
                if [ "${start}" == "1" ]; then
                        if [ "${use_screen}" == "1" ]; then
                        	if [ "${use_user}" == "1" ]; then
                                	su -d "killall -9 sc1" "${username}"
                                else
                                	killall -9 sc1
                                fi
                                
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                else
                                        echo "false"
                                fi
                        else
                                if [ "${use_user}" == "1" ]; then
                                	su -d 'killall -9 "${patch_shoutcast}/sc_serv"'
                                else
                                	killall -9 "${patch_shoutcast}/sc_serv"
                                fi
                                
                                if [ "${?}" == "0" ]; then
                                        echo "done"
                                else
                                        echo "false"
                                fi
                        fi
        
                elif [ "${start}" == "0" ]; then
                        echo "Server scheint nicht online zu sein, bitte erst starten!"
                fi
        ;;
        *)
                echo "Syntax:"
                echo "shoutcast (start|stop|status|restart)"
                exit 2
        ;;
esac

Das einzige was leider nocht nicht funktioniert ist dass ich immer in Zeile 89 einen Operator-Error bekomme, wo steckt denn der?

Fireball22
 
Zorry, natürlich nicht, für meine Freunde und helfer mach ich doch alles :D

Bittschön:

Code:
 status)
                if [ "${start}" == "1" ]; then
                        echo "Server scheint online zu sein!"
                elif [ ${start} == "0" ]; then // <-- Da steckt der Fehler!
                        echo "Server scheint offline zu sein!"
                fi
        ;;


Fireball22
 
Hallo,

wen ich mir so deine "if" und deine "elif" Zeilen ansehe, dann fällt mir da eine kleiner Unterschied auf.

Die fehlen die "" bei [ ${start} == "0" ]

Ansonsten kann ich leider nur mit Vermutungen prahlen :o

Ich kenne nur
if blubber=1 then bla=1
else bla=2

Also "if" und "else", aber davon habe ich auch nicht so viel Ahnung.
 
Vielen Dank, genau das war der Fehler!

Genau, neben if und else gibt es auch noch elif nach der if-Anweisung.
Elif kehrt die in If angegebe Bedinung um und gibt zusätzlich noch eine Bedingung mit an die erfüllt werden muss.

Fireball22
 
hallo zusammen,

muss jetzt leider das script hier wieder aufleben lassen^^!

würde gern nochmal das fertig script sehn *g* :) und wo ich das eintragen muss!

MFG

Martin
 
Hey ;)

Also das "fertige" Script kannst du dir mal hier anschauen:

Michi's Homepage - Scripting

Allerdings muss ich dazu sagen, dass es leider noch nicht richtig Funktioniert.
Es sind evtl. noch Syntax-Fehler enthalten.
Die Funktionsweise ist allerdings voll funktionsfähig.

Deshalb ist der Download auch nur als BETA zugänglich.

Wäre super, wenn du mir vllt. sagen könntest wo die Syntax-Fehler liegen, dann kann ich dieses endlich als Final anbieten =)

Lg
Michael
 
Back
Top