• This forum has a zero tolerance policy regarding spam. If you register here to publish advertising, your user account will be deleted without further questions.

Eingabe an dettached Screen übergeben ohne zu attachen

.FitB

New Member
Hi,

ich habe das Problem in einem Bashscript das ich in einem case eine Eingabe bzw. einen Befehl an eine screen Session übergeben möchte ohne diese zu attachen.

ein attachen des screen und dann eine einfache angabe des Befehls ist in bash direkt nicht möglich, nach dem attachen des screens passiert nichts mehr.

kennt da jemand evtl. eine Möglichkeit?

am schönsten wäre ja etwas like

screen -s Sessionname -c 'mein befehl mit parametern'

trotz vielem googlen und probieren habe ich es bisher nicht geschafft, vielleicht weiss ja hier jemand weiter.
 
puh, endlich was gefunden. Typisch, kaum postet man was in einem Forum findet man die Lösung.

Falls es noch jemand benötigt:

screen -S sessionname -X eval 'stuff "dein befehl mit parametern"\015'

mit -S sessionname wird die Screensession bestimmt

-X eval ist für die Ausführung

stuff beschreibt das es sich um eine Eingabe handelt

"dein befehl mit parametern" muss in den Gänsefüsschen benutzt werden.

\015 beschreibt die "Entertaste" damit der Befehl auch ausgeführt wird.
 
Das gute alte --help oder alternativ "man screen" hätte hier wohl geholfen. ;)
Code:
screen --help
Use: screen [-opts] [cmd [args]]
or: screen -r [host.tty]

Options:
-a Force all capabilities into each window's termcap.
-A -[r|R] Adapt all windows to the new display width & height.
-c file Read configuration file instead of '.screenrc'.
-d (-r) Detach the elsewhere running screen (and reattach here).
-dmS name Start as daemon: Screen session in detached mode.
-D (-r) Detach and logout remote (and reattach here).
-D -RR Do whatever is needed to get a screen session.
-e xy Change command characters.
-f Flow control on, -fn = off, -fa = auto.
-h lines Set the size of the scrollback history buffer.
-i Interrupt output sooner when flow control is on.
-l Login mode on (update /var/run/utmp), -ln = off.
-list or -ls. Do nothing, just list our SockDir.
-L Turn on output logging.
-m ignore $STY variable, do create a new screen session.
-O Choose optimal output rather than exact vt100 emulation.
-p window Preselect the named window if it exists.
-q Quiet startup. Exits with non-zero return code if unsuccessful.
-r Reattach to a detached screen process.
-R Reattach if possible, otherwise start a new session.
-s shell Shell to execute rather than $SHELL.
-S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title Set title. (window's name).
-T term Use term as $TERM for windows, rather than "screen".
-U Tell screen to use UTF-8 encoding.
-v Print "Screen version 4.00.03jw4 (FAU) 2-May-06".
-wipe Do nothing, just clean up SockDir.
-x Attach to a not detached screen. (Multi display mode).
-X Execute <cmd> as a screen command in the specified session.
 
Den habe ich mehrfach studiert ;)

nur war mir nicht klar was hinter dem -X noch alles folgen muss.

Leider ergibt sich ein weiteres Problem an dem ich nun sitze.

In der Screensession läuft ein "Programm". Wenn ich nun z.B. mit folgendem Befehl etwas an die Session übergebe

screen -S test -X eval 'stuff "say test"\015'

wird das nicht an das laufende Programm übergeben. Da dürfte der -p Parameter weiterhelfen, jetzt muss ich nur rausfinden wie das "window" des Programms denn heisst.
 
Auch das ging fix ;)

beim screensessionstart das window mit -t windowname definieren und dann beim -X befehl mit -p windowname ansprechen :D

wooho!

Es gibt doch nicht schöneres als das eigene Script wachsen zu sehen ;)
 
Wo wir gerade so schön beim Thema sind stelle ich auch mal ein unliebsames Problem in den Raum:
Ich habe inzwischen bei einer ganzen Reihe von Servern immer das selbe Aufbau-Schema meiner Screen-Session. Also z.B. 0=etc-Verzeichnis, 1=work-Verzeichnis, 2=user-Verzeichnis, 3=MySQL-Client, 4=www-Verzeichnis, uvm.
Das entbehrt zwar jeder Logik, aber es hat sich mal so ergeben und wie so üblich gehen dann die Tastenkürzel schneller in Fleisch und Blut über als gewollt.

Wenn jetzt mal ein Server neu gebootet werden muss, muss ich jedesmal die einzelnen Screens wieder so aufbauen.
Gibt es eine Möglichkeit/Script welches mir meine Screen-Session direkt so einrichtet wie ich es gewöhnt bin?
So dass ich nach einem Reboot einmal dieses Script aufrufe und danach nur mit "screen -rd" in meine "Umgebung" starte.

huschi.
 
Jop die .screenrc...
Genau wie Huschi hab ich auch immer eine screensession mit mehreren Fenstern...hier mal ein Beispiel:
/home/<user>/.screenrc
Code:
screen -t bash 0 top
screen -t bash 1 top
Damit hätte man 2 Fenster in jedem würde 'top' laufen.
 
puh, endlich was gefunden. Typisch, kaum postet man was in einem Forum findet man die Lösung.

Falls es noch jemand benötigt:

screen -S sessionname -X eval 'stuff "dein befehl mit parametern"\015'

mit -S sessionname wird die Screensession bestimmt

-X eval ist für die Ausführung

stuff beschreibt das es sich um eine Eingabe handelt

"dein befehl mit parametern" muss in den Gänsefüsschen benutzt werden.

\015 beschreibt die "Entertaste" damit der Befehl auch ausgeführt wird.

Code:
screen -S screenname -p0 -X stuff $'cal\n'

Das ist einfacher. Wichtig ist immer, dass das Window mit p ausgewählt wird. Ansonsten funktioniert der stuff Befehl nur, wenn der Screen bereits einmal attached wurde. Ich möchte noch anmerken, dass durch das Quting Variablen nicht übernommen werden.

Wenn du mit Variablen arbeiten möchtest, kannst du so vorgehen:
Beispiel 1:
Code:
screen -S screenname -p0 -X stuff "Hallo $USER"
screen -S screenname -p0 -X stuff $'\n'

Beispiel 2:
Code:
screen -S screenname -p0 -X stuff "Hallo $USER"$'\n'

Beispiel 3:
Code:
lf=$'\n'
screen -S screenname -p0 -X stuff "Hallo $USER$lf"
 
Back
Top