Screen schließt Shell

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Skillkiller
Beiträge: 30
Registriert: 27.07.2016 12:49:05
Lizenz eigener Beiträge: MIT Lizenz

Screen schließt Shell

Beitrag von Skillkiller » 18.03.2018 00:25:23

Hallo
ich habe einen Screen und in ihm ist eine while true Schleife damit der Java Prozess immer wieder gestartet wird, jetzt gehe ich in diesen Screen rein und sende "^C". Bisher wurde dann immer der Prozess beendet und die Schleife ging in einen 10 sekündigen Countdown, nur jetzt sagt mir Screen

Code: Alles auswählen

^C
Session terminated, terminating shell...
und ich habe keine Möglichkeit mehr irgendwas in diesem Screen zu machen. Wenn ich den Screen jetzt aber mit

Code: Alles auswählen

screen -S NAME -X quit
beende läuft der Prozess immer noch und auch nach einem Abschuss mit kill startet er wieder. Und ich habe keine Möglichkeit mehr diese Schleife zu unterbinden

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Screen schließt Shell

Beitrag von uname » 18.03.2018 08:12:34

Ich denke while in Screen ist keine tolle Idee. Vielleicht kann mal jemand eine Systemd-Implementierung posten.

TomL

Re: Screen schließt Shell

Beitrag von TomL » 18.03.2018 11:29:56

Da scheint imho ein grundsätzlicher Design-Fehler vorzuliegen... wobei die While-Schleife imho nicht da Problem ist, es liegt vermutlich an der Nachricht, mit der die While-Schleife beendet wird. CTRL-C wirkt sich ja auf den aktuellen Vordergrund-Prozess aus... da stellt sich die Frage, ob Screen der Vordergrundprozess ist oder doch das in Screen laufende Programm? Nach Deiner Fehlerbeschreibung müsste Screen der Vordergrundprozess sein... was mir allerdings merkwürdig vorkommt.

Kannst Du das Script und die gesamte Implementierung mal posten...?... so denke ich, kann man da kaum sagen, welcher Lösungsansatz der richtige ist.

Skillkiller
Beiträge: 30
Registriert: 27.07.2016 12:49:05
Lizenz eigener Beiträge: MIT Lizenz

Re: Screen schließt Shell

Beitrag von Skillkiller » 19.03.2018 20:27:35

Es wird folgender Befehl ausgeführt:

Code: Alles auswählen

screen -dmS [NAME] su -c "bash -c 'while true; do java -jar "Datei.jar"; done;'" [Anderer Benutzer]
Es kann sein das hier jetzt nicht alle " Zeichen richtig sind und sie sind auch nicht escaped. Der Befehel wird von einem Java ProcessBuilder in einem Prozess ausgefürt. Der Befehl stammt nicht direkt von mir aber ich brauche einen Befehl der auf jeden Debian OS problemlos läuft und deshalb wird der Screen auch als Root gestartet und wechselt dann erst den Benutzer.

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Screen schließt Shell

Beitrag von uname » 20.03.2018 09:56:34

Ich habe das Problem mal nachgestellt. Damit auch andere Forenteilnehmer damit arbeiten können, habe ich "top" verwendet, welches wohl ähnlich wie dein Java funktioniert.

Aufruf user1 (root) mit Zielbenutzer user2. Es mag sein, dass es mit user1 != root anders reagiert.

Code: Alles auswählen

screen -dmS Test su -c "bash -c 'while true;do top;done'" user2

Code: Alles auswählen

pstree  -p|fgrep top
|-screen(126753)---su(126754)---bash(126755)---top(126756)
Mit ps, Debianlsof oder auch /proc/<pid> kann man sich einige Details anschauen.

Code: Alles auswählen

1.) user1, 126753, SCREEN -dmS Test su -c bash -c 'while true;do top;done' user2
2.) user1, 126754, su -c bash -c 'while true;do top;done' user2
3.) user2, 126755, bash -c while true;do top;done
4.) user2, 126756, top
Interessant ist nun, dass mit "screen -S Test -X quit" nur 1.) und 4.), jedoch nicht 2.) und 3.) beendet werden.

