.sh - Datei schreiben (Screen)

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

.sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 14.10.2012 00:02:42

Guten Tag,

ich habe leider so gut wie keine Ahnung von der ".sh - Datei".
Daher frage ich euch (bevor ich was falsch mache).
--------------------------------------------------
Meine Frage:

Ich möchte eine .sh - Datei haben, die eine Datei startet im Screen Modusstartet.
--------------------------------------------------
Wie ich es normalerweise tue:

Den Befehl ausführen:

Code: Alles auswählen

screen -dmS block-srv ./xxlddrace_srv -f blocker-server_1.cfg
danach diesen Befehl ausführen:

Code: Alles auswählen

screen -x block-srv
--------------------------------------------------
Wenn z.B. die .sh - Datei "ServerStart.sh" heißt, möchte ich, dass ich mit dem Befehl:

Code: Alles auswählen

ServerStart.sh start
das ganze Skript (oben) startet.

Wenn ich aber:

Code: Alles auswählen

ServerStart.sh stop
eingebe, soll sich der "Screen block-srv" beenden.

Eventuell (nicht unbedingt notwendig), wenn ich:

Code: Alles auswählen

ServerStart.sh restart
eingebe, soll sich das Skript (oben) beenden mit der Screen-ID "block-srv" beenden und wieder starten.

--------------------------------------------------

Wenn jemand eine solche Datei schreiben kann, mit ich unendlich dankbar.
Ggf. möchte ich mich natürlich dann re­van­chie­ren!

VIELEN DANK NATÜRLICH IM VORAUS!!

Mit freundlichen Grüßen
Jannyeis (Jan)

hydraulik
Beiträge: 40
Registriert: 10.10.2012 21:22:30

Re: .sh - Datei schreiben (Screen)

Beitrag von hydraulik » 14.10.2012 00:30:26

Guck mal hier. Absatz Parameter.

Wenn du aber generell eher wenig Ahnung hast, lohnt es sich, sich das alles durchzulesen. Shell-Scripts sind nämlich schon eine tolle Sache.

Ein kleiner Hinweis noch am Rande: Es gehört zum guten Ton, bei sowas ganz am Anfang des Scripts in die ersten Zeilen als Kommentar zu schreiben, WER das Script gemacht hat, WAS das Script tut und WIE man es verwendet (insbesondere bzgl. der Parameter).

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 14.10.2012 13:37:40

Ok, vielen Dank; werde ich mir gleich mal durchlesen.
Kannst du mir evlt. ein Beispiel dieser "Inhaberinformation" machen?

Gruß Jannyeis (Jan)

hydraulik
Beiträge: 40
Registriert: 10.10.2012 21:22:30

Re: .sh - Datei schreiben (Screen)

Beitrag von hydraulik » 14.10.2012 15:43:52

Ganz nach oben. Die ersten Zeilen würden in etwa so aussehen:

Code: Alles auswählen

#!/bin/bash
# Screen control v1.0
# by Jannyeis
Da drunter eben noch eine Angabe der möglichen Parameter und was sie bewirken. Oder eben als Ausgabe, wenn das Script ohne Parameter gestartet wird. (Das ganze kannst du dir aber eigentlich schenken, wenn du eh der einzige bist, der das Script verwenden wird.)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: .sh - Datei schreiben (Screen)

Beitrag von Cae » 14.10.2012 16:15:04

Idealerweise erwähnt man auch die Lizenz, unter der man die Software freigibt (sofern man das tut) und vor allem eine E-Mail-Adresse, unter der man zu erreichen ist. Sie sollte Spam-resistent sein. Für den "Hausgebrauch" benötigst du aber keinerlei Angaben dieser Art. Das Skript interessiert sich nicht dafür.

Aus deinem Post geht nicht hervor, wie weit du bist, aber da du ein "foobar start|stop|reload"-Skript bauen willst, solltest du mal /etc/init.d/skeleton durchlesen. Die ganzen init.d-Skripte arbeiten ja nach dem start|stop|reload…-Prinzip, das skeleton ist die Vorlage.
Eigentlich lässt sich das auf

Code: Alles auswählen

