ubuntuusers.de

Linux Shell Script: Übergabe Variablen Von Script A nach Script B

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Killerkarnickel

Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Hallo Leute.

Ich habe folgendes Problem:

Ich habe ein Script geschrieben, welches einige Variablen beinhaltet. Diese Werte der Variablen sind aber bei jedem User anders. Deshalb habe ich versucht, ein Hauptscript zu erstellen und ein Script, welches die Variablen übergibt.

Das alte (statische) Script sieht so aus:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#! /bin/bash
# Variablen Anfang
SCRIPT_VERSION="1.5"
STEAM_UPDATE_USER="xxx"
STEAM_CMD_DIR=/home/$STEAM_UPDATE_USER/.STEAMCMD
STEAM_DAEMON="steam.sh"
STEAM_ACCOUNT_USER="xxx"
STEAM_ACCOUNT_PASSWORD="xxx"
GS_GAMEUSER="xxx"
GS_GAMEDIR="xxx"
GS_GAMEPATH=/home/$GS_GAMEUSER/server/$GS_GAMEDIR
GS_GAMEDAEMON="srcds_run"
GS_GAME="xxx"
GS_TICKRATE="xxx"
GS_MAP="xxx"
GS_IP="xxx"
GS_PORT="xxx"
GS_MAXPLAYERS_OVERRIDE="xxx"
GS_GAMETYPE="xxx"
GS_GAMEMODE="xxx"
GS_MAPGROUP="xxx"
GS_FASTDL_FILE="fastdl.cfg"
GS_FASTDL_URL="http://xxxx/fastdl/$GS_GAMEDIR/$GS_GAME"
GS_EXTENDED_PARAMS="-console -usercon +sv_pure 0"
GS_GAMEPARAMS="-$GS_GAME -tickrate $GS_TICKRATE $GS_EXTENDED_PARAMS +map $GS_MAP -ip $GS_IP -port $GS_PORT +game_type $GS_GAMETYPE +game_mode $GS_GAMEMODE +mapgroup $GS_MAPGROUP -maxplayers_override $GS_MAXPLAYERS_OVERRIDE"
CRYPTFILE_PASSWD="xxx"
UPDATERFILE="update_$GS_GAMEDIR"
NAME={$GS_GAME}_{$GS_PORT}
DESC="Gameserver"
# Variablen Ende
 
# Nicht bearbeiten!
 
if [ ! -x `which awk` ]; then echo "Du brauchst AWK fuer dieses Script"; exit 1; fi
if [ ! -x `which screen` ]; then echo "Du musst screen vorher installieren!"; exit 1; fi
 
if [ `whoami` = root ]
then
 usagetype=root
else
 usagetype=nonroot
fi
 
start() {
   if [ ! -d $GS_GAMEPATH ]; then echo " ... Ordner nicht vorhanden: $GS_GAMEPATH!";  exit 1; fi
   if [ ! -x $GS_GAMEPATH/$GS_GAMEDAEMON ]; then echo "$GS_GAMEPATH/$GS_GAMEDAEMON existiert nicht oder ist nicht ausführbar!"; exit 1; fi
   if status; then echo " ... $DESC: $NAME läuft schon!"; exit 1; fi
 
   case "$usagetype" in
   root)
   
