Befehl an screen senden

janis

janis

BOFH
Hallo Leute,

ich habe ein shell Script (ab)geschrieben, was einen Battlefield2 Server starten und stoppen soll. Der Server wird in einer Screen-Session gestartet. Um ihn zu stoppen führe ich diesen Befehl aus: screen -S $NAME -X stuff $'exit\n' der Funktioniert aber nur, wenn ich die Session vorher mindestens ein Mal wiederherstellt habe. Woran liegt das? Wie kann ich das umgehen?

Script ist im Anhang
Jan
 

Anhänge

  • control_bf.txt
    1,9 KB · Aufrufe: 26
Kann mir denn keiner Helfen?

Ich will nur wissen, was ich tun muss, damit die Befehle immer ankommen, und nicht nur dann, wenn die Session schon mal wiederhergestellt wurde
 
Heißt dass dein Befehl reagiert nur wenn du mind. einmal den Screen geöffnet und dann wieder "minimiert" hattest?

Dann liegt das einglich nur an einem der beiden Befehle mit screen - einmal der oben gepostete und der zum starten:

screen -AmdS $NAME ./start.sh $PARAMS
 
Heißt dass dein Befehl reagiert nur wenn du mind. einmal den Screen geöffnet und dann wieder "minimiert" hattest?
Exakt

Dann liegt das einglich nur an einem der beiden Befehle mit screen
Wunderbar: aber ich habe bei "man screen" keine Parameter gefunden, der dafür Verantwortlich sein könnte, oder erwartest du, dass ich die ganzen 80 Seiten der Manual durchlese?
 
Hi,

Wunderbar: aber ich habe bei "man screen" keine Parameter gefunden, der dafür Verantwortlich sein könnte, oder erwartest du, dass ich die ganzen 80 Seiten der Manual durchlese?

erwartest du dass wir das fuer dich tun? :P

Da duerften sich deine Skript Schreiber aber auch nur leicht vertan haben, es sollte eigentlich
Code:
screen -p foo -X stuff $'exit\n'
heissen. Wobei je nach Sinn und Zweck "quit" statt "stuff $'exit\n'" vielleicht auch moeglich waere, aber das forciert dann den Abbruch des Prozesses, statt ihn sauber zu beenden.
Und ich gehe jetzt mal davon aus dass du so schlau warst, und $NAME entweder vorher selber gesetzt hast, oder die Variable mit dem richtigen Namen ersetzt hast.

mfg,
bytepool
 
erwartest du dass wir das fuer dich tun?
Nein, aber das einer von euch vielleicht was weiß ;-)
Da duerften sich deine Skript Schreiber aber auch nur leicht vertan haben, es sollte eigentlich
Laut http://www.tutorials.de/forum/linux-unix/219243-screen-befehl-uebergeben.html soll es so gehen.
Habe jetzt mal deinen Code ausprobiert: screen -p 2888 -X stuff $'exit\n' wobei 2888 die aktuelle ID der Session ist. Aber es passiert einfach nichts. Der Befehl scheint nicht anzukommen! Auch nicht, wenn ich den Screen vorher schon einmal geöffnet wurde.

"Quit" beendet doch den Screen? Das will ich nicht, weil dann das Programm darin dadurch abstürzt, ich will den Spielserver aber sauber beenden.

Und ja, $NAME ist gesetzt und ist auch bei Start und Stop gleich.
 
Hi,

ah, my bad, ich habe die man-page in der Tat missverstanden, bzw. mir war nicht wirklich bewusst dass es scheinbar noch einen klaren Unterschied zwischen Sessions, Displays und Windows gibt. Ich war aber trotzdem nicht ganz auf dem Holzweg:
Code:
screen -p 0 -S foo -X stuff $'echo hallo\n'
sollte funktionieren. Bei mir hat sich screen ohne das -p noch darueber beschwert, dass ich kein Display angegeben habe, was ich hier mit -p 0 (Null) mache.
Das laesst sich uebrigens gut testen, wenn du einfach noch eine zweite Shell aufmachst, und von dort aus mit -X Befehle an die erste Shell sendest, auf der du screen offen laesst. Dann blendet er fuer einige Zeit Fehlermeldungen ein.