#!/bin/sh
case "$1" in
	start)
		# start...
		;;
	stop)
		# stop...
		;;
	*)
		echo "E: invalid arg '$1'" >&2;
		exit 1;
		;;
esac
herunterbrechen. Die möglichen Werte für das erste Argument ($1) stehen in einer separaten Zeile mit einer geschlossenen Klammer ) dahinter, dann kommt ein Befehlsblock, der mit ;; abgeschlossen wird.

Einen screen namens foobar kann man wohl mit

Code: Alles auswählen

$ screen -S foobar -X quit
töten. Ob das unbedingt der eleganteste Weg ist, bleibt fraglich. Womöglich ist es gescheiter, den "xxldrace_srv" (was auch immer das sein soll) mit kill zu beenden, nachdem man sich seine PID gemerkt hat. Dann stirbt auch der screen.

Willkommen im Forum!

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 14.10.2012 17:57:25

Super, danke!

Mein Skript sieht nun so aus:

Code: Alles auswählen

#!/bin/bash
# Teeworlds Startscript v1.0

case "$1" in
	start)
			./xxlddrace_srv -f xxlddrace_srv_1.cfg
				echo "Teeworlds-Server wurde gestartet."
					done
					fi
	;;
	stop)
		kill pid xxlddrace_srv
			echo "Teeworlds-Server wurde gestoppt."
					done
					fi
	;;
	restart)
		$0 stop && $0 start || exit 1
	;;
	*)
		echo "Fehler: ${1} {start|stop|restart}"
		exit 2
esac
exit 0
Ich denke das dort aber noch was falsch ist, besonders im kill'n Bereich (restart).

Gruß Jannyeis

hydraulik
Beiträge: 40
Registriert: 10.10.2012 21:22:30

Re: .sh - Datei schreiben (Screen)

Beitrag von hydraulik » 14.10.2012 18:20:38

Hmm, ich seh da aber keinen Screen jetzt ...

Ich bin mir auch nicht sicher, ob "kill pid" überhaupt korrekt ist. Und wenn, dann wärs trotzdem eine unschöne Lösung.

Du solltest mal gucken, ob "xxlddrace_srv" auch einen Parameter zum stoppen hat - oder es gibt keinen und das Teil startet eine Console, in die du sowas wie "exit" eintragen musst, um den Server sauber zu beenden.

Ist letzteres der Fall, dann wäre Screen für eine vernünftige Lösung unumgänglich.

Es geht hier zwar um ein anderes Spiel, aber vielleicht kannst du mal gucken, wie es hier gelöst wurde. Vielleicht hilft das ja weiter.

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 14.10.2012 18:33:32

Hilft mir leider nicht so weiter.

Wenn ich xxlddrace_srv starte also mit: "./xxlddrace-server", dann startet sich der server im Terminal (in der Konsole).
Also wenn ich STRG + C drücke oder die Konsole schließe ist auch der Server down.

Deswegen mache ich das normalerweise über Screen, aber duch die .sh - Datei erhoffe ich mir, nicht immer die sch*** Screen-Befehle einzugeben. :-)

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: .sh - Datei schreiben (Screen)

Beitrag von r900 » 14.10.2012 19:10:19

Erstmal zu den gröbsten Fehlern. "done" benutzt man nur um eine for, while oder until-Schleife abzuschließen. Also z.B.

Code: Alles auswählen

while pidof xclock
do
  echo "xclock is running"
  sleep 5
done
Da die bei dir aber nicht vorkommen musst du "done" entfernen. Gleiches gilt für "fi", das schließt eine if-Bedingung. Du hast nur eine case-Unterscheidung und die wird durch "esac" (case rückwärts) geschlossen (der Teil ist richtig).

Diese Fehler werden momentan noch nicht bemerkt weil das Skript gar nicht bis dahin abgearbeitet wird. Du startest den Server nämlich im Vordergrund, das heißt das Skript kommt nur bis zu der Stelle wo der Server gestartet wird und wartet bis er wieder beendet wurde. Also so als wenn du im Terminal 'sleep 30' eingibst, dann musst du 30 Sekunden warten bis der Befehl beendet wurde und kannst dann erst den nächsten Befehl eingeben. Um ein Programm vom Terminal zu lösen kann man beim Starten ein "&" ans Ende der Zeile setzen. Also anstatt 'sleep 30' schreibt man 'sleep 30 &'.

