[gelöst] Problem beim Autostart von Scripte

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
Bloodrayne
Beiträge: 12
Registriert: 06.04.2007 15:24:23

[gelöst] Problem beim Autostart von Scripte

Beitrag von Bloodrayne » 24.08.2017 15:53:44

Hallo liebe Forumgemeinde,
ich bin schon fast am verzweifeln,
ich hab ein frischen Server mit Debian Stretch installiert, vorher mit Debian Jessie lief alles super bis die Festplatte den Geist aufgegeben hat.

Nun zu meinem Problem,
ich hab verschiedene Scripte die mir Spiele Server etc starten meist scripte die mir den Server in nem Screen starten
ich hatte die Scripte immer in crontab mit @reboot user pfad zum Script
gestartet war super da ich mit dem systemd und mit rc.d bei den Scripten immer keinen Erfolg hatte

jedoch werden @reboot einträge im Cron nicht bearbeitet wieso auch immer,
ich habs mit systemd erneut versucht,
Datei in etc/systems/system erstellt namens rokh.service

Code: Alles auswählen

[Unit]
Description=Rokh Server
After=network.target

[Service]
ExecStart=/home/server/rokhstart.sh
User=server
Type=oneshot

[Install]
WantedBy=multi-user.target
anschließens folgendes eingegeben

Code: Alles auswählen

systemctl enable rokh.service
systemctl start rokh.service
sollte eigentlich funktionieren, tut es aber nicht, es sollten 2 screen consolen im Benutzer Server offen sein, sind es aber nicht

mit

Code: Alles auswählen

journalctl -u rokh.service
wird mir angezeigt dass alles läuft, tut er aber nicht

mit rc.d hab ich es versucht, neues script erstellt in /etc/init.d namens rokh

Code: Alles auswählen

#!/bin/sh
# Rokh Server Script
### BEGIN INIT INFO
# Provides:		rokh
# Required-Start:	
# Required-Stop:	
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	RokhServer
# Description:		Roikh Server
### END INIT INFO

NAME="rokh"
USER="server"

# Diese Methode startet den Rokh Server
start_rokh ()
{
su $USER -c "/home/server/rokhstart.sh"
}

# Diese Methode stoppt den Rokh Server
stop_rokh ()
{
su $USER -c "/home/server/rokhdown.sh"
}

# Diese Methode restartet den Rokh Server
restart_rokh ()
{
su $USER -c "/home/server/rokhdown.sh"
su $USER -c "/home/server/rokhstart.sh"
}

# Befehlszeile für start | stop | restart
case "$1" in
start)
echo "[SCRIPT] $1: $NAME"
start_rokh
;;
stop)
echo "[SCRIPT] $1: $NAME"
stop_rokh
;;
restart)
echo "Restating §NAME"
restart_rokh
;;
*)
"$0" stop
exit 1
;;
esac
exit 0
dann noch mit S99 ausgestattet dass es als letztes gestartet wird aber server läuft nicht
starte ich die scripte manuell läuft der server richtig ohne probleme,
ich weis nicht mehr weiter
meine Linuxkenntnisse sind nicht besonders gut, ich kam binher immer an mein Ziel aber diesmal bin ich am verzweifeln
hoffe mir kann jemand helfen und evtl ein beispiel geben wie ich die scripte automatisch unter stretch starten kann

danke schonmal
bb
Zuletzt geändert von Bloodrayne am 25.08.2017 14:09:04, insgesamt 2-mal geändert.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Problem beim Autostart von Scripte

Beitrag von scientific » 25.08.2017 05:31:48

Bloodrayne hat geschrieben:anschließens folgendes eingegeben

Code: Alles auswählen

systemctl enable rokh.service
systemctl start rokh.service

sollte eigentlich funktionieren, tut es aber nicht, es sollten 2 screen consolen im Benutzer Server offen sein, sind es aber nicht

mit

Code: Alles auswählen

journalctl -u rokh.service
wird mir angezeigt dass alles läuft, tut er aber nicht
Was konkret meinst du damit, dass "2 screen consolen im BenutzerServer" offen sein sollten?

Hast du mehrere Bildschirme? Einer davon hat Terminals zur Kontrolle deines/deiner verschiedenen Server, am anderen Bildschirm spielst du?
Als welcher User soll der Spieleserver laufen? (User=server... also ein Systemweiter Dienst, der unabhängig vom momentan eingeloggten User läuft)
Als welcher User sollen die Kontroll-Terminals laufen? (Ich nehme an, du bist nicht als User "server" graphisch eingeloggt)
Die Kontroll-Terminals brauchst du nur, wenn du eingeloggt bist?
Den Server brauchst du eigentlich auch nur, wenn du eingeloggt bist?
Welches Desktop-Environment verwendest du?
Was steht in den beiden Skripten
/home/server/rokhdown.sh
/home/server/rokhstart.sh