mfg,
bytepool
 
Danke!

Es funktioniert :-)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Noch eine Frage:
Kann ich einen "Screenshot" bekommen?
Ich möchte einfach von der Ausgabe einen Snapshot machen, den ich dann verarbeiten will.
Praktisch:
Ich habe in den Screen einen Gameserver laufen, und möchte die Ausgabe auf einer Website anzeigen. Also wenn die Seite geladen wird, soll ein PHP Script im Screen vorbeischauen, und die aktuelle Anzeige auch auf der Homepage anzeigen.
 
Zuletzt bearbeitet:
Hab ich noch nie benutzt aber eine komplette Ausgabe in eine Datei speichern ging normal immer damit:

Code:
./start > hieralleswasinderkonsolegewesenwäre.txt
 
hmm..

Ok scheint so als würde der screen jegliche Ausgabe aufessen...
Allerdings hat es bei mir so funktioniert:

Das hier ist quasi der "Emulator" für die BF2 Binary.. der gibt nur ein "test" in die Shell aus der BF Server macht da bissl mehr denk ich..
Code:
#!/bin/bash

echo test

Also das wird in einem anderen Skript (tst2.sh) aufgerufen:
Code:
#!/bin/bash

./fakeserver.sh > echo.txt

Wenn du das jetz mit screen startest geht das und die echo.txt wird mit einem "test" gefüllt:
Code:
screen -AmdS tst ./tst2.sh


Ich weis nicht warum, aber das wird sicher jmd im Laufe des Abends beantworten :D weil direkt mit
Code:
screen -AmdS tst "./fakeserver.sh > test.txt"
geht das komischerweise nicht..
 
Zuletzt bearbeitet:
Hi,

zum mitloggen der Displays kennt screen die schoene Option -L. Der Output steht dann standardmaessig im selben Verzeichnis unter screenlog.0, etc.

Edit: Vorrausgesetzt der User hat im aktuellen Verzeichnis Schreibrechte, natuerlich.

mfg,
bytepool
 
Zuletzt bearbeitet:
-L hört sich gut an. Kann ich den Ausgabeort noch irgendwie selber festlegen?
gibt es dafür noch einen parameter?

