Mein erstes fast erfolgreiches Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Mululu
Beiträge: 35
Registriert: 08.10.2013 18:17:41

Mein erstes fast erfolgreiches Script

Beitrag von Mululu » 11.11.2013 22:44:28

Hallo,

ich habe eben mein erstes erfolgreiches Script fertiggestellt auch wenn vll. immer wieder Optionen ergänzt werden. Für euch ist solch ein Script vll. in 5 Minuten gemacht daher seid nicht so streng :D

Code: Alles auswählen

#! /bin/bash

#Survival-Server Start|Stop|Backup|Status|Restart Script

#Variablen

server_id=survival
screen_session_running=`screen -ls | grep survival`
game_dir=/home/USER/mc_$server_id
backup_dir=/home/USER/mc_backup/mc_$server_id

case "$1" in
#Start-----------------------------------------------------------------------------------------------------------------------------------------------------
        start)
                if [ "$screen_session_running" != "" ]
                then
                clear
                echo ***Hinweis***
                echo
                echo -e  "\033[31mDer Server läuft bereits!\033[0m"
                echo
                echo ***Hinweis***
                else
                cd /home/USER/mc_$server_id
                  ./start.sh
                if [ "screen_session_running" == "" ]
                then
                echo ***Hinweis***
                echo
                echo -e   "\033[31mDer Server konnte nicht gestartet werden bitte wenden Sie sich an den Systemadministrator!\033[0m"
                echo
                echo ***Hinweis***
                else
                clear
                echo ***Hinweis***
                echo
                echo -e   "\033[32mDer Server wurde erfolgreich gestartet. Mit \033[0m\033[4mscreen -r survival\033[0m\033[32m können Sie in die Serverkonsole wechseln!\033[0m"
                echo
                echo ***Hinweis***
                fi
                fi
                ;;
#Stop------------------------------------------------------------------------------------------------------------------------------------------------------
        stop)
                screen -r $server_id -X stuff $'say Der Server wird in 30 Sekunden heruntergefahren.\n'
                sleep 25
                screen -r $server_id -X stuff $'save-all\n'
                sleep 5
                screen -r $server_id -X stuff $'stop\n'
                ;;
#Restart---------------------------------------------------------------------------------------------------------------------------------------------------
        restart)
                screen -r $server_id -X stuff $'say Der Server wird in 30 Sekunden neugestartet.\n'
                sleep 25
                screen -r $server_id -X stuff $'save-all\n'
                sleep 5
                screen -r $server_id -X stuff $'stop\n'
                sleep 10
                $0 start
                ;;
#Backup----------------------------------------------------------------------------------------------------------------------------------------------------
	backup)
  		if [ "$screen_session_running" != "" ]
 		then
		clear
		echo -e "\033[32mStarte Backup für $server_id""!\033[0m"
		screen -r $server_id -X stuff $'say Es wird ein Backup erstellt dabei können Laggs auftreten!\n'
                screen -r $server_id -X stuff $'save-all\n'
                screen -r $server_id -X stuff $'save-off\n'
                screen -r $server_id -X stuff $'say Backup gestartet!\n'
                rm -R $backup_dir
                mkdir $backup_dir
		cd $backup_dir
                tar -cf $server_id.tar $game_dir
                screen -r $server_id -X stuff $'save-on\n'
		screen -r $server_id -X stuff $'save-all\n'
               	screen -r $server_id -X stuff $'say Backup wurde erfolgreich erstellt!\n'
		echo -e "\033[32mBackup wurde erfolgreich erstellt!\033[0m" 
                else
                clear
	  	echo -e "\033[32mStarte Backup für $server_id""!\033[0m"
		sleep 5
		rm -R $backup_dir
                mkdir $backup_dir
                cd $backup_dir
                tar -cf $server_id.tar $game_dir
                echo -e "\033[32mBackup wurde erfolgreich erstellt!\033[0m"
                fi
	 	;;