Ein paar Infos sind schon noch notwendig, sonst ist alles nur Glaskugel-Magie... Ich kenne das Spiel nicht, und ich kenne dein Setup und deine Gewohnheiten nicht.
Btw, Wenn du ein Init-Skript nach init.d legst, macht systemd daraus auch wiederum eine Unit. Dann lieber gleich eine ordentliche Unit bauen.
Und wenn du im Init-Skript mit "su -c ..." deine Skripte aufrufst, wird über pam.d mit su eine Session für den User "server" erzeugt. Da werden xdg-userdirs angelegt, Eine systemd --user Session wird gestartet usw. usf. Das kann sehr unschöne Effekte hervorrufen und bis zum Verweigern des Starts des Servers und weiterer Boot-Probleme reichen.
"runuser" wäre hier der wesentlich bessere Befehl. Den gibts zwar schon sehr lange, ist aber sehr unbekannt...

ch schieße mal ins Blaue:

Der Spiele-Server startet unabhängig vom eingeloggten User. Man könnte damit z.B. auch im LAN von einem anderen Rechner auf den Spieleserver zugreifen und spielen.
Die Steuerungskonsolen (Terminals) startet der eingeloggte User im Multi-Bildschirmsetup auf dem zweiten Schirm.

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Bloodrayne
Beiträge: 12
Registriert: 06.04.2007 15:24:23

Re: Problem beim Autostart von Scripte

Beitrag von Bloodrayne » 25.08.2017 10:02:20

Hallo, danke schonmal für die Antwort,
ich merk schon, ich hab einige Infos vergessen zu machen :) aber dafür sind wir ja hier

nun es ist ein stink normaler Linux Server ohne grafische Oberfläche mit nur einem Monitor und der wird nicht benutzt weil ich mich mit putty per ssh connecte. Es wird mit dem befehl screen ein ich vermute virtueller Bildschirm geschaffen in dem man sich mit dem befehl screen -r einlogen kann und live schauen kann was da grad der dedicated server anstellt man kan auch serverbefehle eingeben. wenn alle server laufen sind 6 screen sessions aktiv alle unter dem ein und selben benutzer namens server