# Loeschen alter Files
rm $GS_GAMEPATH/screenlog.0
echo "##########################################################################"
echo "#### CS: GO Serverstartscript mit Autoupdatescript by Killerkarnickel ####"
echo "#### Version $SCRIPT_VERSION #########################################################"
echo "##########################################################################"
echo ""
cd $STEAM_CMD_DIR ;
if [ -r $UPDATERFILE.gpg ]; then echo "Updatefile für $GS_GAMEDIR existiert bereits!"; echo "Updatefile muss nicht erstellt werden!";
else echo "Updatefile für $GS_GAMEDIR existiert nicht! Updatefile wird nun erstellt."; echo "Bitte warten...";
echo "login $STEAM_ACCOUNT_USER $STEAM_ACCOUNT_PASSWORD" >>$UPDATERFILE
echo "force_install_dir $GS_GAMEPATH" >>$UPDATERFILE
echo "app_update 740" >>$UPDATERFILE
echo "quit" >>$UPDATERFILE
echo "quit" >>$UPDATERFILE
echo "Updatefile für $GS_GAMEDIR wurde erfolgreich erstellt!"
echo "Updatefile für $GS_GAMEDIR wird verschlüsselt!"
echo "Bitte warten..."
gpg -c --force-mdc --passphrase $CRYPTFILE_PASSWD $UPDATERFILE ;
echo "Updatefile für $GS_GAMEDIR wurde erfolgreich verschlüsselt!"
echo "Lösche unverschlüsselte Updatedatei von $GS_GAMEDIR!"
echo "Bitte warten..."
rm -R "$UPDATERFILE"
echo "Updatefile von $GS_GAMEDIR wurde erfolgreich gelöscht!"
fi
echo ""
echo "##########################################################################"
echo "#### Updatescript wird nun ausgeführt! ###################################"
echo "#### Falls ein Update ausständig ist, wird es nun installiert! ###########"
echo "#### Bitte warten... #####################################################"
echo "##########################################################################"
echo ""
cd $STEAM_CMD_DIR
gpg --passphrase $CRYPTFILE_PASSWD -d $UPDATERFILE.gpg 2>/dev/null | STEAMEXE=steamcmd ./$STEAM_DAEMON ;
echo ""
echo "##########################################################################"
echo "#### Ausständige Updates erfolgreich installiert! ########################"
echo "##########################################################################"
echo ""
echo "##########################################################################"
echo "#### Fastdownloadscript wird nun ausgeführt! #############################"
echo "#### Falls ein Update ausständig ist, wird es nun installiert! ###########"
echo "#### Bitte warten... #####################################################"
echo "##########################################################################"
echo ""
cd $GS_GAMEPATH/$GS_GAME/cfg
if [ -r $GS_FASTDL_FILE ]; then echo "$GS_FASTDL_FILE für $GS_GAMEDIR existiert bereits!"; echo "$GS_FASTDL_FILE muss nicht erstellt werden!";
else echo "$GS_FASTDL_FILE für $GS_GAMEDIR existiert nicht! $GS_FASTDL_FILE wird nun erstellt."; echo ""; echo "Bitte warten...";
        echo //Automatisches Fastdownloadscript  >> $GS_FASTDL_FILE
        echo //By Killerkarnickel                                 >> $GS_FASTDL_FILE
        echo //----------------------------------------------------------------------  >> $GS_FASTDL_FILE
        echo sv_downloadurl "\"$GS_FASTDL_URL\""                  >> $GS_FASTDL_FILE
echo "$GS_FASTDL_FILE für $GS_GAMEDIR wurde erfolgreich erstellt!"
echo ""
echo "#### Fastdownloadscript wurde geupdated! #################################"
fi
echo ""
echo "##########################################################################"
echo "#### Gehe über zum Gameserverstart! ######################################"
echo "#### Folgende Startparameter werden verwendet: ###########################"
echo "#### -ip $GS_IP ###################################################"
echo "#### -port $GS_PORT #########################################################"
echo "#### -game $GS_GAME ##########################################################"
echo "#### -tickrate $GS_TICKRATE #######################################################"
echo "#### -maxplayers_override $GS_MAXPLAYERS_OVERRIDE #############################################"
echo "#### Gamemod: Custom #####################################################"
echo "#### -mapgroup $GS_MAPGROUP ###################################################"
echo "#### FASTDL: On ##########################################################"
echo "##########################################################################"
echo ""
echo "##########################################################################"
echo "#### Führe Gameserverstart mit den Parametern durch! #####################"
echo "#### Bitte warten... #####################################################"
echo "##########################################################################"
echo ""
    su - $GS_GAMEUSER -c "cd $GS_GAMEPATH ; screen -AmdSL $NAME ./$GS_GAMEDAEMON $GS_GAMEPARAMS"
   ;;
   nonroot)
   
