Ich möchte eine Anwendung innerhalb einer Bildschirmsitzung starten, jedoch über ein Skript.
Ohne Skript würde ich einfach den Bildschirm starten, dann N Fenster mit crtl-ac öffnen und Programme in jedem Fenster ausführen.
Ich habe folgendes versucht
screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log
Aber wenn ich anhänge, läuft der Sitzungsende nicht. Wenn ich die Sitzung direkt danach anhänge screen -d -m -S startup
und screen -S startup -X exec tail -f /var/log/messages
von einem anderen Terminal aus starte, funktioniert sie.
Habe ich etwas verpasst ?
Bearbeiten nach AlexD Antwort:
Eine halb funktionierende Lösung ist
screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log
Das Verketten des Bildschirmbefehls (der nach -X) mit dem Befehl funktioniert, während exec wahrscheinlich nicht, weil exec erwartet, dass ein aktuelles Fenster definiert wird, während es kein aktuelles gibt, wenn der Bildschirm getrennt wird. Vielen Dank an AlexD für diese Tipps.
Aber es gibt einen seltsamen Nebeneffekt: Wenn das Programm stoppt (wenn Sie die Bildschirmsitzung anhängen und den Schwanz drücken oder den Schwanz drücken oder schließen), wird das Bildschirmfenster geschlossen.
Das Verhalten ist also nicht dasselbe wie bei Crtl-A c und führt den Befehl aus.
Ein weiterer Nebeneffekt ist, dass Sie keine 2 Befehle verketten können
quelle
screen
Beendet immer , wenn der Befehl, mit dem gestartet wurde, endet - dies ist eine normale Funktion des Tools :) ..so wenn Sie ausführenscreen top
, wenn Sie beendentop
,screen
wird auch beendetAntworten:
Mit diesem
screen -S test -X screen command
Befehl müssen Sie Ihrer Daemon-Sitzung Fenster hinzufügen, jedoch nicht aus den von Ihnen angegebenen Gründen. Es funktioniert, weil -X einen Bildschirmbefehl und keinen Shell-Befehl verwendet und der Bildschirmbefehl zum Erstellen eines Fensters verwirrenderweise als Bildschirm bezeichnet wird. Es gibt keinen Befehl exec exec. Es gibt auch keine Verkettung, es sei denn, Sie erstellen Ihren Befehl mithilfe von Shell-Skripten (wie folgt :)screen -S script -X screen sh -c 'command1; command2;'
.Das Aufrufen
screen -S test -X screen
ohne Befehl ist nutzlos, da der Standardbefehl eine Shell ist. Sobald Sie eine Shell erstellt haben, haben Sie keine nicht interaktive (und nicht verschlagene) Möglichkeit, Befehle in dieser Shell auszuführen. Es ist besser, den Befehl ohne interaktive Shell selbst auszuführen. Ein Nebeneffekt ist, dass das Bildschirmfenster beim Beenden des Befehls kein Kind mehr hat und geschlossen wird.Jetzt können Sie den Bildschirm auffordern, das Fenster nach dem Beenden des Befehls trotzdem offen zu halten. Verwenden Sie den
zombie
Bildschirmbefehl, um dies zu aktivieren. Ihre Sequenz sieht aus wie:Interaktiv wieder anbringen:
Und schließlich können Sie diese -X-Befehle stattdessen als screenrc-Skript umschreiben.
Screenrc:
Skript:
quelle
Wenn Sie den gleichen Effekt wie
Ctrl-A c
dann wünschen , sollten Siescreen
anstelle vonexec
:Sie können Ihre obigen Befehle auch in eine
$HOME/.screenrc-younameit
Datei (ohnescreen -S test -X
Präfix) verschieben und starten,screen -c $HOME/.screenrc-younameit
wenn Sie eine bestimmte Bildschirmsitzung erstellen möchten.quelle
ist die Verwendung von Byobu eine Option?
quelle
Ich habe heute Abend dasselbe gemacht, ich wollte den Bildschirm mit mehreren vorgeöffneten Dateien öffnen. Es hat eine Weile gedauert, bis ich das alles herausgefunden habe, aber ich habe mir endlich Folgendes ausgedacht, das ziemlich gut zu funktionieren scheint:
Dadurch werden sechs verschiedene Bildschirme erstellt, wobei die Bildschirme 1 bis 5 verschiedene Dateien geöffnet haben. Ich kenne nicht alle Einzelheiten, aber 'Zeug' sagt dem Bildschirm im Wesentlichen, dass der folgende zitierte Text kein Bildschirmbefehl ist. Das 'eval' evakuiert dann alles, was in den Zitaten enthalten ist. Ohne dies
screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"
leitet der zitierte Text einfach weiter, ohne ihn auszuführen. Eval liest '\ 015' als Zeilenumbruch und führt somit den vorhergehenden Text aus.In Bezug auf andere Details
screen -p 1 -S CS140 -X CMD
weist die Shell an, die 'CMD' an das erste Fenster der Bildschirmsitzung mit dem Namen 'CS140' zu senden.Ich hoffe, das hilft!
quelle