Rozpocznij proces na innym urządzeniu tty

31

Po około godzinie Googlingu nie mogę uwierzyć, że nikt wcześniej nie zadał tego pytania ...

Mam skrypt działający na TTY1. Jak sprawić, aby ten skrypt uruchamiał dowolny program na TTY2?

  • Znalazłem tty, który mówi ci, na którym TTY jesteś obecnie.
  • Znalazłem writevt, który zapisuje pojedynczy wiersz tekstu na innym TTY.
  • Znalazłem chvt, które zmiany, który TTY jest obecnie wyświetlany.

Nie chcę wyświetlać TTY2. Chcę tylko, aby główny skrypt kontynuował normalne działanie, ale jeśli ręcznie przełączę się na TTY2, mogę wchodzić w interakcje z drugim programem.

MathematicalOrchid
źródło
Z TTY1, czy próbowałeś [command] > /dev/tty2(musisz się już zalogować do tty2)?
Pandya,
1
może to być problem XY ... co próbujesz osiągnąć? jaki jest ogólny cel?
Olivier Dulac

Odpowiedzi:

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

Tak długo, jak nic innego nie używa drugiego TTY ( /dev/tty2w tym przykładzie), powinno to działać. Obejmuje to gettyproces, który może oczekiwać na zalogowanie się; z więcej niż jednego procesu odczytu sygnał z terminalem będzie prowadzić do nieoczekiwanych wyników.

setsid zajmuje się uruchomieniem polecenia w nowej sesji.

Należy pamiętać, że commandtrzeba będzie zadbać o sttyprawidłowe ustawienie ustawień, np. Włączyć „tryb gotowania”, onlcrtak aby wypisanie nowego wiersza dodawało powrót karetki itp.

wurtel
źródło
2
To nie jest poprawne. Mieszać się terminal kontrolny /dev/stdin, /dev/stdoutoraz /dev/stderr. psłatwo pokazuje, że commandw twoim przypadku w ogóle nie ma terminala sterującego.
Hauke ​​Laging
1
@HaukeLaging, lider sesji przejmuje kontrolę nad terminalem, gdy tylko go otworzy. Problem polegał na tym, że urządzenie końcowe nie było otwarte przez lidera sesji. Powinien zostać teraz naprawiony.
Stéphane Chazelas
@ StéphaneChazelas Testowałem sleep 1000i nadal nie działa tutaj. Jednak użyłem pseudo-tty (chyba nie powinno mieć znaczenia).
Hauke ​​Laging
@HaukeLaging Jak dokładnie to zrobiłeś? Czy ten terminal nie miał już sesji kontrolnej (o ile nic innego nie korzysta z drugiej części TTY )?
Stéphane Chazelas
1
@ StéphaneChazelas Uruchomiłem setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'okno emulatora terminala. /dev/pts/4to kolejne okno emulatora terminala (ten sam użytkownik, z bashuruchomionym).
Hauke ​​Laging
6

W drugim tty będzie normalnie uruchomiony program, albo program do logowania, albo jakaś powłoka jak bash. Jeśli chcesz interakcji, musisz albo wymienić program logowania na swój, albo powiedzieć powłoce, aby uruchomiła program tak, jakby program został uruchomiony z wiersza poleceń.

Prostszym rozwiązaniem, IMO, byłoby rozpoczęcie tmuxsesji po zalogowaniu się na drugim ekranie, a następnie użycie:

tmux send yourcommand ENTER

aby uruchomić program w tmuxsesji, która wyświetli się po przełączeniu na drugi terminal.

Anthon
źródło
2

Właśnie dokonałem odkrycia:

Jak mogę uruchamiać aplikacje od 2 tty podczas uruchamiania?

Jeden z komentarzy wspomina coś o nazwie openvt. To polecenie wydaje się robić dokładnie to, czego szukam!

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

Chyba że ktoś zna inny, myślę, że to prawdopodobnie jest „poprawny” sposób to zrobić.

(Właśnie go wypróbowałem i wydaje się, że działa dobrze - chociaż gettydziała, wybiera następny nieużywany terminal. Myślę, że VT nie otwierają się, dopóki nie przełączysz się na inny, aby spróbować się zalogować ...)

MathematicalOrchid
źródło
0

rozpoczynam nową sesję graficzną na vt5 za pomocą polecenia follow

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

na przykład :

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

Jeśli chcesz uruchomić aplikację graficzną w już aktywnej sesji graficznej, możesz:

DISPLAY=:0 "/usr/bin/playonlinux"
inukaze
źródło