Wenn du das so machen willst hast du noch ein bisschen Arbeit vor dir. Denn wenn du den Server startest musst du dessen PID (process ID) in eine Datei schreiben, damit dein Skript später auch den richtigen Prozess findet der beendet werden soll. Natürlich ginge es auch mit killall aber das wäre ziemlich ähh.. sagen wir mal unanständig :wink:
Das ginge im Prinzip so:

Code: Alles auswählen

xxlddrace_srv -f xxlddrace_srv_1.cfg &     # startet Server im Hintergrund
echo $! > /pfad/zur/datei                  # schreibt PID des zuletzt gestarteten Prozesses in eine Datei
Dann müsstest du vorher natürlich prüfen ob die Datei nicht schon besteht (also ob Server bereits gestartet ist). Schau dir dazu mal if-Bedingungen und das test-Kommando an. Beim stoppen musst du dann die PID aus dieser Datei einlesen und den Prozess beenden.

Alles in allem eine ganz nette Sache um ein bisschen was zu bash bzw. sh zu lernen. Wenn es dir allerdings nur darum geht dass du das Terminal schließen kannst und der Server weiterläuft, hängst du einfach ein "&" ans Ende des Befehls und fertig. Gibt der Server auch ein log im Terminal aus? Das sollte man dann in eine Datei umleiten. Sehen ob der Prozess läuft kannst du dann z.B. mit 'pidof xxlddrace_srv'. Und beenden mit 'killall xxlddrace_srv' oder eben 'kill <PID>' wobei du "<PID>" durch die Ausgabe von pidof ersetzen musst.

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 14.10.2012 21:04:04

Ah.. Super! Danke.

Eine Frage habe ich aber noch...

Wenn ich am Anfang schreibe:

Code: Alles auswählen

# Server eintragen
SERVER=""

# Pfad eintragen
PFAD=""
in meinen Fall also:

Code: Alles auswählen

[code]
# Server eintragen
SERVER="xxlddrace_srv"

# Pfad eintragen
PFAD="/home/xxlddrace/"
Denn soll er den SERVER einsetzten wo ich ./xxlddrace_srv geschrieben habe.

----------------------------------------------------------

Beispiel:
~~~~~~~~~~~~~~~~~
SERVER="Game1"
PFAD="/home/games/"
~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~
#!/bin/bash
case "$1" in
start)
cd /home/games/
./Game1
echo "Game 1 wurde gestartet."
;;
esac
exit 0
~~~~~~~~~~~~~~~~~
Was FETT Makiert is,t wird "ersetzt".
So ähnliches kann ich denn beim "KILLEN" anwenden & dann kann ich die .sh - Datei auch in einen anderen Ordner packen als wo die Datei ist die gestartet werden soll.

Sorry für meine Ausdrucksweise aber ich wusste nicht wie ich es formulieren sollte.

Gruß Jannyeis

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: .sh - Datei schreiben (Screen)

Beitrag von Cae » 14.10.2012 21:20:12

Jannyeis hat geschrieben:SERVER="Game1"
[…]
./Game1
Ja, aber Byte-genau. Also eben nicht

Code: Alles auswählen

./Game1 # sondern
Game1
. Wenn du am Ende ./Game1 haben willst, musst du entweder eine Variable fnord auf ./Game1 setzen, oder hinterher ./$fnord schreiben.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 14.10.2012 22:50:25

Was ist dieses "fnord"?

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 16.10.2012 01:26:54

Wenn ich am Anfang schreibe:

Code: Alles auswählen

#!/bin/sh
kommt dieses hier:

Code: Alles auswählen

root@debian:/games# ./test.sh
-bash: ./test.sh: /bin/sh^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden
Was ist daran falsch?

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: .sh - Datei schreiben (Screen)

Beitrag von r900 » 16.10.2012 01:56:56

