ubuntuusers.de

Screen Script

Status: Gelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

Marvi_biene

Anmeldungsdatum:
14. Januar 2019

Beiträge: 4

Hallo,

ich versuche seit längeren mithilfe von Screen GameServer zu starten, welche im Hintergrund laufen können. Leider konnte ich bis jetzt kein funktionierenden Befehl zusammenbauen/herausfinden. Hier eine Liste mit allem, was ich versucht habe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
1. 
screen -dm -S Server1
screen -S Server1 -X stuff 'bash /server/start.sh'
2.
screen -S Server1 -X screen 'bash /server/start.sh'
3.
screen -dmS Server1 -X stuff 'bash /server/start.sh'
4.
screen -dmS Server1 'bash /server/start.sh'
5.
screen -d -m -S Server1 bash -c 'bash /server/start.sh'

Ich habe bei vielen gelesen, dass es bei ihnen Funktioniert hat, kann aber jedoch keinen Erfolg bei mir feststellen. Vielleicht könnt ihr ja den Fehler finden.

Mit freundlichen grüßen

Marvi

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2503

Ahoi,

warum in Screen? Hast du einen echten Grund dafür oder möchtest du das so machen, weil es an vielen Stellen erwähnt wird?

Eigentlich ist Screen nicht das richtige Werkzeug dafür, es kann nur zufällig auch Dinge vom Terminal entkoppeln und „im Hintergrund“ weiterlaufen lassen. In Sonderfällen kann es mit Screen einfacher sein, oft musst du aber noch Dinge drumherum bauen, die es dann doch wieder komplizierter machen. Wir könnten versuchen, dein Problem mit Screen zu debuggen, würde ich aber ungerne tun, falls du nicht tatsächlich einen spezifischen Grund hast, das so zu lösen.

Eigentlich will man für solche Zwecke das Init-System benutzen. Heutzutage wäre das dann systemd. Hier gibt es was zu lesen:

Kurz, du könntest eine Datei namens /etc/systemd/system/mein-gameserver.service anlegen mit folgendem Inhalt:

[Unit]
Description=Mein Gameserver

[Service]
User=deinuser
ExecStart=/server/start.sh

[Install]
WantedBy=multi-user.target

Dann kannst du ihn mit systemctl start mein-gameserver starten (oder stoppen oder beim Systemstart automatisch starten lassen …). An die Logs kommst du über journalctl -u mein-gameserver.

Marvi_biene

(Themenstarter)

Anmeldungsdatum:
14. Januar 2019

Beiträge: 4

Hi,

Grundsätzlich ist Init ja nicht falsch, dennoch möchte ich noch auf die Console zugreifen können und dort noch Befehle eingeben können.

Ich wollte es deswegen im Screen machen, da man dort dann schnell in die jeweiligen Consolen rein kommt und dort je nach dem Befehle eingeben kann.

Mit freundlichen grüßen

Marvi

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2503

Okay,

screen -d -m vim

sieht als Ansatz schonmal nicht schlecht aus. Obacht, zumindest mein Screen interpretiert -d -m und -dm unterschiedlich (-dm verweigerte das Ausführen des angegebenen Programms). Schau’ mal, ob nach dem Absetzen dieses Befehls dann mit

screen -ls

eine Session gelistet wird.

Wenn nur genau eine Session läuft, kannst du dich testweise mit

screen -x

attachen. Detachen dann mit Strg+A, D.

Geht das mit diesen einfachen Beispielen erstmal? Falls ja, bekommst du mit den von dir geposteten Varianten Fehlermeldungen?

Du kannst es auch mal mit

screen -d -m -L vim

probieren, das erzeugt dann eine Logfile, die du betrachten kannst und die vielleicht Fehlermeldungen enthält.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Bei mir hat seinerzeit ein

screen -dmS SessionName ./programm -optionen

funktioniert.

Befehle senden mit

screen -d -R SessionName -p 0 -X eval 'stuff "ls -lha"\015';

Vielleicht funktioniert das noch.

Marvi_biene

(Themenstarter)

Anmeldungsdatum:
14. Januar 2019

Beiträge: 4

Hi,

Deine Befehle scheinen erstmal zu funktionieren. Dennoch habe ich testweise mal "vim" durch das startscript ausgetauscht. Jedoch sind dann keine Screens aufgetaucht. Durch die Screenlogs konnte ich aber sehen, das dort etwas passiert war. Und tadaa, die Daten im Script konnten nicht gefunden werden, da sich das Verzeichnis durch den Screen start verändert hat. Nun muss ich jedes Script anpassen, und es sollte klappen.

Trotzdem irgendwie doof, dass mich ein so einfacher Fehler so rausgehauen hat. Da das Script ja in der "Normalen" Konsole funktioniert hat, dachte ich, dass es am Screen befehl lag und nicht im Script.

Vielen dank für deine Hilfe!

Mit freundlichen grüßen

Marvi

Marvi_biene

(Themenstarter)

Anmeldungsdatum:
14. Januar 2019

Beiträge: 4

ChickenLipsRfun2eat schrieb:

Hallo!

Bei mir hat seinerzeit ein

screen -dmS SessionName ./programm -optionen

funktioniert.

Befehle senden mit

screen -d -R SessionName -p 0 -X eval 'stuff "ls -lha"\015';

Vielleicht funktioniert das noch.

Hi,

deins hatte ich auch ausprobiert, dies hat bei mir jedoch gar nicht funktioniert. Es erschien nichtmal eine Screensession.

Mit freundlichen grüßen Marvi

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Das kommt auch etwas darauf an, was darin läuft. Wenn das Programm beendet wird, schliesst sich die Screen-Session automatisch. Da hat man dann natürlich auch keinen Zugriff drauf.

Beispiel:

#simple Schleife als Ersattz für ein Script
screen -dmS SessionName sh -c 'for i in {1..100}; do echo "[$i]running..."; sleep 1; done;'

#Zugriff mit
screen -r #resume
#Verlassen mit Strg-A-D

#Testeintrag in den Screen senden:
screen -d -R SessionName -p 0 -X eval 'stuff "Ausgabe im Screen"\015';

Das \015 bewirkt nur einen Zeilenumbruch. Während die Schleife läuft, kann man in die Session wechseln und wieder rausgehen. Nach Ablauf der Schleife beendet sich das "Programm" und auch der Screen mit dem es aufgerufen wurde.

Das sh -c 'Befehl' kann natürlich auch durch ein ./myScript.sh ersetzt werden.

Antworten |