# Loeschen alter Files
rm $GS_GAMEPATH/screenlog.0
echo "##########################################################################"
echo "#### CS: GO Serverstartscript mit Autoupdatescript by Killerkarnickel ####"
echo "#### Version $SCRIPT_VERSION #########################################################"
echo "##########################################################################"
echo ""
cd $STEAM_CMD_DIR ;
if [ -r $UPDATERFILE.gpg ]; then echo "Updatefile für $GS_GAMEDIR existiert bereits!"; echo "Updatefile muss nicht erstellt werden!";
else echo "Updatefile für $GS_GAMEDIR existiert nicht! Updatefile wird nun erstellt."; echo "Bitte warten...";
echo "login $STEAM_ACCOUNT_USER $STEAM_ACCOUNT_PASSWORD" >>$UPDATERFILE
echo "force_install_dir $GS_GAMEPATH" >>$UPDATERFILE
echo "app_update 740" >>$UPDATERFILE
echo "quit" >>$UPDATERFILE
echo "quit" >>$UPDATERFILE
echo "Updatefile für $GS_GAMEDIR wurde erfolgreich erstellt!"
echo "Updatefile für $GS_GAMEDIR wird verschlüsselt!"
echo "Bitte warten..."
gpg -c --force-mdc --passphrase $CRYPTFILE_PASSWD $UPDATERFILE ;
echo "Updatefile für $GS_GAMEDIR wurde erfolgreich verschlüsselt!"
echo "Lösche unverschlüsselte Updatedatei von $GS_GAMEDIR!"
echo "Bitte warten..."
rm -R "$UPDATERFILE"
echo "Updatefile von $GS_GAMEDIR wurde erfolgreich gelöscht!"
fi
echo ""
echo "##########################################################################"
echo "#### Updatescript wird nun ausgeführt! ###################################"
echo "#### Falls ein Update ausständig ist, wird es nun installiert! ###########"
echo "#### Bitte warten... #####################################################"
echo "##########################################################################"
echo ""
cd $STEAM_CMD_DIR
gpg --passphrase $CRYPTFILE_PASSWD -d $UPDATERFILE.gpg 2>/dev/null | STEAMEXE=steamcmd ./$STEAM_DAEMON ;
echo ""
echo "##########################################################################"
echo "#### Ausständige Updates erfolgreich installiert! ########################"
echo "##########################################################################"
echo ""
echo "##########################################################################"
echo "#### Fastdownloadscript wird nun ausgeführt! #############################"
echo "#### Falls ein Update ausständig ist, wird es nun installiert! ###########"
echo "#### Bitte warten... #####################################################"
echo "##########################################################################"
echo ""
cd $GS_GAMEPATH/$GS_GAME/cfg
if [ -r $GS_FASTDL_FILE ]; then echo "$GS_FASTDL_FILE für $GS_GAMEDIR existiert bereits!"; echo "$GS_FASTDL_FILE muss nicht erstellt werden!";
else echo "$GS_FASTDL_FILE für $GS_GAMEDIR existiert nicht! $GS_FASTDL_FILE wird nun erstellt."; echo ""; echo "Bitte warten...";
        echo //Automatisches Fastdownloadscript  >> $GS_FASTDL_FILE
        echo //By Killerkarnickel                                 >> $GS_FASTDL_FILE
        echo //----------------------------------------------------------------------  >> $GS_FASTDL_FILE
        echo sv_downloadurl "\"$GS_FASTDL_URL\""                  >> $GS_FASTDL_FILE
echo "$GS_FASTDL_FILE für $GS_GAMEDIR wurde erfolgreich erstellt!"
echo ""
echo "#### Fastdownloadscript wurde geupdated! #################################"
fi
echo ""
echo "##########################################################################"
echo "#### Gehe über zum Gameserverstart! ######################################"
echo "#### Folgende Startparameter werden verwendet: ###########################"
echo "#### -ip $GS_IP ###################################################"
echo "#### -port $GS_PORT #########################################################"
echo "#### -game $GS_GAME ##########################################################"
echo "#### -tickrate $GS_TICKRATE #######################################################"
echo "#### -maxplayers_override $GS_MAXPLAYERS_OVERRIDE #############################################"
echo "#### Gamemod: Custom #####################################################"
echo "#### -mapgroup $GS_MAPGROUP ###################################################"
echo "#### FASTDL: On ##########################################################"
echo "##########################################################################"
echo ""
echo "##########################################################################"
echo "#### Führe Gameserverstart mit den Parametern durch! #####################"
echo "#### Bitte warten... #####################################################"
echo "##########################################################################"
echo ""
    cd $GS_GAMEPATH ; screen -AmdSL $NAME ./$GS_GAMEDAEMON $GS_GAMEPARAMS
   ;;
   esac
}
 
stop () {
   if ! status; then echo " ... $DESC $NAME konnte nicht gefunden werden. Läuft möglicherweise nicht"; exit 1; fi
 
   case "$usagetype" in
   root)
    tmp=$(su - $GS_GAMEUSER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
    su - $GS_GAMEUSER -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 - $GS_GAMEUSER -c "screen -ls" | grep [.]$NAME[[:space:]] > /dev/null
   ;;
   nonroot)
    screen -ls | grep [.]$NAME[[:space:]] > /dev/null
   ;;
   esac
}
 