#Status----------------------------------------------------------------------------------------------------------------------------------------------------
        status)
                if [ "screen_session_running" == "" ]
                then
                clear
                echo ***Hinweis***
                echo
                echo -e   "\033[31mDer Server läuft nicht!\033[0m"
                echo
                echo ***Hinweis***
                else
                clear
                echo ***Hinweis***
                echo
                echo -e   "\033[32mDer Server läuft!\033[0m"
                echo
                echo ***Hinweis***
                fi
                ;;
#Ausgabe bei falscher Eingabe------------------------------------------------------------------------------------------------------------------------------
        *)
                echo "Usage: $0 {start|stop|restart|backup|status}"
                ;;
esac

Was sagt ihr dazu wo könnt ihr mir Tipps geben bzw. auf was sollte ich besser achten.



Mit freundlichen Grüßen

Mululu

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: Mein erstes fast erfolgreiches Script

Beitrag von Natureshadow » 12.11.2013 02:17:58

Moin,

Code: Alles auswählen

apt-get install minetest
Minecraft ist unfrei und überholt.

Aber zum Skript ansich:
  • Das She-Bang wird so nicht funktionieren. Space nach dem #! weg.
  • Keine Backticks verwenden. Die korrekte Syntax ist $().
  • * immer maskieren, wenn du keinen Glob haben willst (echo "*** foo ***" oder echo \*\*\* foo \*\*\*), sonst expandiert das Dateinamen ...
  • Auf leere Strings testet man mit -z, nicht mit != ""
-nik

Benutzeravatar
Meillo
Moderator
Beiträge: 9238
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Mein erstes fast erfolgreiches Script

Beitrag von Meillo » 12.11.2013 09:22:34

Natureshadow hat geschrieben:
  • Das She-Bang wird so nicht funktionieren. Space nach dem #! weg.
Nicht noetig. Es funktioniert mit und ohne Space. Uebrigens verwendet Bill Joy in seinem Hinweis auf den Shebang-Mechanismus bei BSD, 1981, auch einen Space: http://article.olduse.net/120%40Aucbarpa.UUCP
  • Keine Backticks verwenden. Die korrekte Syntax ist $().
Wenn du das Wort ``korrekt'' verwendest, dann implizierst du, dass die Backticks falsch waeren. Sie sind allerdings genauso korrekt. Man kann nur ueber die Vor- und Nachteile von beidem diskutieren. Ueblicherweise wird heutzutage (v.a. Anfaengern) die Verwendung von $() empfohlen.
Use ed once in a while!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Mein erstes fast erfolgreiches Script

Beitrag von rendegast » 12.11.2013 09:40:43

if [ "$screen_session_running" != "" ]
Auf leere Strings testet man mit -z, nicht mit != ""
Als walkaround nehme ich sowas

Code: Alles auswählen

[ "x$screen_session_running" != "x" ]
findet sich auch in einigen init-Skripten, hdparm, libvirt-guests, rsync.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Meillo
Moderator
Beiträge: 9238
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Mein erstes fast erfolgreiches Script

Beitrag von Meillo » 12.11.2013 10:18:38

rendegast hat geschrieben:
Auf leere Strings testet man mit -z, nicht mit != ""
Als walkaround nehme ich sowas

Code: Alles auswählen