ok jetzt wird es länger denn die einen scripte starten die nächsten scripte (wie gesagt mit jessie hat es tadellos funktioniert und starte ich die scripte manuell geht auch alles tadellos so wie es sein soll, nur automatisch starten zu lassen geht nicht seit ich auf stretch umgestiegen bin
rokhstart.sh <--führt 3 befehle aus, 2 befehle starteten eine screen session eine für die datenbank mit mariadb und die andere für den server der 3. befehl zeigt nur an ob der server läuft

Code: Alles auswählen

#!/bin/sh
cd /steam/rokh/LinuxServer/
echo "Starte Rokh Datenbank";
./start_database.sh 14004
echo "Starte Rokh Server";
sleep 3
./start_server.sh 14004
echo "Server gestartet";
./list_servers.sh
die 14004 ist notwendig das ist der mariaDB port
diese scripte sind die vom spiele server selbst

start_database.sh

Code: Alles auswählen

#!/bin/bash

# start_database.sh - Start a server with a specific id

##### Constant

infofile=./.rokhservers/servers.info
passwd=bM8BSfhqeUsPSKsg
mysql_base_port=14002
mysql_base_socket=/tmp/rokh_mysql

db_path=./Database/mariadb-10.1.11-linux-x86_64
data_base_path="$db_path/data"

##### get arguments

if [ $# -ne 1 ]; then
    echo "$0: usage: start_database.sh <server id>"
    exit 1
fi


# we use the port number for the db identifier as well
name=$1
mysql_port=$1
server_id=$1

if [ ! -f "$infofile" ];
then
   echo "ERROR: File $infofile does not exist." >&2
   echo "Make sure you create the game server first using the 'create_server.sh' script." >&2
   exit -1
fi

function check_running
{
   local id_to_check=$2
   local id="$(echo $1 | cut -f1 -d'.')"
   server_name="$(echo $1 | cut -f2 -d'.')"

   if [ "$id_to_check" == "$id" ]; then
      echo "Server '$server_name' ($id) is already running."
      exit 1
   fi
   exit 0
}  

# check if database is already running, this function will exit the script if the server is running
echo Checking running instances...

while read data
do
    out=$(check_running "$data" $server_id)
    res=$?
    if [ "$res" -eq 1 ]; then
      echo "Server already running ($server_id), exiting."
      exit 0
    fi
done < <(screen -ls | grep rokh_database)

runninginstances=$(screen -ls | grep rokh_database-$server_id)

if [[ -n "${runninginstances/[ ]*\n/}" ]]
then
    echo "DB Already running!"
    exit -1
fi

echo Ok.
echo Starting Rokh Database server with id $server_id...


mysql_socket=$mysql_base_socket-$name.sock
db_data_path="$data_base_path/$name"

echo "Starting up mysqld instance '$name' on port $mysql_port."
echo "Database directory: $db_path"
echo "Data directory: $db_data_path"
echo "Port: $mysql_port"
echo "Socket file: $mysql_socket"

if [ ! -d "$db_data_path" ]; then
  # data path already exists, bailing out
  echo "Data directory: $db_data_path does not exists! Database ID is invalid."
  exit -1
fi

cd "${0%/*}"

# starting database...

# Returns true once mysql can connect.
# Thanks to http://askubuntu.com/questions/697798/shell-script-how-to-run-script-after-mysql-is-ready
 mysql_ready() {
        $db_path/bin/mysqladmin ping --user=root --port=$mysql_port --socket=$mysql_socket > /dev/null 2>&1
}


#  -d starts a screen session and immediately detaches from it
#  -m forces creating a new screen session
#  -S lets you give the session a name
#  -L turns on logging to ~/screenlog.0

echo "Starting database ..."
#echo "screen -dmS rokh_database-$name $db_path/bin/mysqld --no-defaults --user=root --basedir=$db_path  --datadir=$db_data_path --port=$mysql_port --socket=$mysql_socket"
screen -dmS rokh_database-$name $db_path/bin/mysqld --no-defaults --user=root --basedir=$db_path  --datadir=$db_data_path --port=$mysql_port --socket=$mysql_socket

while !(mysql_ready)
do
 echo "Waiting for database..."
 sleep 3
done
        
echo "Database Started!"



start_server.sh

Code: Alles auswählen

#!/bin/bash

# start_server.sh - Start a server with a specific id

##### Constant

infofile=./.rokhservers/servers.info


##### get arguments

if [ $# -ne 1 ]; then
    echo "$0: usage: start_server.sh <server id>"
    exit 1
fi

server_id=$1

if [ ! -f "$infofile" ];
then
   echo "ERROR: File $infofile does not exist." >&2
   echo "Make sure you create the game server first using the 'create_server.sh' script." >&2
   exit -1
fi

function check_running
{
   local id_to_check=$2
   local id="$(echo $1 | cut -f1 -d'.')"
   server_name="$(echo $1 | cut -f2 -d'.')"

   if [ "$id_to_check" == "$id" ]; then
      echo "Server '$server_name' ($id) is already running."
      exit 1
   fi
   exit 0
}  

function start_params
{
   local id_to_check=$2
   local server_name="$(echo $1 | cut -f1 -d'|')"
   local server_map="$(echo $1 | cut -f3 -d'|')"
   local server_params="$(echo $1 | cut -f4 -d'|')"
   id="$(echo $1 | cut -f2 -d'|')"

   if [ "$id_to_check" == "$id" ]; then
      echo "$server_map $server_params"
      exit 1
   fi
   exit 0
}  

# check if server is already running, this function will exit the script if the server is running
echo Checking running instances...

while read data
do
    out=$(check_running "$data" $server_id)
    res=$?
    if [ "$res" -eq 1 ]; then
      echo "Server already running ($server_id), exiting."
      exit 0
    fi
done < <(screen -ls | grep rokh_server)

echo Ok.
echo Starting Rokh dedicated server with id $server_id...

# this will get the launch parameters from the server.info file and launch the game server with those.

while read data
do
    out=$(start_params "$data" $server_id)
    res=$?
    start_arguments=$out
    if [ "$res" -eq 1 ]; then
      echo "Launching external process..."
      screen -dmS rokh_server-$server_id Rokh/Binaries/Linux/RokhServer $start_arguments -log
    fi
done < <(cat $infofile)

echo Done ! 

exit
mein erstelltes script zum beenden sieht so aus, das gleiche schema wie beim starten, es werden die scripte vom server ausgeführt
rokhdown.sh

Code: Alles auswählen

cd /steam/rokh/LinuxServer/
echo "Stoppe Rokh Datenbank";
./stop_database.sh 14004
echo "Stoppe Rokh Server";
sleep 3
./stop_server.sh 14004
echo "Server gestoppt";
sleep 2
./list_servers.sh
ein anderer server Conan Exiles ist ebenso ein dedicated server der mit wine2.02 ausgeführt wird
conanstart.sh

Code: Alles auswählen

#!/bin/sh
export WINEARCH=win64
export WINEPREFIX=/home/server/.wine64
screen -A -m -d -S conan /home/wine2.0/wine64 /steam/conan/ConanSandboxServer.exe -log -ServerName="[NwG][GER]Exil der Todesbringer[Entspannt]+XP+Harvest" -GameServerPort=27015 -GameServerQueryPort=27016 -AdminPassword=XxXxXxXx  -MaxPlayers=35 -HarvestAmountMultiplier=10.000000 -PlayerXPHarvestMultiplier=3 -MaxNudity=Full
conandown.sh

Code: Alles auswählen

#!/bin/bash
echo "Conan Exiles Server wired beendet"
screen -S conan -X quit
und demnach wenn ich eingebe

Code: Alles auswählen

screen -ls
werden mir die offenen screen angezeigt
so soll es aussehen wenn ich mich als server einlogge und den befehl eingebe

Code: Alles auswählen

server@Server:~$ screen -ls
There are screens on:
        1389.conan      (24.08.2017 18:42:49)   (Detached)
        956.rokh_server-14004   (24.08.2017 18:25:13)   (Detached)
        901.rokh_database-14004 (24.08.2017 18:25:07)   (Detached)
3 Sockets in /run/screen/S-server.
server@Server:~$
beim manuellen start siehts so aus bei meinen autostart versuchen alles vergebens kein einziger ist gestartet

ich hoffe die informationen waren aufschlussreicher wenn ich noch irgendwelche infos widerlegen soll bitte einfach sagen, dann versuch ich alle weiteren infos zu posten

vielen Dank schonmal
PS: ich denke es ist wider irgend so ne sicherheits sache von Stretch was einfach verhindert dass scripte die andere scripte starten unterbindet

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Problem beim Autostart von Scripte

Beitrag von scientific » 25.08.2017 10:50:26

Vielen Dank.

Da hat mit den Codetags noch etwas nicht geklappt...

Ich werd mich vermutlich eh erst heut Abend näher damit befassen können.
Kannst du das bitte bis dahin noch fixen?

Schaut ganz danach aus, als ob du diese Skripte durch relativ einfache systemd-Units ersetzen kannst.

Vielleicht hat ja in der Zwischenzeit jemand anders die Muse...

Lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Dogge
Beiträge: 1895
Registriert: 13.09.2010 11:07:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Problem beim Autostart von Scripte

Beitrag von Dogge » 25.08.2017 11:43:55

Code: Alles auswählen

cd /steam/rokh/LinuxServer/
Sicher, dass das nicht /home/$USER/steam ist?
Im Wurzelverzeichnis liegt sowas üblicherweise nicht rum.
Debian Testing + Gnome | Linux-Anfänger seit 04/2003
http://files.mdosch.de/2014-07/0xE13D657D.asc

Benutzeravatar
Bloodrayne
Beiträge: 12
Registriert: 06.04.2007 15:24:23

Re: Problem beim Autostart von Scripte

Beitrag von Bloodrayne » 25.08.2017 14:08:20

huhu, ist alles correkt :)
Sicher, dass das nicht /home/$USER/steam ist?
Im Wurzelverzeichnis liegt sowas üblicherweise nicht rum.
steam ist im wurzekverzeichnis ja, es ist eine eigenständeie SSD festplatte die als steam gemeounted wurde, /steam hat ausschließlich berechtigungen für den user server

JAAAAAAAA weitere Stunden googeln hat mich zum Ziel geführt :)

Ich danke euch schonmal vielmals für eure Bisherige Hilfe :)
hier meine vorigen systemd daten wie diese vorher waren zum beseren vergleich
rokh.service (alt)

Code: Alles auswählen

[Unit]
Description=Rokh Server
After=network.target

[Service]
ExecStart=/home/server/rokhstart.sh
User=server
Type=oneshot

[Install]
WantedBy=multi-user.target
rokh.service (neu)

Code: Alles auswählen

[Unit]
Description=Rokh Server
After=network.target audit.service

[Service]
ExecStart=/home/server/rokhstart.sh
ExecStop=/home/server/rokhdown.sh
User=server
Group=server
Type=oneshot
RemainAfterExit=yes
KillMode=none

[Install]
WantedBy=multi-user.target
diese 3 ergänzungen haben das Problem gelöst

Code: Alles auswählen

Group=server
RemainAfterExit=yes
KillMode=none
das gleiche hat auch bei conan.service abhilfe geschafft
sollte ich hier irgendwo einen bedenklichen Fehler oder unnötigen Code verwendet haben bitte bescheid geben

ich danke euch nochmals :) ich werde glaub noch ein 2. posting eröffnen da ich noch ein anderes Problem habe aber evtl finde ich auch da die lösung ^^

ByeBye

Antworten