Edit://
Habe grade ein Problem festgestellt:
Die Konsole sieht normal so aus:
Code:
./proc/2935/task/2935/mem
find: Symbolic link `./proc/2935/task/2935/cwd' is part of a loop in the directory hierarchy; we have already visited the directory to which it points.
./proc/2935/task/2935/cwd
find: Symbolic link `./proc/2935/task/2935/root' is part of a loop in the directory hierarchy; we have already visited the directory to which it points.
./proc/2935/task/2935/root
./proc/2935/task/2935/exe
./proc/2935/task/2935/mounts
./proc/2935/task/2935/smaps
./proc/2935/task/2935/attr
./proc/2935/task/2935/attr/current
./proc/2935/task/2935/attr/prev
./proc/2935/task/2935/attr/exec
./proc/2935/task/2935/attr/fscreate
./proc/2935/task/2935/attr/keycreate
./proc/2935/task/2935/attr/sockcreate
./proc/2935/task/2935/wchan
./proc/2935/task/2935/cpuset
./proc/2935/task/2935/oom_score
./proc/2935/task/2935/oom_adj
./proc/2935/fd
./proc/2935/fd/0
./proc/2935/fd/1
./proc/2935/fd/2
find: Symbolic link `./proc/2935/fd/3' is part of a loop in the directory hierarchy; we have already visited the directory to which it points.
./proc/2935/fd/3
find: ./proc/2935/fd/4: Datei oder Verzeichnis nicht gefunden
./proc/2935/environ
./proc/2935/auxv
./proc/2935/status
./proc/2935/cmdline
./proc/2935/stat
./proc/2935/statm
./proc/2935/maps
./proc/2935/numa_maps
./proc/2935/mem
find: Symbolic link `./proc/2935/cwd' is part of a loop in the directory hierarchy; we have already visited the directory to which it points.
./proc/2935/cwd
find: Symbolic link `./proc/2935/root' is part of a loop in the directory hierarchy; we have already visited the directory to which it points.
./proc/2935/root
./proc/2935/exe
./proc/2935/mounts
./proc/2935/mountstats
./proc/2935/smaps
./proc/2935/attr
./proc/2935/attr/current
./proc/2935/attr/prev
./proc/2935/attr/exec
./proc/2935/attr/fscreate
./proc/2935/attr/keycreate
./proc/2935/attr/sockcreate
./proc/2935/wchan
./proc/2935/cpuset
./proc/2935/oom_score
./proc/2935/oom_adj
./usr/X11R6/bin/pager
./usr/X11R6/bin/zsoelim
./usr/X11R6/bin/vimdiff
./usr/X11R6/bin/unlink
./usr/X11R6/bin/less
./usr/X11R6/bin/ex
./usr/X11R6/bin/mc
./usr/X11R6/bin/screen
./usr/X11R6/bin/mcedit
./usr/X11R6/bin/wget
./usr/X11R6/bin/rview
./usr/X11R6/bin/editor
./usr/X11R6/bin/vim.tiny
./usr/X11R6/bin/vim
./usr/X11R6/bin/find
./usr/X11R6/bin/troff
./usr/X11R6/bin/grotty
./usr/X11R6/bin/tbl
./usr/X11R6/bin/sudoedit
./usr/X11R6/bin/man
find: Symbolic link `./usr/X11R6/bin/X11' is part of a loop in the directory hierarchy; we have already visited the directory to which it points.
./usr/X11R6/bin/X11
./usr/X11R6/bin/nroff
./usr/X11R6/bin/vi
./usr/X11R6/bin/sudo
./usr/X11R6/bin/which
./usr/X11R6/bin/mcview
./usr/X11R6/bin/whoami
./usr/X11R6/bin/locale
./usr/X11R6/bin/groff
./usr/X11R6/bin/rvim
./usr/X11R6/bin/gtbl
./usr/share/doc/python/python-policy.html
./usr/share/doc/libapache2-mod-php5
./usr/share/doc/libapache2-mod-php5/examples
./usr/share/doc/libapache2-mod-php5/PEAR
./usr/share/doc/vim-common
./usr/share/doc/lib32gcc1
./usr/share/doc/libstdc++6
./usr/share/doc/debconf-i18n
./usr/share/doc/openssh-server
./usr/share/doc/ncurses-bin
./usr/share/doc/libpango1.0-common
./usr/share/doc/perl
./usr/share/doc/perl-modules
./usr/share/doc/libncurses5
./usr/share/doc/libperl5.8
./usr/share/doc/php5-mysql
./usr/share/doc/php5-mysql/examples
./usr/share/doc/php5-mysql/PEAR