[ "x$screen_session_running" != "x" ]
findet sich auch in einigen init-Skripten, hdparm, libvirt-guests, rsync.
Hier findet ihr Erklaerungen woher der Vergleich mit dem `x' kommt und fuer welche Faelle er sinnvoll sein kann: http://stackoverflow.com/questions/6852 ... ing-with-x
Use ed once in a while!

Mululu
Beiträge: 35
Registriert: 08.10.2013 18:17:41

Re: Mein erstes fast erfolgreiches Script

Beitrag von Mululu » 13.11.2013 09:52:58

So danke für die vielen Tipps aber das mit dem "-z" verstehe ich nicht. Es wird ja beim Start mittels

Code: Alles auswählen

screen -ls | grep $server_id


geprüft ob der screen schon läuft und falls ja gibt es die Zeile mit der ID etc. aus. Deshalb habe ich ja das "!=" genommen oder meint ich eine andere Stelle im Script.

Desweiteren hab ich mein Script jetzt noch erweitert Komplettes Script siehe Postende). Soweit funktioniert alles wenn auch nicht alles perfekt z.b.: wenn ich das Script mit

Code: Alles auswählen

ScriptName Start all
ausführe versucht er den nicht vorhandenen Server "all" mit zu starten. Ist ja auch logisch da "$2" als "$server_id" genutzt wird.

Wisst ihr vll. ne Möglichkeit das besser zugestallten?

Hier ein Beispiel am Backup:

Code: Alles auswählen

HOST:~$ bash -x mc backup all
+ server_id=all
++ screen -ls
++ grep all
+ screen_session_running=
+ game_dir=./mc_all
+ backup_dir=/home/USER/mc_backup/mc_all
+ backup_file=/home/USER/all.tar
+ server_home_dir=/home/USER
+ case "$1" in
+ '[' '' '!=' '' ']'
+ clear
+ echo '***Hinweis***'
***Hinweis***
+ echo -e '\033[32mStarte Backup fürr all!\033[0m'
Starte Backup fürr all!
+ rm -R /home/USER/mc_backup/mc_all
rm: Entfernen von „/home/USER/mc_backup/mc_all“ nicht möglich: Datei oder Verzeichnis nicht gefunden
+ mkdir /home/USER/mc_backup/mc_all
+ cd /home/USER
+ tar -cf all.tar ./mc_all
tar: ./mc_all: Kann stat nicht ausführen: Datei oder Verzeichnis nicht gefunden
tar: Beende mit Fehlerstatus aufgrund vorheriger Fehler
+ cp /home/USER/all.tar /home/USER/mc_backup/mc_all
+ rm /home/USER/all.tar
+ echo -e '\033[32mBackup wurde erfolgreich erstellt!\033[0m'
Backup wurde erfolgreich erstellt!

Code: Alles auswählen

#!/bin/bash

#Minecraft-Server Start|Stop|Backup|Status|Restart Script

#Variablen

server_id=$2
screen_session_running=$(screen -ls | grep "$server_id")
game_dir=./mc_$server_id
backup_dir=/home/USER/mc_backup/mc_$server_id
backup_file=/home/USER/$server_id.tar
server_home_dir=/home/USER


case "$1" in

#Start-----------------------------------------------------------------------------------------------------------------------------------------------------
        start)
                if [ "$screen_session_running" != "" ]
                then
                clear
                echo 	"***Hinweis**"*
                echo
                echo -e  	"\033[31mDer Server läuft bereits!\033[0m"
                echo
                echo 	"***Hinweis***"
                else
                cd "$server_home_dir"
                cd "$game_dir"
                ./start.sh
                if [ "$screen_session_running" == "" ]
                then
                echo 	"***Hinweis***"
                echo
                echo -e   	"\033[31mDer Server konnte nicht gestartet werden bitte wenden Sie sich an den Systemadministrator!\033[0m"
                echo
                echo 	"***Hinweis***"
                else
                clear
                echo 	"***Hinweis***"
                echo
                echo -e   	"\033[32mDer Server wurde erfolgreich gestartet. Mit \033[0m\033[4mscreen -r $server_id\033[0m\033[32m können Sie in die Serverkonsole wechseln!\033[0m"
                echo
                echo 	"***Hinweis***"
                fi
                fi
                ;;
#Stop------------------------------------------------------------------------------------------------------------------------------------------------------
        stop)
                if [ "$screen_session_running" == "" ]
		then
		clear
		echo 	"***Hinweis***"
		echo
		echo -e 	"\033[31mDer Server konnte nicht gestoppt werden. Bitte stellen sie mit \033[0m\033[4m$server_id status\033[0m\033[31m sicher ob der Server läuft.\033[0m"
		echo
                echo 	"***Hinweis***"
		else
    		clear
		echo 	"***Hinweis***"
		echo
		echo -e		"\033[32mDer Server wird in 30 Sekunden heruntergefahren!"
		echo
		screen -r "$server_id" -X stuff $'say Der Server wird in 30 Sekunden heruntergefahren.\n'
                sleep 25
                screen -r "$server_id" -X stuff $'save-all\n'
                sleep 5
                screen -r "$server_id" -X stuff $'stop\n'
		echo -e		"\033[32mDer Server wurde erfolgreich gestoppt!\033[0m"
		echo
		echo 	"***Hinweis***"
		fi
                ;;
#Restart---------------------------------------------------------------------------------------------------------------------------------------------------
        restart)
		if [ "$screen_session_running" == "" ]
		then
		clear
                echo    "***Hinweis***"
                echo
                echo -e         "\033[31mDer Server konnte nicht neugestartet werden. Bitte stellen Sie mit \033[0m\033[4m$server_id status\033[0m\033[31m sicher ob der Server läuft.\033[0m"
                echo
                echo    "***Hinweis***"
	 	else
		clear
		echo    "***Hinweis***"
                echo
                echo -e         "\033[32mDer Server wird in 30 Sekunden neugestartet!"
                echo
                screen -r "$server_id" -X stuff $'say Der Server wird in 30 Sekunden neugestartet.\n'
                sleep 25
                screen -r "$server_id" -X stuff $'save-all\n'
                sleep 5
                screen -r "$server_id" -X stuff $'stop\n'
                echo -e		"\033[32mDer Server wurde erfolgreich gestoppt!\033[0m"
		sleep 1
	        echo -e		"\033[32mDer Server wird gestartet!\033[0m"
		sleep 5
                $0 start
		fi
                ;;
#Backup----------------------------------------------------------------------------------------------------------------------------------------------------
   	backup)
        	if [ "$screen_session_running" != "" ]
                then
      		clear
		echo "***Hinweis***"
      		echo -e "\033[32mStarte Backup für $server_id""!\033[0m"
      		screen -r "$server_id" -X stuff $'say Es wird ein Backup erstellt dabei können Laggs auftreten!\n'
                screen -r "$server_id" -X stuff $'save-all\n'
                screen -r "$server_id" -X stuff $'save-off\n'
                screen -r "$server_id" -X stuff $'say Backup gestartet!\n'
		rm -R "$backup_dir"
                mkdir "$backup_dir"
      		cd  "$server_home_dir"
                tar -cf "$server_id".tar "$game_dir"
		cp "$backup_file" "$backup_dir"
		rm "$backup_file"
                screen -r "$server_id" -X stuff $'save-on\n'
      		screen -r "$server_id"-X stuff $'save-all\n'
                screen -r "$server_id" -X stuff $'say Backup wurde erfolgreich erstellt!\n'
      		echo -e "\033[32mBackup wurde erfolgreich erstellt!\033[0m" 
                echo "***Hinweis***"
		else
                clear
		echo "***Hinweis***"
        	echo -e "\033[32mStarte Backup für $server_id""!\033[0m"
      		rm -R "$backup_dir"
                mkdir "$backup_dir"
                cd  "$server_home_dir"
                tar -cf "$server_id".tar "$game_dir"
                cp "$backup_file" "$backup_dir"
                rm "$backup_file"
                echo -e "\033[32mBackup wurde erfolgreich erstellt!\033[0m"
                echo "***Hinweis***"
		fi
       		;;
#Reload----------------------------------------------------------------------------------------------------------------------------------------------------
	reload)	
		if [ "$screen_session_running" == "" ]
		then
		clear
                echo "***Hinweis***"
                echo
                echo -e   "\033[31mDer Server läuft nicht!\033[0m"
                echo
                echo "***Hinweis***"
		else
		clear
                echo "***Hinweis***"
                echo
                echo -e   "\033[32mDer Server wird neugeladen!\033[0m"
                echo
                echo "***Hinweis***"
		fi
		;;
#Status----------------------------------------------------------------------------------------------------------------------------------------------------
        status)
                if [ "$screen_session_running" == "" ]
                then
                clear
                echo "***Hinweis***"
                echo
                echo -e   "\033[31mDer Server läuft nicht!\033[0m"
                echo
                echo "***Hinweis***"
                else
                clear
                echo "***Hinweis***"
                echo
                echo -e   "\033[32mDer Server läuft!\033[0m"
                echo
                echo "***Hinweis***"
                fi
                ;;
#Ausgabe bei falscher Eingabe------------------------------------------------------------------------------------------------------------------------------
        *)
                echo "Usage: $0 {start|stop|restart|backup|reload|status}"
		;;
esac

case "$2" in
	all)
		mc "$1" ftb
		mc "$1" hbf
		mc "$1" hardcore
		mc "$1" survival
		;;
	ftb)
		;;
	hbf)
		;;
	hardcore)
		;;
	survival)
		;;
esac


Mululu
Beiträge: 35
Registriert: 08.10.2013 18:17:41

Re: Mein erstes fast erfolgreiches Script

Beitrag von Mululu » 15.11.2013 20:27:22

push

Benutzeravatar
Meillo
Moderator
Beiträge: 9238
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Mein erstes fast erfolgreiches Script

Beitrag von Meillo » 16.11.2013 08:59:05

Mululu hat geschrieben:So danke für die vielen Tipps aber das mit dem "-z" verstehe ich nicht. Es wird ja beim Start mittels

Code: Alles auswählen

screen -ls | grep $server_id


geprüft ob der screen schon läuft und falls ja gibt es die Zeile mit der ID etc. aus. Deshalb habe ich ja das "!=" genommen oder meint ich eine andere Stelle im Script.
Wenn man schauen will, ob eine Variable den leeren String enthaelt, dann ist [ -z "$var" ] der bevorzugte Ansatz. Frueher hat man meist [ "x$var" = x ] verwendet (das hilft insbesondere wenn Variablenwerte mit `-' anfangen oder `!' sind). Der Vergleich [ "$var" == "" ] ist unueblich, aber nicht falsch, bis auf die Tatsache, dass `==' ein Bashism ist. Das test(1)-Kommando vergleicht mit einem *einfachen* `='.

Soweit funktioniert alles wenn auch nicht alles perfekt [...]
Das liegt oft daran, dass ein Script wenig oder schlecht strukturiert ist.

Ich empfehle Funktionen zu verwenden: Fuer jeden Fall eine eigene Funktion. Die Ausgabe der Ueberschriften koenntest du auch in eine Funktion auslagern. Dann waere das Script schon deutlich lesbarer und damit wahrscheinlich weniger fehlerbehaftet.

(Waere das Script lesbarer, dann haette ich auch mehr Lust darauf es mir anzuschauen ...)
Use ed once in a while!

Mululu
Beiträge: 35
Registriert: 08.10.2013 18:17:41

Re: Mein erstes fast erfolgreiches Script

Beitrag von Mululu » 16.11.2013 19:03:06

Ok vielen dank für deine Rezession ich werde mein bestes geben das Script verständlicher zumachen.

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: Mein erstes fast erfolgreiches Script

Beitrag von Natureshadow » 16.11.2013 20:24:00

Mululu hat geschrieben:Ok vielen dank für deine Rezession ich werde mein bestes geben das Script verständlicher zumachen.
Er hat ne Wirtschaftskrise 8O ?

-nik

Antworten