watch () {
   if ! status; then echo "$DESC $NAME konnte nicht gefunden werden. Läuft möglicherweise nicht"; exit 1; fi
 
   case "$usagetype" in
   root)
    tmp=$(su - $GS_GAMEUSER -c "screen -ls" | awk -F . "\$2 ~ /^$NAME[[:space:]].*/ {print \$1}" | awk '{print $1}')
    su - $GS_GAMEUSER -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 "Starte $DESC: $NAME ..."
  start
  echo "Gameserver erfolgreich gestartet!"
 ;;
 
 stop)
  echo "Stoppe $DESC: $NAME ..."
  stop
  echo "Gameserver erfolgreich gestoppt!"
 ;;
 
 restart)
  echo "Starte $DESC: $NAME neu ..."
  status && stop
  echo "Neustart wird ausgeführt..."
  start
  echo "Gameserver erfolgreich neu gestartet!"
 ;;
 
 status)
  if status
  then echo "$DESC: $NAME ist online" 
  else echo "$DESC: $NAME ist offline"
  fi
 ;;
 watch)
  watch
 ;;
 
 *)
   echo "Befehle: $0 {start|stop|status|restart|watch}"
   exit 1
   ;;
 
esac
 
 
exit 0

Aber wie mache ich nun ein dynamisches Script daraus? Sprich mit Hauptscript und Script mit den Variablen? Alles bis zum Kommentar Variablen Ende soll in das Nebenscript. Der Rest ins Hauptscript.

Mein Versuch mit dem Hauptscript und dem Nebenscript ist leider Fehlgeschlagen ☺

Habt ihr vllt ne Lösung?

LG Killerkarnickel

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

der dot-Operator ist dein Freund. Minimalbeispiel:

1
2
3
4
5
# Gemeinsame Variablen, Shebang nicht nötig.
# Name: common.sh

foo="Hallo"
bar="Welt"
1
2
3
4
5
6
#!/bin/bash

. /pfad/zu/common.sh

echo "foo = $foo"
echo "bar = $bar"

Siehe auch „period“. Du führst damit das angegebene Skript in selben „Kontext“ (also in derselben Shell) aus wie das Hauptskript.

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Killerkarnickel schrieb:

Habt ihr vllt ne Lösung?

Es gibt mehrere. Die hierfür geeigneteste dürfte sein:

Du schreibst sämtliche Variablen die sich ändern können sollen in eine Konfigurations Datei und lässt die Shell dann die Datei einlesen:

Beispiel der Konfig:

1
2
3
#!/bin/bash
# Konfigurations-Datei: config.bash
beispiel_variable="wert"

Beispiel des Scripts:

1
2
3
4
5
6
7
8
9
#!/bin/bash
# Script
if [[ -f config.bash ]]
then
   . config.bash
else
   echo "Konfigurations-Datei fehlt: config.bash" > &2
   exit 1
fi

Edit: Memo an selbst: Vain-Antwortzeit approx. 10 Minuten. Danach nicht mehr antworten.

Bearbeitet von rklm:

Memo von Mod: Synataxhighlighting nutzen. 😉

Killerkarnickel

(Themenstarter)
Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Vielen Dank für die schnelle Antwort. Dein Beispiel hab ich verstanden aber wie ich das bei mir umsetzte is mir noch ein Rätsel^^

Ich habe folgende Situation:

ich habe im Ordner /home/skripte die Datei dedicated (diese ist das Hauptscript).

und jeweils im Ordner /home/<user>/server/XXX die Datei mit den Variablen.

Nun weiss ich nicht, wie ich das lösen kann, dass dies dann mit jedem User funktioniert.

LG Killerkarnickel

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Ich sehe dein Problem offen gesagt nicht:

1
2
3
# Datei: /home/skripte/dedicated
. ~/server/XXX         # lade Konfiguration
...

(Vorrausgesetzt — was die Regel ist — ist, dass /home/<user> auch das User-Verzeichnis ist)

Killerkarnickel

(Themenstarter)
Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Ich schreibs mal anders. Hab ich etwas verwirrend geschrieben geb ich zu^^

das Hauptscript ist klar das is in /home/skripte/dedicated

aber die User sind eben folgendermasen aufgeteilt sag ich jetz mal

/home/user1/server/server1 /home/user1/server/server2

usw.

