Befehl an eine bereits laufende Bildschirmsitzung senden

11

Ich habe versucht, Befehle an eine laufende Gnu-Bildschirmsitzung (4.00.03) in opensolaris zu senden, kann jedoch keine Befehle über eine beliebige Kombination von ausführen screen -X

Ok, ich starte eine Bildschirmsitzung mit screen -S testund habe dann versucht, screen -r -X "date"mir nur das Datum anzuzeigen, an dem ich mich wieder damit verbinden würde. Es ist jedoch weder eine Fehlermeldung noch eine Ausgabe auf dem Bildschirm aufgetreten. Ich habe es mit so vielen Kombinationen versucht, dass ich mich nicht einmal erinnern kann.

Irgendwelche Hinweise, wie man das erreicht?

Der Grund, warum ich das mache, ist, dass ich ein Programm habe, das nicht als Dämon geliefert wird, und ich möchte es in einer Bildschirmsitzung starten, damit ich später sehen kann, was los ist.

Der Hochstapler
quelle
1
Es scheint, als ob dieser "Befehl", über den sie in den Manpages sprechen, für einen Bildschirmbefehl gedacht ist, wie Einstellungen für die Bildschirmsitzung selbst. Anstatt Befehle für die Shell zu senden, die in der Bildschirmsitzung geöffnet wird. Also, jemand eine Idee, wie man es mit einem Bash-Skript machen kann?
@Axon: Ja, -X sendet Bildschirmbefehle, keine Shell-Befehle, aber screen verfügt über den Befehl 'screen', mit dem neue Bildschirmfenster geöffnet werden können.

Antworten:

18

Eigentlich ist es ganz einfach. Sie können Folgendes verwenden:

screen -S sessionname -X stuff 'command'`echo -ne '\015'`

echo -ne '\015'emuliert das Drücken der EnterTaste.

HINWEIS: Dieses 'Zeug' ist ein Bildschirmbefehl. http://www.gnu.org/software/screen/manual/screen.html#Stuff

der Pförtner
quelle
Könnten Sie bitte angeben, was "Zeug" darstellt? Ist das ein Name ... oder ein Befehl ... oder andere Parameter?
Cerin
Es funktioniert in der Tat, aber ich würde nicht sagen, dass es einfach sowieso ist;) Dies ist so etwas wie das Übergeben von Ereignissen mit Tastendruck und das Übergeben von Zeilenumbrüchen an den Bildschirm. Gibt es nicht nur einen normalen Bildschirmausführungsbefehl ...?
Ducin
@Cecin: stuffist ein Bildschirmbefehl, um eine Zeichenfolge in stdin zu stopfen
konrad
Das ist sehr gut, aber aus irgendeinem Grund funktioniert es nicht mit "screen -RdS sessionname -X stuff 'ls -l' echo -ne '\015'", warum?
e271p314
Dies funktioniert nur, wenn ich den Befehl zweimal ausführe ... und in separaten Befehlszeilen ... wenn ich screen -d -m -S sessionname; screen -S sessionname -X [...]nichts tue , wird es nie funktionieren, (screen -d -m -S sessionname&)&sleep 10;screen -S sessionname -X [...]es wird nichts getan, außer eine neue Bildschirmsitzung zu erstellen, die nichts tut. Down-Voting
user3338098
5

Klingt wie Sie wollen:

$ screen -S test -d -m -c / dev / null - sh -c 'Datum; exec $ SHELL '

-S Test: Benennen Sie diese Sitzung
-d -m: Startbildschirm getrennt
-c / dev / null: ignoriere ~ / .screenrc (gib eine andere Datei an oder lösche diese Option,
  wie benötigt)
-: Optionen am Ende des Bildschirms
sh-c 'Datum; exec $ SHELL ': Befehl zum Ausführen des Bildschirms. Beachten Sie, dass bei diesem Befehl
  war nur 'Datum', dann würde der Bildschirm sofort beendet. wenn Sie nicht beenden möchten
  Bildschirm, nachdem Ihr Befehl beendet wurde, können Sie Folgendes verwenden:
    $ screen -S test -d -m -c / dev / null - Ihr Befehl hier

Oder vielleicht willst du nur dtach .


quelle
Das Ausführen führt zu nichts. Keine Erfolgs- oder Fehlermeldungen, aber es screen -listwerden keine Sitzungen geöffnet.
Cerin
Diese Antwort hat bei mir funktioniert. Der Schlüssel war das -, um die Bildschirmoptionen zu beenden.
Plazgoth
1
screen -S <session_name> -X screen [-t <title>] <shell_command> [<args>]

Öffnen Sie ein neues Fenster (mit dem Titel title ) in einer vorhandenen Sitzung mit dem Namen session_name und führen Sie shell_command aus (mit optionalen Argumenten args ).

Jeremy Kao
quelle