srcds init-script

  • Ich bin auf der Suche nach einem ordentlichen init-script für srcds (source dedicated server)


    Das ganze sollte

    • die server nicht als root starten
    • sowohl start als auch stoppen können
    • nicht nur einen server unterstützen (kein "killall srcds" zum abschalten eines servers)


    Vorschläge?

  • Da ein Init-Script normal nur "start" und "stop", eventuell auch "restart" für die Faulen, unterstützen soll und somit a priori nicht mehrere Instanzen unterstützt, würde ich für jeden CS:S-Server ein eigenes Init-Script anlegen. Das ist auch deutlich ressourcenschonender, da es keinen Sinn macht, alle Server gleichzeitig den Server lahmlegen zu lassen.


    Was das killall angeht: Entweder, du nutzt pro CS:S-Instanz einen eigenen Benutzer oder läst es "vernünftig" über die PID. Die variable "$!" gibt die PID des letzten BG-Prozesses aus. Musst mal schauen, ob das klappt.

    Mein Server:
    v(olks)Server 1. Serie: 2,5GHz, 1024MB RAM, 1024MB Swap, 2x60GB-Raid1-HDD, Traffic-Flat
    Node:
    78.46.117.9x | hos-tr2.ex3k4.rz7.hetzner.de

  • Zitat von Artimis;25006

    Da ein Init-Script normal nur "start" und "stop", eventuell auch "restart" für die Faulen, unterstützen soll und somit a priori nicht mehrere Instanzen unterstützt, würde ich für jeden CS:S-Server ein eigenes Init-Script anlegen. Das ist auch deutlich ressourcenschonender, da es keinen Sinn macht, alle Server gleichzeitig den Server lahmlegen zu lassen.


    Ich weiß was ein init-Script ist. Viele, die irgendetwas unter dem namen anbieten anscheinend nicht (Such bei Google mal nach init scripten... auauau!)


    Zitat von Artimis;25006

    Was das killall angeht: Entweder, du nutzt pro CS:S-Instanz einen eigenen Benutzer oder läst es "vernünftig" über die PID. Die variable "$!" gibt die PID des letzten BG-Prozesses aus. Musst mal schauen, ob das klappt.


    ich weiß auch, wie ich das im Prinzip handhaben soll, aber aber wie gesagt: Ich bin zu faul mir selbst eins zu schreiben, deswegen habe ich gesucht. Leider tauchten bei der suche auch Skripte von "Spezialisten" auf, die die killall-variante eingesetzt haben.


    Mein Problem:


    Ich wollte das ganze dann doch selbst schreiben.


    Ansatz 1: start-stop-daemon. srcds ist aber kein daemon (läuft immer im vordergrund. dafür gibts --background, allerdings wird's beim killen schwierig. srcds forkt (zumindest bei l4d) einen serverprozess ab. Ich kille ich den, startet srcds eine neue instanz. Kille ich srcds, bleibt der server am leben. Und wenn der server aus irgendeinem grund mal crasht, wird er mit einer neuen pid neu gestartet. Also kann man hier nicht sauber killen.


    Ansatz 2: screen verwenden. Sobald ich aber su oder sudo verwende um screen als der server-user zu starten, bekomm eich Ärger: "Cannot open your terminal '/dev/pts/xx' - please check."


    Nach einiger Bastelei habe ich die Lust verloren und Nackenschmerzen bekommen. deswegen möchte ich mal horchen, wie ihr das so geregelt habt.

  • Zitat von theDude;25004

    Ich bin auf der Suche nach einem ordentlichen init-script für srcds (source dedicated server)


    Das ganze sollte

    • die server nicht als root starten
    • sowohl start als auch stoppen können
    • nicht nur einen server unterstützen (kein "killall srcds" zum abschalten eines servers)


    Vorschläge?


    Eine kurze Google-Suche liefert Treffer dafür auf http://www.srcds.com/ - Das erste gefundene Skript unterstützt mehrere Server, starten und stoppen sowie einen eigenen User für den Server.

    "Security is like an onion - the more you dig in the more you want to cry"

  • Warum nicht einfach die Quick&Dirty-Lösung:


    /etc/init.d/srcds1

    Dieses Script pro srcds-Instanz mit eigenem Benutzer anlegen und glücklich sein.

    Mein Server:
    v(olks)Server 1. Serie: 2,5GHz, 1024MB RAM, 1024MB Swap, 2x60GB-Raid1-HDD, Traffic-Flat
    Node:
    78.46.117.9x | hos-tr2.ex3k4.rz7.hetzner.de

  • Zitat von theDude;25010

    Und das killall ist IMHO auch nicht gerade die feine englische Art.


    Begründung? killall ist halt für die Leute, die sich vergessen haben die PID aufzuschreiben, nicht skripten wollen und sicher sind, es gibt nur 1 'killbaren' Prozeß.

    "Security is like an onion - the more you dig in the more you want to cry"

  • Ich habe auf dem hier diskutierten skript aufgebaut. Leider habe ich bei mir das Problem, dass screen nicht gestartet werden kann (Cannot open your terminal '/dev/pts/1' - please check.)



    Ich habe mir inzwischen ein eigenes script gebastelt, dass zwar mit TF2 klappt, nicht aber mit L4D ?!?


    Nur bei L4D kommt nun das Problem mit dem nicht verfügbaren/lesbaren Terminal.



    Was für mich gegen killall spricht: Wenn ich dann z.B. mal per Hand einen Server im jeweiligen Benutzer starten wollte, würde der auch mit gekillt. Und für jeden Server ein Benutzer - das ist mir zu umständlich gelöst.

  • Zitat von theDude;25012

    Ich habe auf dem hier diskutierten skript aufgebaut. Leider habe ich bei mir das Problem, dass screen nicht gestartet werden kann (Cannot open your terminal '/dev/pts/1' - please check.)


    :confused:


    Das Skript schreibt sich die pid auf => Also braucht es kein killall
    Das Skript schreibt sich die pid auf => Also braucht es kein screen

    "Security is like an onion - the more you dig in the more you want to cry"

  • Stimmt. Killall ist nicht wirklich der Bringer. Aber es mit Screen zu machen, ist m.M.n. der GAU.


    Davon ab: Was ist an zwei Benutzern statt einem für den CS:S-Server unübersichtlich oder unschön?
    Mehr Instanzen kannst du sowieso nicht auf einem vServer mit geteilten Ressourcen ausführen.


    vmk: ich zitiere aus dem Code:

    Code
    sudo -u srcds [B]/usr/bin/screen[/B] -A -d -m -S $NAME $STEAM/$DAEMON  $OPTS

    Mein Server:
    v(olks)Server 1. Serie: 2,5GHz, 1024MB RAM, 1024MB Swap, 2x60GB-Raid1-HDD, Traffic-Flat
    Node:
    78.46.117.9x | hos-tr2.ex3k4.rz7.hetzner.de

  • Naja, nicht ganz: Das Skript startet eine screen-sitzung, fischt sich die PID dieser sitzung aus der ausgabe von PS und nutzt diese PID später zum killen.



    Finde ich sehr Unschön (neben einigen anderen sachen). Ich gebe der Sitzung einen Namen. Beim Abschießen selektiere ich die Sitzung über den Namen sende dann einen quit-Befehl.


    Und ich habe noch immer Probleme mit screen unter bestimmten Bedingungen. Aber da muss ich erstmal gucken, ob ich den Fehler nicht selbst hervorrufe. Für TF2 klappts ja soweit.

  • Zitat von Artimis;25014

    Aber es mit Screen zu machen, ist m.M.n. der GAU.


    Begründung?


    Ich nehme halt screen, weil es nichts bringt nur den ursprünglichen srcds abzuschießen (der forkt ja den eigentlichen Serverprozess) oder nur den Serverprozess zu killen (der wird von parent-srcds neu gestartet).


    Beides zu killen kann auch in die Hose gehen; wenn der Serverprozess irgendwann mal gecrasht war und neu gestartet wurde, hat er dabei auch eine neue PID erhalten. Davon weiß ich dann aber nichts.


    Hängt alles unter screen und kille ich screen, dann sterben beide Prozesse.

  • Nun, wenn du die PID nicht für zuverlässig hälst, wie gesagt:
    Du kannst MAXIMAL 2 Server-Instanzen starten, ohne Ressourcen anderer mitzunutzen. Also lege zwei Benutzer an und starte jede Instanz unter einem eigenen Benutzer.
    Und um das ganze zu beenden, machst du das erst sanft per killall, dann hart mit demselben. Was geht da drüber?
    Ganz gewiss nicht, ein Terminal mit Screen zu emulieren und die Prozesse grundsätzlich zu killen...

    Mein Server:
    v(olks)Server 1. Serie: 2,5GHz, 1024MB RAM, 1024MB Swap, 2x60GB-Raid1-HDD, Traffic-Flat
    Node:
    78.46.117.9x | hos-tr2.ex3k4.rz7.hetzner.de

  • Zitat von Artimis;25017

    Du kannst MAXIMAL 2 Server-Instanzen starten, ohne Ressourcen anderer mitzunutzen.


    Konkret geht es dabei um CPU, RAM, Festplatte?

    "Security is like an onion - the more you dig in the more you want to cry"

  • Zitat

    Konkret geht es dabei um CPU, RAM, Festplatte?

    Jo, so in etwa...
    Ich verweise an der Stelle gerne auf ein paar andere Threads der letzten Wochen...

    Mein Server:
    v(olks)Server 1. Serie: 2,5GHz, 1024MB RAM, 1024MB Swap, 2x60GB-Raid1-HDD, Traffic-Flat
    Node:
    78.46.117.9x | hos-tr2.ex3k4.rz7.hetzner.de

  • Zitat von Artimis;25019

    Jo, so in etwa...
    Ich verweise an der Stelle gerne auf ein paar andere Threads der letzten Wochen...


    Ok, ich bin raus. Habe nicht jeden Thread der letzten Wochen aufgerufen oder weiter als bis zum Startposting gelesen.

    "Security is like an onion - the more you dig in the more you want to cry"

  • So, ich hab's mir jetzt selbst zusammengebastelt.


    srcds_run wird über start-stop-daemon gestartet. s-s-d fischt mir die PID raus und verwendet sie auch später wieder zum abschießen.


    Zusätzlich speichert srcds_i486/srcds_linux für jeden geforkten Server die PID weg. Diese wird dann für ein manuelles kill benutzt.


    Das ist IMHO noch die schönste und sauberste Variante. Am besten wäre es natürlich, wenn srcds_run selbst dafür sorgt, dass alle untergeordneten Prozesse mitgekillt werden.


    Immerhin: Kein screen, ich brauche nur einen Benutzer für alle scrds-Server und der aufwand für einen neuen Server beschränkt sich auf das Kopieren und anpassen des init-scripts bzw der default-datei.

  • Ich hab mir auch mal ein Script selbst geschrieben, aber mit screen. Ich finde screen ist grade bei Source Servern praktisch, weil man so immer direkt auf dem Server in die Konsole kann und sich so Rcon spart. So kann man auch die Logs live mitlesen falls man mal einen Fehler sucht. Mir sind keine negativen Auswirkungen von screen bekannt und ich hab auch keine Probleme damit. Mein Script betreibe ich mit CSS, TF2 und L4D Servern und ich hatte noch nie Probleme.

    Neun von zehn stimmen in meinem Kopf sagen ich bin nicht verrückt, die zehnte summt die Melodie von Tetris.

  • Hiho!


    Ich hatte auch mal ein Script, für verschiene Gameserver (insbesondere CoD2, Cod4, CoD:WaW). Es war zwar kein START/STOP/RESTART Script. Soweit ich noch weiss wurde das script alle 5 Mins via crontab ausgeführt, um zu überprüfen, ob der jeweilige Server noch "online" ist.
    Hierzu wurde beispielsweise für CoD4 Server das jeweilige Startscript (bei CoD4: ./cod4_lnxded) und der jeweilige Gameserverport (Standard CoD: 28960) via ps auxw | grep cod4_lnxded | grep 28960 .... überwacht.
    War der jeweilige Server off wurde er innerhalb des contabs über das Script neugestartet.


    Der Server konnte dann einfach via Gameconsole oder RCON gequitted werden und startet automatisch neu.


    Falls interesse besteht kann ich nochmal meine Sicherungen nach dem Script durchsuchen. Ich hatte es damals für 5 Gameserver laufen.


    Grüße


    Thosch

  • stachi: Kannst du mir das Skript mal zukommen lassen oder hier posten? Vielleicht kann ich ja etwas davon gebrauchen?


    thosch: Danke für das Angebot. Ich möchte suche aber ein (möglichst) waschechtes init-script.


    Falls jemand Interesse an meinem Ansatz hat einfach melden.