Prozess 2.) wird vom Vater SCREEN (126753) auf PID 1 umgehangen und läuft weiter.
Prozess 3.) läuft auch weiter, jedoch ohne erneut top auszuführen.

Es scheint so, dass mit "quit" der Kindsprozess 4.) korrekt beendet wird. Das führt aber nicht zum Beenden des darüber liegenden Vaterprozesses 3.) (vielleicht wegen while).
Screen scheint das egal zu sein. 1.) wird beendet, 2.) wird auf PID 1 umgehangen und 3.) hängt weiterhin an 2.) . Der Prozess 2.) verliert sein Pseudoterminal pts/xxx und wechselt den Status von Ss+ zu Ss (ohne + nicht mehr in "foreground process group"), was wahrscheinlich nur mit dem Pseudoterminal von Screen zusammenhängt.

Leider habe ich keine Erklärung für das Verhalten.

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

Re: Screen schließt Shell

Beitrag von scientific » 20.03.2018 13:50:58

Ich versteh es nicht ganz... Du willst einen Prozess haben, der im Hintergrund läuft und restartet wird, sobald er sich beendet (aus welchem Grund auch immer)?
Der Prozess soll als User, nicht als Root laufen.

Und der Prozess soll weiterlaufen, auch wenn du dich ausloggst?

Das wäre ein klassicher Fall für eine systemd --system Unit.

Wenn du diesen Prozess nur benötigst, solange du eingeloggt bist, dann wäre das ein Fall für systemd --user

Du willst das auch auf Systemen laufen lassen, die kein systemd haben?

Oder verstehe ich da etwas ganz falsch? Wozu verwendest du in diesem Kontext screen? Damit der Prozess im Hintergrund läuft, und du bei Bedarf die Ausgaben des Programmes lesen kannst?

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

Skillkiller
Beiträge: 30
Registriert: 27.07.2016 12:49:05
Lizenz eigener Beiträge: MIT Lizenz

Re: Screen schließt Shell

Beitrag von Skillkiller » 23.03.2018 20:42:32

Richtig, ich möchte einen Prozess im Hintergrund laufen lassen aber diese soll als ein bestimmter Nutzer ausgeführt werden. Nur die Laufenden Prozesse sollen von einem Java Tool verwaltet werden können.
Bei mir geht es jetzt darum das ich ein Tool schreiben möchte wo verschiedenste Server verwalten können soll. Also zum Beispiel ein Minecraft Server, ein TS, und ein Ark Server und in dem Tool sagt man einfach "start ark" und der Ark Server startet unter dem vorher definierten User und wenn der Server warum auch immer ausgeht soll er neugestartet werden. Nur das Tool soll möglichst ohne starke Anpassungen auf dem Debian System laufen weil es auf möglichsten vielen Systemen laufen soll.

Wenn das mit systemd auch irgendwie möglich ist, dann würde ich um eine Anleitung beten wie ich dann Prozesse starten, stoppen und nach dem Zustand abfragen kann. Und wie ich dann noch Befehle in die Server (MC/TS/Ark) Konsole eingeben kann

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

Re: Screen schließt Shell

Beitrag von scientific » 24.03.2018 10:37:41

Wenn es systemd-Systeme sind (wie die meisten aktuellen Linuxe), dann ist das eine einfache Unit in /etc/systemd/system

Dieser Unit kannst du einen Parameter User= einpacken, dann wird der Service als dieser User ausgeführt.

Wenn du mir ein paar Beispiele gibst, wie konkrete Server aufgerufen werden, kann ich dir Beispiel-Units geben.

Du wirst aber nicht daran vorbeikommen, dich mit systemd selber zu beschäftigen.

Screen ist dazu das absolut falsche Werkzeug!

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
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Screen schließt Shell

Beitrag von habakug » 24.03.2018 12:30:20

Hallo,