Deshalb weis ich nicht, wie ich es machen muss, dass er eben einmal die Datei aus dem Ordner server1 und aus dem Ordner server2 übernimmt.

LG Killerkarnickel

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Killerkarnickel schrieb:

Deshalb weis ich nicht, wie ich es machen muss, dass er eben einmal die Datei aus dem Ordner server1 und aus dem Ordner server2 übernimmt.

Also, nur damit wir nicht aneinander vorbei reden: Jeder Nutzer startet das Skript selbst, oder? In dem Fall zeigt '~' immer auf '/home/<user>', das ist klar, denke ich?

Die zweite Sache ist: Nach welcher Regel soll entschieden werden, ob 'server1' oder 'server2' genommen werden soll? Hat ein User mehrere Konfigurations-Dateien (einen pro Server)? Soll ein Nutzer selbst entscheiden können, welche Konfiguration geladen wird, oder sollen immer alle Konfigurationen geladen werden?

Mal ein paar Ansätze:

Wenn jeder User selbst sagen können soll, welche Konfigurations-Datei geladen werden soll:

# dedicated
. "$1"

Dabei ist $1 der erste Parameter des Skript, also das Skript muss so aufgerufen werden:

/home/skripte/dedicated ~/server/server1

Wenn alle Konfigurationen geladen werden sollen, nimmst du am besten ein Skript dafür:

# run-all-dedicated
for i in ~/server/*
do
  /home/skripte/dedicated "${i}"
done

Als Beispiele. Ansonsten musst du leider noch genauer werden.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Wenn das Problem auch mit weniger als 289 Zeilen darstellbar ist, dann gebietet es die Höflichkeit ein kurzes Beispiel zu erzeugen, mit dem sich das Problem zeigen lässt, und das sich schnell erfassen lässt.

Mir scheint 10 Zeilen wären hier vollkommen ausreichend gewesen.

Killerkarnickel

(Themenstarter)
Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Jeder User kann das Script selber starten ja.

Jeder Server braucht aber eine eigene Konfiguration wegen den Ports und co.

Wenn der Server aus /home/user1/server1 gestartet wird, soll er auch die Konfig vom server1 Ordner holen. wenn dann auch noch der zweite server (server2) startet, soll dieser die Config aus dem Ordner server2 holen. dies soll es für jeden User machen.

Die Struktur ist: /home/user1/server/server1/config.bash und /home/user1/server/server2/config.bash sowie /home/skripte/dedicated

LG Killerkarnickel

Yanneck

Avatar von Yanneck

Anmeldungsdatum:
25. September 2009

Beiträge: 1216

Hallo,

ich kann eigentlich kein Bash und programmieren im Allgemeinen. Ist es aber nicht grundsätzlich schicker, die ganzen echo-Blöcke nach

cat << EOF 
Hier
der 
Text
EOF

umzustrukturieren?

Killerkarnickel

(Themenstarter)
Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Vielen Dank für eure Hilfe.

Habs hingekriegt mit der Methode von Kinch.

Musste nur einige Sachen im Script noch ändern und schon ging das ☺

LG Killerkarnickel

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Killerkarnickel schrieb:

Hallo Leute.

Hallo gefährlicher Langohr,

herzlich willkommen hier im Forum von ubuntuusers.de!

Habt ihr vllt ne Lösung?

Du hast ja schon reichlich Antworten bekommen...

Ciao

robert

Killerkarnickel

(Themenstarter)
Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Ich hab noch ein kleines Problem mit dem Script.

Wenn ich es unter Debian ausführe und mehrere Server starte ist es kein Problem jeden Server einzeln mit dem Skript zu stoppen (Befehl ./stop).

Unter Ubuntu hab ich nun folgendes Problem: Wenn ich mehrere Server starte und dann einen stoppen will bekomme ich von Screen folgende Meldung:

1
2
3
4
5
There are several suitable screens on:

	1900.css_war	(28.08.2012 22:13:45)	(Detached)
	1182.csgo_public	(28.08.2012 22:10:28)	(Detached)
Use -S to specify a session.

Willst ihr vllt an was das liegen kann?

PS im Skript werden Screen und AWK verwendet.

LG

Killerkarnickel

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Killerkarnickel schrieb:

Unter Ubuntu hab ich nun folgendes Problem: Wenn ich mehrere Server starte und dann einen stoppen will bekomme ich von Screen folgende Meldung:

1
2
3
4
5
There are several suitable screens on:

	1900.css_war	(28.08.2012 22:13:45)	(Detached)
	1182.csgo_public	(28.08.2012 22:10:28)	(Detached)
Use -S to specify a session.

Willst ihr vllt an was das liegen kann?

Offensichtlich sind die Argumente für screen -r nicht eindeutig. Ich schlage vor, Du fügst folgende Zeile ganz oben (2. Zeile) im Skript ein:

1
test -n "$DEBUG" && set -x

Dann kannst Du Dein Skript so aufrufen:

1
DEBUG=y script

Du bekommst dann auf stderr alle Kommandos samt ihrer Kommandozeilenoptionen ausgegeben. Das hilft Dir vermutlich zu erkennen, wo es hapert.

Ciao

robert

Killerkarnickel

(Themenstarter)
Avatar von Killerkarnickel

Anmeldungsdatum:
27. August 2012

Beiträge: 14

Hallo.

Durch den Debug Befehl habe ich nun folgendes erhalten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
+ SCRIPT_VERSION=2.1
+ STEAM_CMD_DIR=/opt/.STEAMCMD
+ STEAM_CMD_SCRIPT_PATH=/opt/.STEAMCMD/scripting
+ STEAM_DAEMON=steam.sh
+ '[' -r /opt/xxx/csgo_server/public/.varcfg ']'
+ echo '.varcfg existiert!'
+ . /opt/xxx/csgo_server/public/.varcfg
++ GS_GAMEUSER=xxx
++ GS_GAMEDIR=public
++ GS_GAMEPATH=/opt/xxx/csgo_server/public
++ GS_GAMEDAEMON=srcds_run
++ GS_GAME=csgo
++ GS_TICKRATE=128
++ GS_MAP=de_dust2
++ GS_IP=xxx
++ GS_PORT=27066
++ GS_MAXPLAYERS_OVERRIDE=32
++ GS_GAMETYPE=0
++ GS_GAMEMODE=0
++ GS_MAPGROUP=mg_bomb
++ GS_FASTDL_FILE=fastdl.cfg
.varcfg existiert!
++ GS_FASTDL_URL=http://xxx/fastdl/csgo_server/public/csgo
++ UPDATERFILE=update_27066
++ GS_EXTENDED_PARAMS='-console -usercon +exec fastdl.cfg +sv_pure 0 -steam_dir /opt/.STEAMCMD -steamcmd_script /opt/.STEAMCMD/scripting/update_27066'
++ GS_GAMEPARAMS='-csgo -tickrate 128 -console -usercon +exec fastdl.cfg +sv_pure 0 -steam_dir /opt/.STEAMCMD -steamcmd_script /opt/.STEAMCMD/scripting/update_27066 +map de_dust2 -ip xxx -port 27066 +game_type 0 +game_mode 0 +mapgroup mg_bomb -maxplayers_override 32 -autoupdate'
++ NAME=csgo_public
++ DESC=Gameserver
+ STEAM_ACCOUNT_USER=xxx
+ STEAM_ACCOUNT_PASSWORD=xxx
++ which mawk
+ '[' '!' -x /usr/bin/mawk ']'
++ which screen
+ '[' '!' -x /usr/bin/screen ']'
++ whoami
+ '[' ju3st-clan.de = root ']'
+ usagetype=nonroot
+ case "$2" in
+ echo 'Stoppe Gameserver: csgo_public ...'
+ stop
+ status
+ case "$usagetype" in
+ screen -ls
+ grep '[.]csgo_public[[:space:]]'
+ case "$usagetype" in
++ screen -ls
++ mawk -F . '$2 ~ /^csgo_public[[:space:]].*/ {print $1}'
++ mawk '{print $1}'
+ screen -r -X quit
+ echo 'Gameserver erfolgreich gestoppt!'
+ exit 0
Stoppe Gameserver: csgo_public ...
There are several suitable screens on:

	3170.csgo_public	(29.08.2012 11:11:42)	(Detached)
	2920.css_war	(29.08.2012 11:09:08)	(Detached)
Use -S to specify a session.

Gameserver erfolgreich gestoppt!

Wisst ihr da vllt was dahinter steckt? ich habs nämlich nicht gefunden.

PS das hier wäre der entsprechende Teil im Script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
stop () {
   if ! status; then echo " ... $DESC $NAME konnte nicht gefunden werden. Laeuft moeglicherweise nicht"; exit 1; fi

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

LG

Killerkarnickel

Antworten |