====== Running Multiple Instances of the Crossfire Server ======
Running multiple instances of the [[:server]] is possible, be it for debugging purposes or just for the personal experience. \\
And my personal experience on a 2-Core Intel CPU with 2,67 GHz BIOS year 2008 is very pleasing: 8 instances were running, without much CPU-usage as shown by the [[http://xosview.sourceforge.net|xosview]] application. \\
===== Problems when running multiple instances =====
There are some problems when running multiple instances of the server; mainly the LOCALDIR and LIBDIR (DATADIR) handling may confuse the (other) servers, if these are shared. \\
One solution would be to pass [[positional parameters]] to the server at start up time, the other solution would be to use [[environment variables]] . \\
===== Example Bash Script to launch multiple servers =====
This is just a snipplet to demonstrate the usage of parameters :
#!/bin/bash
# VARIABLES
SERVER_NUM=${*:-$SERVER_NUM} # number of servers to launch
SERVER_NUM=${SERVER_NUM:-3}
MY_SERVER_OPTYS="" # -d
PREFIX=`pwd`
PREFIX=${PREFIX%/*}
DATA_DIR_DEF=$PREFIX/share/crossfire
# more default path for dirs and files here ...
for i in `seq 1 1 ${SERVER_NUM:-1}`; do
# assign variables here
DATA_DIR=$DATA_DIR_DEF.$i
# more assignments here ...
# now start server ...
#./crossfire-server -csport $((13227+i)) -detach
./crossfire -csport $((13227+i)) $MY_SERVER_OPTS -detach \
-log $LOG_FILE \
-conf $CONF_DIR \
-tmpdir $TMP_DIR \
-data $DATA_DIR \
-maps $MAPS_DIR \
-arch $ARCH_FILE \
-regions $REGIONS_FILE \
-treasures $TREASURE_FILE \
-local $LOCAL_DIR \
-templatedir $TEMPL_DIR \
-uniquedir $UNIQUE_DIR \
-playerdir $PLAYER_DIR \
sleep 5
done
You may find a whole script one day [[:server:running_the_server:bash:launch_multiple_servers|here]] .
=== What does the above scribble do ? ===
**1.)** It needs to assign a bunch of default variable names; those can then be used as template to assign the "real" variable name in the //for// loop below. Example : DATA_DIR becomes DATA_DIR_DEF with a simple **.i** added at the end; where **i** would stand for the current number of the **for loop** is provided by the **seq** command. I use the //seq// command instead of //{1..$SERVER_NUM}// because I think that it is more portable, since the [[https://busybox.net|busybox ash]] shell does not know such syntax until today.
**2.)** Inside the //for// loop the 4 absolute directory variables CONF_DIR, DATA_DIR, LOCAL_DIR, TMP_DIR get their assignments and the 1 absolute file LOG_FILE . Then these PATH_DIRs need to be checked if they exist, and maybe created if not existent like the // arch/ // and // maps/ // packages.
**3.)** Each server needs an unique port number. This is achieved by passing the command-line option -csport $((13227 + i))
to the server start line. \\
:!: **Note:** Some people do not like bash math without adding the variable-indicator sign **$**, but I have better experience, when the //$// is omitted. Example:
bash-3.00# A=
bash-3.00# B=1
bash-3.00# echo $(( $B + $A ))
bash: 1 + : syntax error: operand expected (error token is " ")
bash-3.00# echo $(( B + A ))
1
**4.)** Server start line : The syntax **./program** indicates, that this start-up script is located inside the directory, where the crossfire server resides. **program** would launch the //program// that is found in the PATH variable ( ''echo $PATH'' should show which folders are in the //path// , and ''which '' should show the first location of the found names of //program// ; bash only : ''type -a crossfire'' would show all locations of the executable named 'crossfire' ) . \\
:!: **Note:** Today the crossfire server executable is named **crossfire-server** by the default [[:server:server compiling]] scripts. \\
The crossfire executable is launched then with the many -parameter options to make each instance having its own temporary, player, map and other files.
**5.)** Sleep 5 seconds before launching the next number the for loop still has left.
==== Server Startup Errors and Crashes ====
**1.)** Do not think, that while the //-maps// option at least is responsible for the maps package, that the //-arch// option would be meant for the [[:arch:]] package; it should be named -archetypesfile . \\
**2.)** The //-maps// are huge space consumers when installed and decompressed. But the -maps option does not want an absolute path suggested like // /mnt/my-big-data-partition/crossfire/maps // . If you want to use absolute path, you need to set the //-datadir// as absolute path and place your //maps/ // directory inside that.