server:/# find -L -amin -5 [.]screen[.]
find: Der Pfad muà vor dem Suchkriterium stehen.
Usage: find [-H] [-L] [-P] [path...] [expression]
server:/# find -L -amin -5 / [.]screen[.]
find: Der Pfad muà vor dem Suchkriterium stehen.
Usage: find [-H] [-L] [-P] [path...] [expression]
server:/# find -L -amin -5 / [.*]screen[.*]
find: Der Pfad muà vor dem Suchkriterium stehen.
Usage: find [-H] [-L] [-P] [path...] [expression]
server:/# find -L -amin -5 / [.)*
bash: syntax error near unexpected token `)'
server:/# find -L -amin -5 / [.]*
find: Der Pfad muà vor dem Suchkriterium stehen.
Usage: find [-H] [-L] [-P] [path...] [expression]
server:/# find -L screenlogß.0
find: screenlogß.0: Datei oder Verzeichnis nicht gefunden
server:/# find -L screenlog.0
find: screenlog.0: Datei oder Verzeichnis nicht gefunden
server:/# exit
exit
bf@server:/srv/www$ dir
analog           ebay        Kopie\ von\ perf_test.php  perf_output.php
apache2-default  filehost    linux                      perf_test.php
bf.php           giebe       mia                        phpmyadmin
block            Jan         news                       raster.png
DBackup          joman92.de  pdf.php
bf@server:/srv/www$ cd
bf@server:~$ dir
bf2   cod4-linux-server-06282008.tar.bz2  script
cod4  cod4-linux-server-12032007.tar.bz2  tsserver2.pid
bf@server:~$ screen -L "echo halle!"
-sh: !": event not found
bf@server:~$ screen -L echo "halle"
[screen is terminating]
bf@server:~$ dir
bf2   cod4-linux-server-06282008.tar.bz2  screenlog.0  tsserver2.pid
cod4  cod4-linux-server-12032007.tar.bz2  script
bf@server:~$ more screenlog.0
halle
bf@server:~$ unlink screenlog.0
bf@server:~$ cd script
bf@server:~/script$ dir
apache  control_bf
bf@server:~/script$ vi control_bf
bf@server:~/script$ dir
apache  control_bf
bf@server:~/script$ pwd
/home/bf/script
bf@server:~/script$ vi control_bf
bf@server:~/script$ vi control_bf
bf@server:~/script$ cd /srv/www
bf@server:/srv/www$ dir
analog           ebay        Kopie\ von\ perf_test.php  perf_output.php
apache2-default  filehost    linux                      perf_test.php
bf.php           giebe       mia                        phpmyadmin
block            Jan         news                       raster.png
DBackup          joman92.de  pdf.php
bf@server:/srv/www$ vi lol
bf@server:/srv/www$ unlink lol
bf@server:/srv/www$ dir
analog           ebay        Kopie\ von\ perf_test.php  perf_output.php
apache2-default  filehost    linux                      perf_test.php
bf.php           giebe       mia                        phpmyadmin
block            Jan         news                       raster.png
DBackup          joman92.de  pdf.php
bf@server:/srv/www$ cd ~/script
bf@server:~/script$ dir
apache  control_bf
bf@server:~/script$ ./control_bf start
Starting server: bf_server
... done
bf@server:~/script$ dir
apache  control_bf
bf@server:~/script$ dir
apache  control_bf
bf@server:~/script$ vi control_bf
bf@server:~/script$ cd /usr/games/bf32
-sh: cd: /usr/games/bf32: Datei oder Verzeichnis nicht gefunden
bf@server:~/script$ cd /usr/games/bf2
bf@server:/usr/games/bf2$ dir
admin       core.2795  core.3467        pylib-2.3.4.zip  rotate_demo.cfg
adminutils  core.2821  lowercaseDir.py  python           screenlog.0
bin         core.3412  mods             readmes          start.sh
core.2620   core.3423  pb               ret
bf@server:/usr/games/bf2$ su
Password:
server:/usr/games/bf2# mc

server:/usr/games/bf2# exit
exit
bf@server:/usr/games/bf2$ su
Password:
server:/usr/games/bf2# mc
server:/usr/games# ./start.sh
bash: ./start.sh: Datei oder Verzeichnis nicht gefunden
server:/usr/games# ./start.sh
bash: ./start.sh: Datei oder Verzeichnis nicht gefunden
server:/usr/games# ./start.sh
bash: ./start.sh: Datei oder Verzeichnis nicht gefunden
server:/usr/games# ./start.sh
bash: ./start.sh: Datei oder Verzeichnis nicht gefunden
server:/usr/games# ./start.sh
bash: ./start.sh: Datei oder Verzeichnis nicht gefunden

server:/usr/games/bf2# screen -r
There is no screen to be resumed.
server:/usr/games/bf2# unlink screenlog.0
server:/usr/games/bf2# screen -r
There is no screen to be resumed.
server:/usr/games/bf2# exit
exit
bf@server:/usr/games/bf2$ screen -r
Battlefield II Dedicated Server v1.1.2965-797.0(x86_64)
"Last Invasion"                          Average FPS:  34 [d:0, o:20]
IP: 127.0.1.1 Port: 16567 (LAN)          Map: operation_clean_sweep
Game mode: gpm_coop/16                   Mod: bf2
Players: 0/16 (0 r) (0 connecting)       Round: 1/3          Status: [playing]
-------------------------------------------------------------------------------



Loaded 15%
Loaded 16%
Loaded 17%
Loaded 18%
Loaded 19%
Loaded 20%
Loaded 21%
Loaded 22%
Loaded 23%
Loaded 25%
Loaded 26%
Loaded 27%
Loaded 29%
Loaded 100%
>
Und der aktualisiert das im Sekundentakt->d.h. er schreibt sekündlich alles neu -> riesen Logdatei.
Kann ich das irgendwie kürzen?
Bzw. zu das letzte anzeigen?
 
Zuletzt bearbeitet:
Hi,

hat dir eine Manpage irgendwann mal was grausames angetan, dass du solche Angst hast da reinzugucken? :P

Soweit ich weiss unterstuetzt screen von sich aus keine rotating Logfiles oder solche Spielchen, aber du kannst die Datei(en) natuerlich mit anderen Programmen, sozusagen "von Aussen", beliebig veraendern.
'man screen' ist dein Freund. :P

mfg,
bytepool
 
hat dir eine Manpage irgendwann mal was grausames angetan, dass du solche Angst hast da reinzugucken?
Ja, als ich sie an die Druckvorschau geschickt habe, hat es fünf Minuten zum spoolen gedauert ;-)

OK, aber war gar nicht so schwer^^
Sorry fürs zuspammen:
18.1 hardcopy

— Command: hardcopy [-h] [file]

(C-a h, C-a C-h)
Writes out the currently displayed image to the file file, or, if no filename is specified, to hardcopy.n in the default directory, where n is the number of the current window. This either appends or overwrites the file if it exists, as determined by the hardcopy_append command. If the option -h is specified, dump also the contents of the scrollback buffer.

— Command: hardcopy_append state

(none)
If set to ‘on’, screen will append to the hardcopy.n files created by the command hardcopy; otherwise, these files are overwritten each time.

— Command: hardcopydir directory

(none)
Defines a directory where hardcopy files will be placed. If unset, hardcopys are dumped in screen's current working directory.
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

OK, doch net.
Ich schaffe es nicht, den Pfad zu ändern:
screen -S bf_server -X hardcopydir /srv/www/control/
scheint keinen Effekt zu haben!
Die Screens, die ich mit
$ screen -S bf_server -X hardcopy dmp0
erstelle laden trotzdem im Standartordner
 
Zuletzt bearbeitet:
Dann schau dir doch auch nochmal chdir an.

mfg,
bytepool
 
Hi,

Das wollte ich aber nicht unbedingt machen.

und warum nicht? Das Verzeichnis deines Servers sollte sich nicht veraendern, nur das Verzeichnis von screen, d.h. in das Verzeichnis werden dann auch alle logfiles, etc. geschrieben.

Edit: Das Problem mit hardcopydir scheint uebrigens zu sein, dass du noch einen Dateinamen bei hardcopy mitgibst.

mfg,
bytepool
 
Zuletzt bearbeitet:
Ich kann bei Hardcopy einen absoluten Pfad angeben.
Damit hat sich das Problem gelöst
 
OK, neuen Problem

Ich will den Befehl, der an Screen gesendet werden soll, selber der Funktion übergeben.
Dafür habe ich folgende Zeile versucht:
screen -p 0 -S $NAME -X sutff $'$1\n'

aber anstatt den Wert der Variable einzufügen, fügt er ihren Namen ein.
 

Ähnliche Themen

Hilfe bei Screen innerhalb von scripten

screen nach Programmende aktiv halten oder in die Shell

Queue für copy Script

Prüfe Internet Verbindung über VPN - wenn nicht = wechsle VPN-Server

dovecot und postfix Konfiguration Problem

Zurück
Oben