Daran ist an sich nichts verkehrt. Die Datei scheinst du aber unter Windows erstellt zu haben. Deshalb hat sie ein anderes newline-Format als unter Linux (CRLF vs. LF). Falls du die Einstellung in deinem Texteditor nicht findest kannst du die Datei z.B. auch mit Debiandos2unix konvertieren. Wie sieht denn das Skript jetzt überhaupt aus?

hydraulik
Beiträge: 40
Registriert: 10.10.2012 21:22:30

Re: .sh - Datei schreiben (Screen)

Beitrag von hydraulik » 16.10.2012 02:10:30

Erstelle die Datei unter Linux (da muss eigentlich nicht viel drin stehen). Übertrage sie zu deinem Windows-PC und bearbeite sie dort mit Notepad++.

Bin mir sicher, dass Notepad++ auch selbst ne Funktion hat, im Linux-Format zu speichern. Hab aber nicht im Kopf, wie das geht.

Benutzeravatar
TRex
Moderator
Beiträge: 8367
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: .sh - Datei schreiben (Screen)

Beitrag von TRex » 16.10.2012 02:32:37

Du hast die Datei unter Windows bearbeitet.

Edit: huch...wo kamen die beiden Beiträge dazwischen her und warum kam da keine Warnung....
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: .sh - Datei schreiben (Screen)

Beitrag von Cae » 16.10.2012 02:37:15

hydraulik hat geschrieben:Bin mir sicher, dass Notepad++ auch selbst ne Funktion hat, im Linux-Format zu speichern. Hab aber nicht im Kopf, wie das geht.
Das ist irgendwo im Menü Format (?), nennt sich "Unix-Zeilenenden".

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 16.10.2012 09:51:54

Ich hab das Script gerade getestet und funktioniert soweit ganz gut.

Mein Script sieht nun so aus:

Code: Alles auswählen

#! /bin/sh

case "$1" in
	start)
			./xxlddrace_srv -f xxlddrace_srv_1.cfg
				echo "Teeworlds-Server wurde gestartet."
	;;
	stop)
		killall xxlddrace_srv
			echo "Teeworlds-Server wurde gestoppt."
	;;
	restart)
		$0 stop && $0 start || exit 1
	;;
	*)
		echo "Verwendung: tw-server_start.sh {start|stop|restart}"
		exit 2
	;;
esac
exit 0
Meine Fragen:

Was hat der Befehl: "$0 stop && $0 start || exit 1" zu bedeuten? ==> EDIT: Beantwortet!
Was bedeutet immer "exit 0" oder "exit 1"?
Wie kann ich die Datei automatisch Chmod 755 geben?
Was hat ">&2" zu bedeuten? (Bsp.: *) echo "Fehler: Nutzen Sie {start|stop|restart}." >&2


Gruß Jannyeis
Zuletzt geändert von Jannyeis am 16.10.2012 12:19:29, insgesamt 1-mal geändert.

uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

Re: .sh - Datei schreiben (Screen)

Beitrag von uname » 16.10.2012 11:42:20

Was hat der Befehl: "$0 stop && $0 start || exit 1" zu bedeuten?
$0 ist der aufgerufene Befehl, also dein Programmname.

Nun ist die boolesche Algebra von Interesse, siehe http://de.wikipedia.org/wiki/Boolesche_Algebra

Software versucht die Wahrheit der Aussage zu ermitteln.

Code: Alles auswählen

A && B || C
A UND B ODER C

Nun bindet soweit mir bekannt das UND stärker als das ODER. Ob es an der Reihenfolge liegt oder generell weiß ich nicht.
Alle denkbaren Szenarien

Code: Alles auswählen

A ok ; B ok ; C nicht ausführen
A ok ; B nok ; C ausführen
A nok ; B nicht ausführen ; C ausführen
Somit hat man im Prinzip mehrere if-Abfragen sehr leicht erschlagen. Das Verhalten ist so wie es bei "Restart" sein soll.

Die anderen Fragen mag ich gerade nicht beantworten.

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 16.10.2012 12:18:50

Ah... ok.
Soll ich denn nicht besser $0 durch $1 ersetzen?

uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

Re: .sh - Datei schreiben (Screen)

Beitrag von uname » 16.10.2012 12:28:37

