diff options
author | David Walter Seikel | 2011-11-27 19:31:33 +1000 |
---|---|---|
committer | David Walter Seikel | 2011-11-27 19:31:33 +1000 |
commit | d8b6646a004060edf073b96065fdbb979baa2f68 (patch) | |
tree | 4f8d9af35f9758037cca167d255eaecb8e02c97e | |
parent | Rename the start up script. (diff) | |
download | IGnoble-d8b6646a004060edf073b96065fdbb979baa2f68.zip IGnoble-d8b6646a004060edf073b96065fdbb979baa2f68.tar.gz IGnoble-d8b6646a004060edf073b96065fdbb979baa2f68.tar.bz2 IGnoble-d8b6646a004060edf073b96065fdbb979baa2f68.tar.xz |
Trying to make things safer for upgrades and some general tweaks.
Diffstat (limited to '')
-rw-r--r-- | README | 11 | ||||
-rw-r--r-- | common.ini | 21 | ||||
-rwxr-xr-x | create_region.sh | 45 | ||||
-rwxr-xr-x | go_live.sh | 12 | ||||
-rwxr-xr-x | install_opensim.sh | 81 | ||||
-rw-r--r-- | opensim-monit.conf | 2 | ||||
-rwxr-xr-x | start-sim | 6 |
7 files changed, 127 insertions, 51 deletions
@@ -60,3 +60,14 @@ this directory) - | |||
60 | 60 | ||
61 | ./go_live.sh | 61 | ./go_live.sh |
62 | 62 | ||
63 | |||
64 | NOTES - | ||
65 | |||
66 | This attempts to use only one copy of the OS install for all sims. We | ||
67 | are running one instance of OS for each sim though, as this prevents one | ||
68 | sim crashing from bringing down the others. OS however really wants to | ||
69 | write data to directories within it's own bin directory. I'm not at all | ||
70 | certian if that data can be shared. For the same reason, so far I've | ||
71 | not been able to get to thepoint where we can make the OS directory read | ||
72 | only. This complicates things during upgrades. | ||
73 | |||
diff --git a/common.ini b/common.ini new file mode 100644 index 0000000..b76bcae --- /dev/null +++ b/common.ini | |||
@@ -0,0 +1,21 @@ | |||
1 | [DatabaseService] | ||
2 | StorageProvider = "OpenSim.Data.MySQL.dll" | ||
3 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
4 | [AssetService] | ||
5 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
6 | [InventoryService] | ||
7 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
8 | [AvatarService] | ||
9 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
10 | [AuthenticationService] | ||
11 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
12 | [UserAccountService] | ||
13 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
14 | [GridUserService] | ||
15 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
16 | [FriendsService] | ||
17 | ConnectionString = "Data Source=localhost;Database=opensim;User ID=opensim;Password=MYSQL_PASSWORD;" | ||
18 | [Network] | ||
19 | ConsoleUser = "REST_USER" | ||
20 | ConsolePass = "REST_PASSWORD" | ||
21 | |||
diff --git a/create_region.sh b/create_region.sh index ba9de5a..5c27052 100755 --- a/create_region.sh +++ b/create_region.sh | |||
@@ -4,7 +4,9 @@ NAME=$1 | |||
4 | LOCATION=$2 | 4 | LOCATION=$2 |
5 | URL=$3 | 5 | URL=$3 |
6 | IP=$4 | 6 | IP=$4 |
7 | cd /opt/opensim/config | 7 | |
8 | OSPATH="/opt/opensim" | ||
9 | cd $OSPATH/config | ||
8 | 10 | ||
9 | k=0 | 11 | k=0 |
10 | for i in $(seq 99) | 12 | for i in $(seq 99) |
@@ -28,12 +30,8 @@ then | |||
28 | echo "WARNING setting the Location to $LOCATION, this may not be what you want." | 30 | echo "WARNING setting the Location to $LOCATION, this may not be what you want." |
29 | fi | 31 | fi |
30 | 32 | ||
31 | if [ "x$URL" = "x" ] | 33 | # Here we make use of an external IP finding service. Careful, it may move. |
32 | then | 34 | # We later reuse the same IP for the default URL, coz that should work at least. |
33 | URL=$(hostname) # URL is best (without the HTTP://), but IP (e.g. 88.109.81.55) works too. | ||
34 | echo "WARNING setting the ExternalHostName to $URL, this may not be what you want." | ||
35 | fi | ||
36 | |||
37 | if [ "x$IP" = "x" ] | 35 | if [ "x$IP" = "x" ] |
38 | then | 36 | then |
39 | # 0.0.0.0 will work for a single sim per physical machine, otherwise we need the real internal IP. | 37 | # 0.0.0.0 will work for a single sim per physical machine, otherwise we need the real internal IP. |
@@ -42,6 +40,12 @@ then | |||
42 | echo " 0.0.0.0 will work for a single sim per physical machine, otherwise we need the real internal IP." | 40 | echo " 0.0.0.0 will work for a single sim per physical machine, otherwise we need the real internal IP." |
43 | fi | 41 | fi |
44 | 42 | ||
43 | if [ "x$URL" = "x" ] | ||
44 | then | ||
45 | URL=$IP # URL is best (without the HTTP://), but IP (e.g. 88.109.81.55) works too. | ||
46 | echo "WARNING setting the ExternalHostName to $URL, this may not be what you want." | ||
47 | fi | ||
48 | |||
45 | NUM=$(printf "%02d" $(($k + 1)) ) | 49 | NUM=$(printf "%02d" $(($k + 1)) ) |
46 | PORT=$(( 9005 + ($k * 5) )) # 9002 is used for HTTP/UDP so START with port 9003! CAUTION Diva/D2 starts at port 9000. | 50 | PORT=$(( 9005 + ($k * 5) )) # 9002 is used for HTTP/UDP so START with port 9003! CAUTION Diva/D2 starts at port 9000. |
47 | UUID=$(uuidgen) | 51 | UUID=$(uuidgen) |
@@ -60,21 +64,40 @@ AllowAlternatePorts = False | |||
60 | ExternalHostName = $URL | 64 | ExternalHostName = $URL |
61 | zzzzEOFzzzz | 65 | zzzzEOFzzzz |
62 | 66 | ||
63 | ln -s ../../setup/start-sim-in-rest start-sim-in-rest | 67 | ln -s ../../setup/start-sim start-sim |
64 | cp ../../current/bin/OpenSim.exe.config OpenSim.exe.config | 68 | cp ../../current/bin/OpenSim.exe.config OpenSim.exe.config |
69 | sed -i 's@<appender name="LogFileAppender" type="log4net.Appender.FileAppender">@<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">@' OpenSim.exe.config | ||
65 | sed -i "s@<file value=\"OpenSim.log\" />@<file value=\"/var/log/opensim/sim$NUM.log\" />@" OpenSim.exe.config | 70 | sed -i "s@<file value=\"OpenSim.log\" />@<file value=\"/var/log/opensim/sim$NUM.log\" />@" OpenSim.exe.config |
66 | 71 | ||
67 | cat > ThisSim.ini << zzzzEOFzzzz | 72 | cat > ThisSim.ini << zzzzEOFzzzz |
68 | [Startup] | 73 | [Startup] |
69 | PIDFile = "/var/run/opensim/sim$NUM.pid" | 74 | PIDFile = "/var/run/opensim/sim$NUM.pid" |
70 | regionload_regionsdir="/opt/opensim/config/sim$NUM/Regions" | 75 | regionload_regionsdir="$OSPATH/config/sim$NUM/Regions" |
76 | DecodedSculptMapPath = "caches/sim$NUM/j2kDecodeCache" | ||
71 | 77 | ||
72 | [Network] | 78 | [Network] |
73 | console_port = $(( $PORT + 2 )) | 79 | console_port = $(( $PORT + 2 )) |
74 | http_listener_port = $(( $PORT + 0)) | 80 | http_listener_port = $(( $PORT + 0)) |
75 | zzzzEOFzzzz | ||
76 | 81 | ||
77 | cp ../../current/bin/OpenSim.ConsoleClient.ini OpenSim.ConsoleClient.ini | 82 | [AssetCache] |
83 | ;; Damn, this gets overidden later by the FlotsamCache.ini file. | ||
84 | ;; At least it says it can be shared by multiple instances. | ||
85 | ; CacheDirectory = "caches/sim$NUM/assetcache" | ||
86 | |||
87 | [XEngine] | ||
88 | ScriptEnginesPath = "caches/sim$NUM/ScriptEngines" | ||
89 | |||
90 | [GridService] | ||
91 | MapTileDirectory = "caches/sim$NUM/maptiles" | ||
92 | |||
93 | [DataSnapshot] | ||
94 | snapshot_cache_directory = "caches/sim$NUM/DataSnapshot" | ||
95 | |||
96 | [Includes] | ||
97 | Include-Common = config/common.ini | ||
98 | |||
99 | zzzzEOFzzzz | ||
100 | cp ../OpenSim.ConsoleClient.ini OpenSim.ConsoleClient.ini | ||
78 | sed -i "s@; port = 9002@port = $(( $PORT + 2 ))@" OpenSim.ConsoleClient.ini | 101 | sed -i "s@; port = 9002@port = $(( $PORT + 2 ))@" OpenSim.ConsoleClient.ini |
79 | 102 | ||
80 | cp ../../setup/opensim-monit.conf opensim-monit.conf | 103 | cp ../../setup/opensim-monit.conf opensim-monit.conf |
@@ -1,17 +1,19 @@ | |||
1 | #!/bin/bash | 1 | #!/bin/bash |
2 | 2 | ||
3 | OSPATH="/opt/opensim" | ||
4 | |||
3 | for i in $(seq 99) | 5 | for i in $(seq 99) |
4 | do | 6 | do |
5 | j=$(printf "sim%02d" $i) | 7 | j=$(printf "sim%02d" $i) |
6 | if [ -e "/opt/opensim/config/$j" ] | 8 | if [ -e "$OSPATH/config/$j" ] |
7 | then | 9 | then |
8 | sudo chown -R opensim:opensim /opt/opensim/config/$j | 10 | sudo chown -R opensim:opensim $OSPATH/config/$j |
9 | sudo ln -s /opt/opensim/config/$j/opensim-monit.conf /etc/monit/conf.d/$j.conf | 11 | sudo ln -s $OSPATH/config/$j/opensim-monit.conf /etc/monit/conf.d/$j.conf |
10 | fi | 12 | fi |
11 | done | 13 | done |
12 | 14 | ||
13 | sudo chmod 755 /var/log/opensim | 15 | sudo chmod 755 /var/log/opensim |
14 | sudo chmod 755 /var/run/opensim | 16 | sudo chmod 755 /var/run/opensim |
15 | sudo chown -R opensim:opensim /opt/opensim/opensim-0.7.1.1-infinitegrid-03 | 17 | sudo chown -R opensim:opensim $OSPATH/opensim-0.7.1.1-infinitegrid-03 |
16 | sudo chown -R opensim:opensim /opt/opensim/modules | 18 | sudo chown -R opensim:opensim $OSPATH/modules |
17 | 19 | ||
diff --git a/install_opensim.sh b/install_opensim.sh index 0800523..4163132 100755 --- a/install_opensim.sh +++ b/install_opensim.sh | |||
@@ -6,6 +6,10 @@ then | |||
6 | else | 6 | else |
7 | MYSQL_PASSWORD=$1 | 7 | MYSQL_PASSWORD=$1 |
8 | fi | 8 | fi |
9 | REST_USER="RestingUser" | ||
10 | REST_PASSWORD="SecretRestingPlace" | ||
11 | |||
12 | OSPATH="/opt/opensim" | ||
9 | USER=$(whoami) | 13 | USER=$(whoami) |
10 | VERSION_CONTROL="off" | 14 | VERSION_CONTROL="off" |
11 | 15 | ||
@@ -36,41 +40,33 @@ sudo chmod 757 /var/log/opensim | |||
36 | sudo mkdir -p /var/run/opensim | 40 | sudo mkdir -p /var/run/opensim |
37 | sudo chown opensim:opensim /var/run/opensim | 41 | sudo chown opensim:opensim /var/run/opensim |
38 | sudo chmod 757 /var/run/opensim | 42 | sudo chmod 757 /var/run/opensim |
39 | sudo mkdir -p /opt/opensim/config /opt/opensim/modules /opt/opensim/setup | 43 | sudo mkdir -p $OSPATH/config $OSPATH/setup $OSPATH/caches/assetcache |
40 | sudo chown opensim:opensim /opt/opensim | 44 | sudo chown opensim:opensim $OSPATH |
41 | sudo chown -R opensim:opensim /opt/opensim | 45 | sudo chown -R opensim:opensim $OSPATH |
42 | sudo chmod -R 757 /opt/opensim | 46 | sudo chmod -R 757 $OSPATH |
43 | cp start-sim-in-rest /opt/opensim/setup | 47 | cp * $OSPATH/setup |
44 | cp opensim-monit.conf /opt/opensim/setup | 48 | cp common.ini $OSPATH/config |
49 | sed -i "s@MYSQL_PASSWORD@$MYSQL_PASSWORD@g" $OSPATH/config/common.ini | ||
50 | sed -i "s@REST_PASSWORD@$REST_PASSWORD@g" $OSPATH/config/common.ini | ||
51 | sed -i "s@REST_USER@$REST_USER@g" $OSPATH/config/common.ini | ||
45 | cat opensim-crontab.txt | sudo crontab -u opensim - | 52 | cat opensim-crontab.txt | sudo crontab -u opensim - |
46 | 53 | ||
47 | cd /opt/opensim | 54 | cd $OSPATH |
48 | if [ ! -e opensim-0.7.1.1-infinitegrid-03.tar.bz2 ] | 55 | if [ ! -e opensim-0.7.1.1-infinitegrid-03.tar.bz2 ] |
49 | then | 56 | then |
50 | wget https://github.com/downloads/infinitegrid/InfiniteGrid-Opensim/opensim-0.7.1.1-infinitegrid-03.tar.bz2 | 57 | wget https://github.com/downloads/infinitegrid/InfiniteGrid-Opensim/opensim-0.7.1.1-infinitegrid-03.tar.bz2 |
51 | fi | 58 | fi |
52 | |||
53 | if [ ! -e opensim-0.7.1.1-infinitegrid-03 ] | 59 | if [ ! -e opensim-0.7.1.1-infinitegrid-03 ] |
54 | then | 60 | then |
55 | tar xjf opensim-0.7.1.1-infinitegrid-03.tar.bz2 | 61 | tar xjf opensim-0.7.1.1-infinitegrid-03.tar.bz2 |
56 | fi | 62 | fi |
57 | ln -fs opensim-0.7.1.1-infinitegrid-03 current | 63 | ln -fs opensim-0.7.1.1-infinitegrid-03 current |
58 | 64 | ||
59 | cd current/bin | 65 | # Create the REST client config file. |
60 | mv -f OpenSim.Forge.Currency.dll ../../modules/ | 66 | cat > config/OpenSim.ConsoleClient.ini << zzzzEOFzzzz |
61 | ln -fs ../../modules/OpenSim.Forge.Currency.dll OpenSim.Forge.Currency.dll | ||
62 | mv -f OpenSimSearch.Modules.dll ../../modules/ | ||
63 | ln -fs ../../modules/OpenSimSearch.Modules.dll OpenSimSearch.Modules.dll | ||
64 | mv -f NSLModules.Messaging.MuteList.dll ../../modules/ | ||
65 | ln -fs ../../modules/NSLModules.Messaging.MuteList.dll NSLModules.Messaging.MuteList.dll | ||
66 | mv -f OpenSimProfile.Modules.dll ../../modules/ | ||
67 | ln -fs ../../modules/OpenSimProfile.Modules.dll OpenSimProfile.Modules.dll | ||
68 | ln -fs ../../config config | ||
69 | |||
70 | cat > OpenSim.ConsoleClient.ini << zzzzEOFzzzz | ||
71 | [Startup] | 67 | [Startup] |
72 | ; Set here or use the -user command-line switch | 68 | ; Set here or use the -user command-line switch |
73 | user = RestingUser | 69 | user = $REST_USER |
74 | 70 | ||
75 | ; Set here or use the -host command-line switch | 71 | ; Set here or use the -host command-line switch |
76 | host = localhost | 72 | host = localhost |
@@ -81,18 +77,37 @@ cat > OpenSim.ConsoleClient.ini << zzzzEOFzzzz | |||
81 | ; Set here or use the -pass command-line switch | 77 | ; Set here or use the -pass command-line switch |
82 | ; Please be aware that this is not secure since the password is in the clear | 78 | ; Please be aware that this is not secure since the password is in the clear |
83 | ; we recommend the use of -pass wherever possible | 79 | ; we recommend the use of -pass wherever possible |
84 | pass = SecretRestingPLace | 80 | pass = $REST_PASSWORD |
85 | zzzzEOFzzzz | 81 | zzzzEOFzzzz |
86 | 82 | ||
87 | sed -i 's@<appender name="LogFileAppender" type="log4net.Appender.FileAppender">@<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">@' OpenSim.exe.config | 83 | cd current/bin |
88 | sed -i 's@; ConsoleUser = "Test"@ConsoleUser = "RestingUser"@' OpenSim.ini | 84 | # Not sure why we are moving these. Hopefully we can get rid of having to move them. |
89 | sed -i 's@; ConsolePass = "secret"@ConsolePass = "SecretRestingPlace"@' OpenSim.ini | 85 | # Comenting them out, until Alice or Rizzy remember why they seed to be moved. See if things still work. |
86 | #mv -f OpenSim.Forge.Currency.dll ../../modules/ | ||
87 | #ln -fs ../../modules/OpenSim.Forge.Currency.dll OpenSim.Forge.Currency.dll | ||
88 | #mv -f OpenSimSearch.Modules.dll ../../modules/ | ||
89 | #ln -fs ../../modules/OpenSimSearch.Modules.dll OpenSimSearch.Modules.dll | ||
90 | #mv -f NSLModules.Messaging.MuteList.dll ../../modules/ | ||
91 | #ln -fs ../../modules/NSLModules.Messaging.MuteList.dll NSLModules.Messaging.MuteList.dll | ||
92 | #mv -f OpenSimProfile.Modules.dll ../../modules/ | ||
93 | #ln -fs ../../modules/OpenSimProfile.Modules.dll OpenSimProfile.Modules.dll | ||
94 | |||
95 | ln -fs ../../config config | ||
96 | mv -f addon-modules ../../config | ||
97 | ln -fs ../../config/addon-modules addon-modules | ||
98 | |||
99 | # Try to make the OS distro directory suited to being read only. | ||
100 | ln -fs ../../caches caches | ||
101 | mv -f ScriptEngines ../../caches | ||
102 | ln -fs ../../caches/ScriptEngines ScriptEngines | ||
103 | # Grumble, OS has it's own silly ideas, and recreates this. | ||
104 | # "Cannot create /opt/opensim/opensim-0.7.1.1-infinitegrid-03/bin/addin-db-001 because a file with the same name already exists." | ||
105 | #ln -fs ../../caches/addin-db-001 addin-db-001 | ||
90 | 106 | ||
91 | cd config-include/ | 107 | cd config-include/ |
108 | # Damn, can't overide these, we could change them for the next IG OS release. | ||
92 | sed -i 's@Include-Storage = "config-include/storage/SQLiteStandalone.ini";@; Include-Storage = "config-include/storage/SQLiteStandalone.ini";@' GridCommon.ini | 109 | sed -i 's@Include-Storage = "config-include/storage/SQLiteStandalone.ini";@; Include-Storage = "config-include/storage/SQLiteStandalone.ini";@' GridCommon.ini |
93 | sed -i 's@; StorageProvider = "OpenSim.Data.MySQL.dll"@StorageProvider = "OpenSim.Data.MySQL.dll"@' GridCommon.ini | 110 | sed -i 's@CacheDirectory = ./assetcache@CacheDirectory = caches/assetcache@' FlotsamCache.ini |
94 | sed -i "s@; ConnectionString = \"Data Source=localhost;Database=opensim;User ID=opensim;Password=\*\*\*\*;\"@ConnectionString = \"Data Source=localhost;Database=opensim;User ID=opensim;Password=$MYSQL_PASSWORD;\"@" GridCommon.ini | ||
95 | |||
96 | cd ../../.. | 111 | cd ../../.. |
97 | 112 | ||
98 | # Setting screen to be suid. EWWWWWW!!! Security hole!! | 113 | # Setting screen to be suid. EWWWWWW!!! Security hole!! |
@@ -105,9 +120,9 @@ then | |||
105 | sudo chown root:utmp /var/run/screen | 120 | sudo chown root:utmp /var/run/screen |
106 | fi | 121 | fi |
107 | 122 | ||
108 | sudo chown -R opensim:opensim /opt/opensim | 123 | sudo chown -R opensim:opensim $OSPATH |
109 | sudo chmod -R a-x /opt/opensim | 124 | sudo chmod -R a-x $OSPATH |
110 | sudo chmod -R a+X /opt/opensim | 125 | sudo chmod -R a+X $OSPATH |
111 | sudo chmod -R g+w /opt/opensim | 126 | sudo chmod -R g+w $OSPATH |
112 | sudo chmod a+x /opt/opensim/setup/start-sim-in-rest | 127 | sudo chmod a+x $OSPATH/setup/start-sim |
113 | 128 | ||
diff --git a/opensim-monit.conf b/opensim-monit.conf index f28c76c..c98ad91 100644 --- a/opensim-monit.conf +++ b/opensim-monit.conf | |||
@@ -20,7 +20,7 @@ | |||
20 | # see ../README for configuration instructions. | 20 | # see ../README for configuration instructions. |
21 | # | 21 | # |
22 | check process sim01 with pidfile /var/run/opensim/sim01.pid | 22 | check process sim01 with pidfile /var/run/opensim/sim01.pid |
23 | start program = "/bin/bash -c 'cd /opt/opensim/config/sim01 && /opt/opensim/sim01/start-sim-in-rest -q'" | 23 | start program = "/bin/bash -c 'cd /opt/opensim/config/sim01 && /opt/opensim/sim01/start-sim -q'" |
24 | as uid opensim and gid opensim | 24 | as uid opensim and gid opensim |
25 | stop program = "/bin/kill -9 `cat /var/run/opensim/sim01.pid`" | 25 | stop program = "/bin/kill -9 `cat /var/run/opensim/sim01.pid`" |
26 | # if cpu usage > 300% for 4 cycles then restart | 26 | # if cpu usage > 300% for 4 cycles then restart |
@@ -44,7 +44,11 @@ else | |||
44 | SUDO="sudo -Hu opensim" | 44 | SUDO="sudo -Hu opensim" |
45 | fi | 45 | fi |
46 | 46 | ||
47 | # Would be nice if this worked. | ||
48 | export MONO_PATH=${bindir} | ||
49 | # Then we would not have to do this, and subsequently write all over the damn bin directory. | ||
47 | cd ${bindir} | 50 | cd ${bindir} |
51 | |||
48 | if [ "x$Screaming" = "xtrue" ] | 52 | if [ "x$Screaming" = "xtrue" ] |
49 | then | 53 | then |
50 | if ($screen_check | grep -q ${console_name}); then | 54 | if ($screen_check | grep -q ${console_name}); then |
@@ -63,7 +67,7 @@ else | |||
63 | fi | 67 | fi |
64 | 68 | ||
65 | inidir=/opt/opensim/config/${tgt} | 69 | inidir=/opt/opensim/config/${tgt} |
66 | cmd="/usr/bin/mono ${exe}.exe -inidirectory=${inidir} -logconfig=${inidir}/${exe}.exe.config $NeedARest" | 70 | cmd="/usr/bin/mono ${bindir}/${exe}.exe -inidirectory=${inidir} -logconfig=${inidir}/${exe}.exe.config $NeedARest" |
67 | title=$(head -n 1 ${inidir}/Regions/sim.ini ) | 71 | title=$(head -n 1 ${inidir}/Regions/sim.ini ) |
68 | 72 | ||
69 | # Check if it's already running. | 73 | # Check if it's already running. |