Starten Sie einen Prozess auf einem anderen Tty

31

Nach ungefähr einer Stunde Googeln kann ich nicht glauben, dass noch niemand diese Frage gestellt hat ...

Also habe ich ein Skript auf TTY1 ausgeführt. Wie bringe ich dieses Skript dazu, ein beliebiges Programm auf TTY2 zu starten?

  • Ich habe gefunden tty, was dir sagt, auf welchem ​​TTY du gerade bist.
  • Ich habe gefunden writevt, das eine einzelne Textzeile auf ein anderes TTY schreibt.
  • Ich habe festgestellt chvt, welche Änderungen welches TTY aktuell anzeigt.

Ich möchte TTY2 nicht anzeigen . Ich möchte nur, dass das Hauptskript normal weiter ausgeführt wird, aber wenn ich manuell zu TTY2 wechsle, kann ich mit dem zweiten Programm interagieren.

MathematicalOrchid
quelle
Haben Sie von TTY1 aus versucht [command] > /dev/tty2(Sie müssen sich bereits bei tty2 angemeldet haben)?
Pandya
1
das könnte ein XY-Problem sein ... was versuchst du zu erreichen? Was ist das übergeordnete Ziel?
Olivier Dulac

Antworten:

32
setsid sh -c 'exec command <> /dev/tty2 >&0 2>&1'

Solange nichts anderes das andere TTY verwendet ( /dev/tty2in diesem Beispiel), sollte dies funktionieren. Dies beinhaltet einen gettyProzess, der möglicherweise darauf wartet, dass sich jemand anmeldet. Wenn mehr als ein Prozess seine Eingabe von einem TTY liest, führt dies zu unerwarteten Ergebnissen.

setsid kümmert sich darum, den Befehl in einer neuen Sitzung zu starten.

Beachten Sie, dass Sie commanddie sttyEinstellungen korrekt vornehmen müssen, z. B. den "Gekochten Modus" onlcreinschalten müssen, damit bei der Ausgabe einer neuen Zeile ein Zeilenumbruch usw. eingefügt wird.

wurtel
quelle
2
Das ist nicht richtig. Sie mischen den Steuerungsanschluss mit bis /dev/stdin, /dev/stdoutund /dev/stderr. pszeigt leicht, dass commandin Ihrem Fall überhaupt kein steuerndes Terminal vorhanden ist.
Hauke ​​Laging
1
@HaukeLaging, ein Sitzungsleiter übernimmt die Kontrolle über ein Terminal, sobald es geöffnet wird. Das Problem war, dass das Endgerät vom Sitzungsleiter nicht geöffnet wurde. Sollte jetzt behoben sein.
Stéphane Chazelas
@ StéphaneChazelas mit dem ich getestet habe sleep 1000und es hier immer noch nicht funktioniert. Ich habe allerdings eine Pseudotty verwendet (sollte wohl keinen Unterschied machen).
Hauke ​​Laging
@HaukeLaging Wie genau hast du es gemacht? Hatte dieses Terminal noch keine Kontrollsitzung ( solange nichts anderes den anderen TTY- Teil verwendet)?
Stéphane Chazelas
1
@ StéphaneChazelas Ich bin setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'in einem Terminalemulatorfenster gelaufen . /dev/pts/4ist ein anderes Terminal-Emulator-Fenster (derselbe Benutzer, der gerade bashläuft).
Hauke ​​Laging
6

Auf dem zweiten Tty wird normalerweise ein Programm ausgeführt, entweder ein Anmeldeprogramm oder eine Shell wie Bash. Wenn Sie eine Interaktion wünschen, müssen Sie entweder das Anmeldeprogramm durch das Ihre ersetzen oder eine Shell anweisen, das Programm so auszuführen, als ob das Programm über die Befehlszeile gestartet worden wäre.

Eine einfachere Lösung, IMO, besteht darin, eine tmuxSitzung zu starten , nachdem Sie sich auf dem zweiten Bildschirm angemeldet haben, und dann Folgendes zu verwenden:

tmux send yourcommand ENTER

um das Programm in der tmuxSitzung zu starten, die angezeigt wird, nachdem Sie zum zweiten Terminal gewechselt haben.

Anthon
quelle
2

Ich habe gerade eine Entdeckung gemacht:

Wie kann ich Anwendungen von 2 ttys beim Start starten?

In einem der Kommentare wird etwas genannt openvt. Dieser Befehl scheint genau das zu tun, wonach ich suche!

http://linux.about.com/library/cmd/blcmdl1_openvt.htm

Wenn niemand etwas anderes weiß, denke ich, ist dies wahrscheinlich der "richtige" Weg, dies zu tun.

(Ich habe es gerade ausprobiert und es scheint gut zu funktionieren - obwohl gettyes ausgeführt wird, sucht es das nächste unbenutzte Terminal. Ich denke, VTs werden nicht "geöffnet", bis Sie zu einem wechseln, um sich anzumelden ...)

MathematicalOrchid
quelle
0

Ich starte eine neue grafische Sitzung auf dem VT5 mit dem Befehl folgen

xinit "/usr/bin/<binary_executable>" -- :1 vt5

beispielsweise :

xinit "/usr/bin/playonlinux" -- :1 vt5

Wenn Sie eine grafische Anwendung in einer bereits aktiven grafischen Sitzung starten möchten, haben Sie folgende Möglichkeiten:

DISPLAY=:0 "/usr/bin/playonlinux"
inukaze
quelle