auf systemd gehe ich nicht ein.
Aber so geht es:

Code: Alles auswählen

$ cat top.sh 
#/bin/bash
while : 
do
	su - user -c top
	echo "Server läuft nicht mehr: CTRL+C stoppt Skript"
	sleep 10
done

$ screen -dmS Test sh ./top.sh
$ pstree -p | grep top
            |              |-screen(2468)---sh(2469)---su(2470)---top(2471)
$ screen -R Test (Ctrl-C Ctrl-C)
$ pstree -p | grep top
oder
$ screen -S Test -X quit
$ pstree -p | grep top
Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

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

Re: Screen schließt Shell

Beitrag von scientific » 24.03.2018 13:03:23

Du legst die Datei
/etc/systemd/system/minecraft.service mit folgendem Inhalt an:

Code: Alles auswählen

[Unit]
Description=Minecraftserver

[Service]
StartExec=/pfad/zur/Minecraft.jar --parameter1
Restart=always
User=minecraft

[Install]
WantedBy=default.target
Dann führst du als root

Code: Alles auswählen

 systemctl daemon-reload
aus. Damit teilst du systemd die neue Konfiguration mit.
Starten/Stoppen tust du als root den Minecraftserver mit

Code: Alles auswählen

systemctl start minecraft.service
systemctl stop minecraft.service
Systemd startet den Server solange neu, wenn er aus irgendeinem Grund beendet wird, bis du ihn mit dem stop-Befehl beendest. Der Service wird als User minecraft ausgeführt.

Wenn der Service beim Booten gestartet werden soll, kannst du das systemd mit

Code: Alles auswählen

 systemctl enable minecraft.service
befehlen.

Systemd ist genau dafür entwickelt worden, um Services zu starten, zu überwachen und zu beenden.

So eine Unit erstellst du für jeden Service, den zu haben willst.
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
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Screen schließt Shell

Beitrag von habakug » 24.03.2018 13:35:09

Hallo,

für systemd sollten dann aber auch ExecStop-Befehle definiert sein [1].
Oder wenigstens für den Service

Code: Alles auswählen

KillMode=process
KillSignal=SIGINT
Gruss, habakug

{1] https://gist.github.com/nathanielc/9b98350ccbcbf21256d7
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

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

Re: Screen schließt Shell

Beitrag von scientific » 24.03.2018 13:36:59

Das kommt auf den Service an.

Ich hab mal die minimale Variante aufgeschrieben.
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

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

Re: Screen schließt Shell

Beitrag von scientific » 24.03.2018 13:39:23

In einer systemd-unit einen Prozess mit screen in den Hintergrund schicken... So ein Schmarrn.

Wenn ich das minecraft.jar auf der Shell starte und mit CTRL-C beenden kann, reicht meine Unit vollkommen aus...
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
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Screen schließt Shell

Beitrag von habakug » 24.03.2018 14:20:18

Hallo,
In einer systemd-unit einen Prozess mit screen in den Hintergrund schicken... So ein Schmarrn.
Wer hat denn davon gesprochen?
Mein Kommentar bezog sich auf deine Definition einer Systemd-Unit. Dies java ist eben zickig und hängt sich gerne mal auf, da wäre "deine Unit" komplett hilflos.

Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

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

Re: Screen schließt Shell

Beitrag von scientific » 24.03.2018 23:06:10

In dem Gist, das du gepostet hast...
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

Skillkiller
Beiträge: 30
Registriert: 27.07.2016 12:49:05
Lizenz eigener Beiträge: MIT Lizenz

Re: Screen schließt Shell

Beitrag von Skillkiller » 26.03.2018 17:51:16

Vielen Dank für die ganzen Beiträge, ihr habt mich schon mal sehr viel weiter geholfen mit den Units. Nur gibt es eine Möglichkeit die Konsole von dem Java Programm zu öffnen, mit Screen ging das ja über "screen -r", gibt es bei systemd dafür auch einen Befehel?

Liebe Grüße
Skillkiller

Antworten