Soll ich denn nicht besser $0 durch $1 ersetzen?
$0 ist das Programm, $1 ist der erste Parameter. Somit ist $0 korrekt.

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 16.10.2012 12:30:45

und was bedeutet denn "exit 1" :D

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: .sh - Datei schreiben (Screen)

Beitrag von r900 » 16.10.2012 13:06:06

Jannyeis hat geschrieben:Ich hab das Script gerade getestet und funktioniert soweit ganz gut.
Bis auf die Tatsache dass die Meldung "Teeworlds-Server wurde gestartet." nicht ausgegeben wird wenn du den Server startest und er nach wie vor beim Schließen des Terminals beendet wird. Die Lösung dazu findest du in meinem ersten Beitrag.

Außerdem prüfst du beim Starten nicht ob das Programm eventuell schon läuft, startest es also unter Umständen mehrfach.

Code: Alles auswählen

if pid=$(pidof xxlddrace_srv)
then
  echo "Server läuft bereits (PID $pid)"
  exit 1
else
  (Befehle um das Programm zu starten)
fi
Jannyeis hat geschrieben: Was hat ">&2" zu bedeuten? (Bsp.: *) echo "Fehler: Nutzen Sie {start|stop|restart}." >&2
Gibt die Meldung anstatt auf stdout auf stderr aus. Mehr dazu hier: http://wiki.ubuntuusers.de/Shell/Umleitungen
Jannyeis hat geschrieben: Wie kann ich die Datei automatisch Chmod 755 geben?
man chmod
Jannyeis hat geschrieben: Was bedeutet immer "exit 0" oder "exit 1"?
Das ist der exit-code des Skripts. Bei einem Fehler sollte der immer ungleich 0 sein. So wird das von Programmen auch gehandhabt. Deshalb weiß die if-Anweisung in meinem Beispiel ob pidof einen Prozess finden konnte oder nicht.

Jannyeis
Beiträge: 14
Registriert: 13.10.2012 23:17:21

Re: .sh - Datei schreiben (Screen)

Beitrag von Jannyeis » 16.10.2012 15:01:45

Nun habe ich das Script überarbeitet.

Code: Alles auswählen

#! /bin/sh

# Server-Datei
DATEI=""

# Config-Datei
CONFIG=""

# Pfad zur Server-Datei und Config-Datei
PFAD=""


###################################
##  Ab hier nichts mehr ändern!  ##
###################################


case "$1" in
		start)
			cd $PFAD
				./$DATEI -f $CONFIG
					echo "Teeworlds-Server wurde gestartet."
	;;
	stop)
		killall $DATEI
			echo "Teeworlds-Server wurde gestoppt."
	;;
	restart)
		$0 stop && $0 start || exit 1
	;;
	*)
		echo "Verwendung: "$0" {start|stop|restart}"
		exit 2
	;;
esac
exit 0
@r900: Ich weiß leider nicht wo genau ich die "if-abfrage" rein setzten soll.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: .sh - Datei schreiben (Screen)

Beitrag von r900 » 16.10.2012 15:33:30

In so einem Skript mit "cd" den Pfad zu wechseln sollte man vermeiden. Ruf das Programm stattdessen mit dem kompletten Pfad auf. Und ans Ende der Zeile setzt du ein "&"-Zeichen damit das Programm im Hintergrund gestartet wird und nach Beenden des Terminals weiterläuft. Verstehst du den Unterschied? Die if-Abfrage direkt unterhalb von "start)". Verstehst du weshalb ich die Zeile unterhalb "stop)" geändert habe und was da jetzt anders läuft als vorher?

Code: Alles auswählen

[...]
case "$1" in
   start)
      if pid=$(pidof xxlddrace_srv)
      then
         echo "Server läuft bereits (PID $pid)"
         exit 1
      else
         "$PFAD/$DATEI" -f "$PFAD/$CONFIG" &
         echo "Teeworlds-Server wurde gestartet."
      fi
   ;;
   stop)
      killall $DATEI && echo "Teeworlds-Server wurde gestoppt."
   ;;
   restart)
      "$0" stop && "$0" start || exit 1
   ;;
   *)
      echo "Verwendung: "$0" {start|stop|restart}"
      exit 2
   ;;
esac
exit 0

Antworten