Запустите процесс на другом tty

31

Приблизительно после часа поиска в Google, я не могу поверить, что никто не задавал этот вопрос раньше ...

Итак, у меня есть скрипт, работающий на TTY1. Как заставить этот скрипт запускать произвольную программу на TTY2?

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

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

MathematicalOrchid
источник
От TTY1, Вы пробовали [command] > /dev/tty2(вы уже вошли в tty2)?
Pandya
1
это может быть проблема XY ... чего вы пытаетесь достичь? какова общая цель?
Оливье Дюлак

Ответы:

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

Пока ничто другое не использует другой TTY ( /dev/tty2в этом примере), это должно работать. Это включает gettyпроцесс, который может ждать, пока кто-то войдет в систему; имеющая более одного процесс чтения ввода из TTY будет приводить к неожиданным результатам.

setsid заботится о запуске команды в новом сеансе.

Обратите внимание, что вам commandпридется позаботиться о sttyправильной настройке параметров, например, включить «режим приготовления», onlcrчтобы при выводе новой строки добавлялся возврат каретки и т. Д.

wurtel
источник
2
Это не правильно. Вы перепутать контрольный терминал /dev/stdin, /dev/stdoutи /dev/stderr. psлегко показывает, что commandв вашем случае совсем нет управляющего терминала.
Хауке Лагинг
1
@HaukeLaging, руководитель сеанса получает контроль над терминалом, как только он его открывает. Проблема заключалась в том, что оконечное устройство не было открыто руководителем сеанса. Должно быть исправлено сейчас.
Стефан Шазелас
@ StéphaneChazelas Я проверял, sleep 1000и это все еще не работает здесь. Я использовал псевдотерминал (хотя, я полагаю, ничего не изменится).
Хауке Лагинг
@HaukeLaging Как именно ты это сделал? Разве этот терминал уже не управлял сеансом ( если ничто другое не использует другую часть TTY )?
Стефан Шазелас
1
@ StéphaneChazelas Я бегал setsid sh -c 'exec sleep 1000 <>/dev/pts/4 >&0 2>&1'в окне эмулятора терминала. /dev/pts/4другое окно эмулятора терминала (тот же пользователь, с bashзапущенным).
Хауке Лагинг
6

На втором tty обычно будет запущена программа, либо какая-либо программа входа в систему, либо какая-либо оболочка, например bash. Если вы хотите взаимодействия, вам нужно будет либо заменить программу входа своей, либо указать оболочке запустить программу, как если бы программа запускалась из командной строки.

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

tmux send yourcommand ENTER

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

Энтон
источник
2

Я только что сделал открытие:

Как я могу запускать приложения с 2 ттыс при запуске?

В одном из комментариев упоминается то, что называется openvt. Эта команда, кажется, делает именно то, что мне нужно!

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

Если никто не знает другого, я думаю, что это , вероятно, «правильный» способ сделать это.

(Я только что попробовал, и, похоже, он работает нормально - хотя gettyон работает, он выбирает следующий неиспользуемый терминал. Я думаю, VT не открываются, пока вы не переключитесь на один, чтобы попытаться войти ...)

MathematicalOrchid
источник
0

я начинаю новый графический сеанс на VT5 с помощью следующей команды

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

например :

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

Если вы хотите запустить графическое приложение в уже активном графическом сеансе, вы можете сделать с помощью:

DISPLAY=:0 "/usr/bin/playonlinux"
inukaze
источник