Почніть процес на іншій tty


31

Приблизно через годину Googling це, я не можу повірити, що ніхто ще не задавав це питання раніше ...

Отже, у мене працює сценарій на TTY1. Як змусити цей скрипт запустити якусь довільну програму на TTY2?

  • Я знайшов tty, що говорить вам, на якому TTY ви зараз перебуваєте.
  • Я знайшов writevt, що записує один рядок тексту на інший TTY.
  • Я виявив chvt, які зміни, які TTY наразі відображається.

Я не хочу відображати TTY2. Я просто хочу, щоб основний сценарій продовжував виконуватись нормально, але якщо я перейду вручну на TTY2, я можу взаємодіяти з другою програмою.


З TTY1, Ви пробували [command] > /dev/tty2(ви вже повинні увійти до tty2)?
Пандія

1
це може бути проблемою XY ... чого ви намагаєтесь досягти? яка загальна мета?
Олів'є Дулак

Відповіді:


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

Поки ніхто інший не використовує інший TTY ( /dev/tty2у цьому прикладі), це має працювати. Це включає gettyпроцес, який може чекати, коли хтось увійде; має більше одного процес читання введення з TTY буде приводити до несподіваних результатів.

setsid піклується про запуск команди в новому сеансі.

Зверніть увагу, що вам commandдоведеться подбати про sttyправильне встановлення налаштувань, наприклад, увімкніть "приготовлений режим" і onlcrтаким чином, щоб вивести новий рядок додасть повернення каретки тощо.


2
Це не правильно. Ви переплутати контрольний термінал /dev/stdin, /dev/stdoutі /dev/stderr. psлегко показує, що commandу вашому випадку взагалі немає керуючого терміналу.
Hauke ​​Laging

1
@HaukeLaging, керівник сесії бере контроль над терміналом, як тільки він відкриває його. Проблема полягала в тому, що керівник сеансу не відкрив термінальний пристрій. Слід виправити зараз.
Стефан Шазелас

@ StéphaneChazelas, з яким я тестував, sleep 1000і тут все ще не працює. Хоча я використав псевдо tty (я не повинен змінювати значення, я думаю).
Hauke ​​Laging

@HaukeLaging Як ​​саме ти це зробив? Хіба що в цьому терміналі вже не було сеансу керування ( Поки інша частина TTY не використовує )?
Stéphane Chazelas

1
@ StéphaneChazelas я біг setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'у вікно емулятора терміналу. /dev/pts/4- ще одне вікно емулятора терміналу (той самий користувач із bashзапущеним).
Hauke ​​Laging

6

На другому tty зазвичай буде запущена програма, або якась програма входу, або якась оболонка, як bash. Якщо ви хочете взаємодії, вам або доведеться замінити програму входу на вашу або сказати оболонці запускати програму так, як ніби програма запускалася з командного рядка.

Більш простим рішенням, IMO, було б розпочати tmuxсеанс після входу на другий екран, а потім використовувати:

tmux send yourcommand ENTER

запустити програму в tmuxсеансі, який відображатиметься після переходу на другий термінал.


2

Я щойно зробив відкриття:

Як я можу запускати програми з 2-х тис.на момент запуску?

В одному з коментарів згадується щось назване openvt. Ця команда, як видається, робить саме те, за чим я пішов!

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

Якщо ніхто не знає іншого, я думаю, що це , мабуть, "правильний" спосіб зробити це.

(Я просто спробував це, і, здається, він працює добре - навіть незважаючи на те, що gettyвін працює, він вибирає наступний невикористаний термінал. Я думаю, що ВТ не відкриваються, поки ви не перейдете на один, щоб спробувати увійти ...)


0

я запускаю новий графічний сеанс на vt5 командою follow

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

наприклад :

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

Якщо ви хочете запустити графічну програму на вже активному графічному сеансі, ви можете:

DISPLAY=:0 "/usr/bin/playonlinux"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.