Linux запустить процесс в другом tty

Обновлено: 06.07.2024

До того, как компьютер вышел, люди уже использовали устройство, называемое телетайп, для передачи информации между собой, которая выглядит следующим образом:

Два телетайпа соединены кабелем. На обоих концах кабеля могут быть устройства, похожие на модемы (не указывайте их здесь). Когда вы набираете клавиатуру на телетайпе на одном конце, соответствующие данные будут отправлены телетайпу на другом конце. Я не знаю много о функции. (Я думаю, в моей голове, что изображение напечатано на одном конце и напечатано на другом конце)

1.2 После появления компьютеров, поддерживающих многозадачность

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

Есть две основные причины использования телетайпа (личное мнение):

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

Сеть телетайпа является относительно зрелой, и ее удобно подключать.

Таким образом, связь развивается так:

Терминал слева - это множество телетайпов

Модем используется по обе стороны от физической линии, что мы часто называем «кошкой», потому что сеть постепенно развивается, и каждый может разделить соединение. (Предположительно, это может быть неправильно)

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

1.3 Подсистема ядра TTY

Для поддержки этих телетайпов компьютер спроектировал подсистему с именем TTY со следующей внутренней структурой:

Интерфейс драйвера UART с внешним устройством UART

Линейная дисциплина в основном заключается в некоторой обработке входных и выходных данных, можно понять, что она является частью драйвера TTY

Драйвер TTY используется для обработки различных оконечных устройств

Процессы в пользовательском пространстве взаимодействуют с терминалом через драйвер TTY

Для простоты драйвер UART и дисциплина Line не перечислены отдельно в следующем введении, их можно рассматривать как часть драйвера TTY

1.4 TTY оборудование

Для каждого терминала драйвер TTY создаст соответствующее ему устройство TTY. Если подключено несколько терминалов, это выглядит так:

Когда драйвер получает терминальное соединение, он создаст соответствующее tty-устройство в соответствии с моделью и параметрами терминала (имя устройства на рисунке выше называется ttyS0, потому что большинство терминальных соединений являются последовательными соединениями), потому что каждый терминал может Не то же самое, с их собственными специальными командами и привычками использования, поэтому конфигурация каждого устройства tty может быть разной. Например, когда вы нажимаете клавишу удаления, некоторые могут удалить предыдущий символ, а некоторые могут удалить задний символ. Если вы не сконфигурируете права, это приведет к тому, что некоторые клавиши не будут соответствовать вашему желанию. Это также, когда мы используем аналоговый терминал. Если конфигурация по умолчанию не соответствует нашим привычкам, вам необходимо выполнить некоторые личные настройки.

Позже, с непрерывным развитием компьютеров, эти типы оборудования телетайпа постепенно исчезли. Нам больше не нужно специальное оконечное оборудование. У каждой машины есть своя клавиатура и дисплей. Каждая машина может быть терминалом других машин. ssh для достижения, но архитектура драйвера TTY ядра не изменилась. Мы хотим взаимодействовать с процессами в системе через ввод-вывод, или нам нужно пропустить устройство TTY, поэтому появилось различное программное обеспечение эмуляции терминала, и эмуляция также распространена. Несколько терминалов, таких как VT100, VT220, XTerm и др.

Вы можете получить список всех типов терминалов, поддерживаемых системой, с помощью команды toe -a

Вы можете использовать команду infocmp для сравнения различий между двумя терминалами, например, infocmp vt100 vt220 выведет разницу между vt100 и vt220.

Прежде чем обсуждать, как создаются и настраиваются устройства TTY, давайте посмотрим, как TTY используется процессами:

Сначала используйте команду tty, чтобы увидеть, с каким tty связан текущий bash

Посмотрите, какие процессы открыты tty

$ echo aaa > /dev/pts/8
aaa

Оч тоже tty устройство, и их отношения будут представлены позже

Как видно из вышеприведенного lsof, stdin (0u), stdout (1u) и stderr (2u) текущих процессов bash и lsof связаны с этим TTY.

Ниже приведена структурная схема взаимодействия между tty и процессом и устройством ввода-вывода:

Tty можно понимать как канал, а содержимое, записанное на одном конце, может быть прочитано с другого конца, и наоборот.

Здесь ввод и вывод могут быть просто поняты как клавиатура и монитор, и то, что будет связано с вводом / выводом в различных ситуациях, будет описано позже.

В tty есть очень важный атрибут, называемый группой процессов Foreground, который записывает текущую интерфейсную группу процессов. Концепция группы процессов будет представлена ​​в следующей статье, где мы можем просто подумать, что в группе процессов есть только один процесс.

Когда pts / 1 получает входные данные от входа, он проверяет, какая из них является текущей внешней группой процессов, а затем помещает входные данные во входной буфер лидера группы процессов, чтобы соответствующий процесс лидера мог получить ввод пользователя через функцию чтения.

Когда процессы в группе внешних процессов записывают данные на tty-устройство, tty выводит данные на устройство вывода

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

Сначала киньте два вопроса (ответ есть позже):

  • Что происходит, когда процесс (фоновый процесс) в группе внешних процессоров записывает данные на tty-устройство? Будет ли вывод на outpu?
  • Что происходит, когда процесс (фоновый процесс) в группе внешних процессоров считывает данные с tty-устройства? Будет ли процесс блокироваться?

Далее описывается, как создать tty-устройство в нескольких распространенных ситуациях, и каковы устройства ввода и вывода.

Монитор клавиатуры подключен напрямую (терминал)
Посмотрите на картинку, прежде чем говорить:

Клавиатура и монитор подключены к эмулятору терминала в ядре. Эмулятор определяет количество создаваемых ttys. Например, когда вы набираете ctrl + alt + F1 на клавиатуре, эмулятор сначала захватывает ввод, а затем активирует tty1, чтобы ввод с клавиатуры Он будет перенаправлен на tty1, а вывод tty1 будет перенаправлен на дисплей.Так же, используйте ctrl + alt + F2 для переключения на tty2.

Когда эмулятор активирует tty, если он обнаруживает, что с ним не связан ни один процесс, это означает, что он впервые открывает tty, поэтому он запустит сконфигурированный процесс и свяжется с tty. Обычно процесс является процессом, ответственным за вход в систему.

При переключении на tty2, где будет выводиться вывод в tty1? Вывод tty1 по-прежнему будет выводиться в эмулятор. В эмуляторе будет кэш каждого tty. Однако из-за ограниченного пространства кэш-памяти эмулятора, когда вы в следующий раз вернетесь к tty1, вы сможете увидеть только самый последний вывод, предыдущий вывод Ушел

Не уверен, какому конкретному модулю в ядре соответствует эмулятор терминала, но должна быть такая вещь

Терминал здесь может быть программой из любой точки мира, например, замазкой в ​​Windows, поэтому я не буду обсуждать, как клиентская программа терминала взаимодействует с клавиатурой и дисплеем. Так как Терминал должен иметь дело с сервером ssh, он должен реализовать клиентскую функцию ssh.

Здесь установление соединения, а также отправка и получение данных объясняются в двух строках.Для краткого описания вместо программы ssh-сервера используется sshd:

4.1 Установление связи

Терминал просит установить соединение с sshd

Если проверка пройдена, sshd создаст новый сеанс

Вызовите API (posix_openpt ()), чтобы запросить ptmx для создания pts. После успешного создания sshd получит fd, связанный с ptmx, и свяжет fd с сеансом.

  1. В то же время sshd создает процесс оболочки и связывает вновь созданные очки с оболочкой.

Терминал получает ввод с клавиатуры, а Терминал отправляет данные в sshd по протоколу ssh.

После получения данных от клиента sshd находит соответствующий fd на ptmx, соответствующий клиенту, в соответствии с сеансом, которым он управляет.

Запишите данные, отправленные клиентом в найденный файл

После получения данных ptmx находит соответствующие точки в соответствии с fd (соответствующая взаимосвязь автоматически поддерживается ptmx) и перенаправляет пакет данных в соответствующие точки

После получения пакета данных pts проверяет текущую группу внешних процессов, связанную с ним, и отправляет пакет данных руководителю группы процессов.

Поскольку на pts есть только оболочка, функция чтения оболочки получает пакет

Оболочка обрабатывает полученные пакеты данных, а затем выводит результаты обработки (может не выводиться)

Оболочка записывает результат в pts через функцию записи

pts пересылает результат в ptmx

ptmx находит соответствующий fd согласно pts и записывает результат в fd

После получения результата fd sshd находит соответствующий сеанс и отправляет результат соответствующему клиенту.

Из вышеприведенного процесса должно быть видно, что для программ пользовательского пространства они ничем не отличаются, они одинаковы: из ядра другой конец pts подключен к ptmx, а другой конец tty подключен Это эмулятор терминала ядра. Как ptmx, так и эмулятор терминала отвечают только за поддержание сеансов и пересылку пакетов данных, посмотрите на другой конец ptmx и эмулятор терминала ядра. Другой конец ptmx подключен к приложениям пользовательского пространства, таким как sshd Tmux и т. Д., А другой конец эмулятора терминала ядра подключен к определенному оборудованию, например клавиатуре и монитору.

7.1 rows 51; columns 204;

Эта конфигурация обычно контролируется терминалом. Когда размер окна терминала изменяется, конфигурация должна быть изменена определенными средствами. Например, есть параметр для изменения размера окна в протоколе ssh. После получения запроса клиента sshd изменит tty через API Этот параметр затем сообщается tty внешней программе (такой как shell или vim) через сигнал SIGWINCH.После получения сигнала внешняя программа считывает этот параметр tty и затем знает, как отрегулировать свою схему вывода.

7.2 intr = ^C

В дополнение к пересылке данных между терминалом и внешним процессом tty также поддерживает множество команд управления. Например, если терминал вводит CTRL + C, tty не пересылает входную строку во внешний процесс, но преобразует ее в сигнал SIGINT и отправляет ее. Дай фронтэнд процесс. Это используется для настройки входной комбинации, соответствующей команде управления. Например, мы можем настроить «intr = ^ E» для использования CTRL + E вместо CTRL + C.

В этом кратком руководстве описывается, как переключаться между TTY без функциональных клавиш в Unix-подобных операционных системах.

Прежде чем идти дальше, мы посмотрим, что такое TTY.

Как упоминалось в ответе на форуме AskUbuntu, слово TTY появилось из TeleTYpewriter.

Еще в ранние дни Unix пользовательские терминалы, подключенные к компьютерам, были электромеханическими телепринтерами или телетайпами (tty вкратце).

С тех пор имя TTY продолжает использоваться для консолей с текстом. В настоящее время все текстовые консоли представляют собой виртуальные консоли, а не физические консоли. Команда TTY печатает имя файла терминала, подключенного к стандартному входу.

Переключение между TTY в Linux

По умолчанию в Linux есть 7 tty.

Вы можете переключаться между различными TTY, используя клавиши CTRL + ALT + Fn.

Например, чтобы переключиться на tty1, мы набираем CTRL + ALT + F1.

Вот как выглядит tty1 на сервере Ubuntu 18.04 LTS.


Если ваша система не имеет сеанса X, просто введите Alt + Fn. Вам не нужно использовать CTRL.

В некоторых версиях Linux (например, с Ubuntu 17.10 и далее) на экране входа в систему теперь используется виртуальная консоль 1.

Таким образом, вам нужно нажать CTRL + ALT + F3 до CTRL + ALT + F6 для доступа к виртуальным консолям.

Чтобы вернуться в среду рабочего стола, нажмите CTRL + ALT + F2 или CTRL + ALT + F7 на Ubuntu 17.10 и более поздних версиях.

До сих пор мы видели, что мы можем легко переключаться между TTY, используя CTRL + ALT + Function_Key (F1-F7).

Однако, если вы не хотите использовать клавиши функций по какой-либо причине, в Linux есть простая команда с именем chvt.

chvt описание

Команда «chvt N» позволяет вам переключиться на терминал N переднего плана, так же, как нажать CTRL + ALT + Fn.

Соответствующий экран создается, если он еще не существует.

Посмотрим, напечатаем ли система текущий tty:

Пример вывода с моего сервера Ubuntu 18.04 LTS.

Теперь перейдем к tty2. Для этого введите:

Помните, что вам нужно использовать «sudo» с командой chvt.

Теперь проверьте текущий tty с помощью команды:

Вы увидите, что tty теперь изменился.

Аналогичным образом, вы можете переключиться на tty3, используя «sudo chvt 3», tty4, используя «sudo chvt 4» и так далее.

Команда Chvt может быть полезна, когда какая-либо из ваших функциональных клавиш не работает.

Чтобы просмотреть общее количество активных виртуальных консолей, запустите:

Как вы можете видеть, в моей системе есть два активных VT.

Вы можете увидеть следующий нераспределенный виртуальный терминал, используя команду:

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

Чтобы избавиться от неиспользуемых VT, просто введите:

Вышеупомянутая команда освобождает память ядра и структуры данных для всех неиспользуемых виртуальных консолей.

Чтобы сказать проще, эта команда освободит все ресурсы, связанные с неиспользуемыми виртуальными консолями.

Для получения дополнительной информации см. Справочные страницы соответствующей команды.

Сразу к делу, как сделать автоматическим вход в систему например на tty1 и как соответственно сделать так, что бы по умолчанию был этот самый tty1. ОС Ubuntu mate 15.10.3. И хотелось бы добавить, что она установлена на rasbperry pi 2 и по этому это не совсем полноценная Ubuntu.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Загрузка WinXP c нужного HDD
Не обессудьте, в общем. Я профан в компьютерном железе, но профан способный, поэтому надеюсь на.

Загрузка нужного куска кода
Всем привет! Подскажите, как сделать, чтобы по клику грузился нужный код. У меня таблица из трех.

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

Доброго времени суток.
ОС Ubuntu mate 15.10.3. И хотелось бы добавить, что она установлена на rasbperry pi 2 и по этому это не совсем полноценная Ubuntu. Не пользуйтесь неполноценной операционной системой.

ps и не читайте перед завтраком советских газет.

Файла /etc/init/tty1.conf нет и в папке init.d тоже, я установил программу, сам создал этот файл, но это конечно не дало плодов
По второму способу, такого пути нет /etc/inittab

Я находил много подобных способов, но в данной убунте всё немного не так, она так сказать "попроще"
Мне нужно в итоге запустить программу .exe, mono с этим прекрасно справляет, но если установить команду на запуск в автозагрузки etc/profile.d то tty7 графический перестаёт работать, можно из любой другой зайти, автозагрузка сработает, но мне нужно что бы это было автономно

Через интерфес добавления в автозапуск тоже не получается, в этом случае просто ничего не происходит

Есть какой-нибудь толковый способ сделать на машине автозапуск, хотя бы через графическую оболочку?
Или может я не правильно добавляю как-то в etc/profile.d ведь через консоль после ввода логина и пароля программа сама начинает работу

Я сейчас напишу как я сделал, прошу больно камнями в меня не кидать, может у кого-то тоже есть raspberry pi 2 с этой убогонькой ubuntu

В терминале нужно зайти в настройки профиля и поставить 2 галки "Запускать команду как оболочку входа" и "Запускать другую команду вместо моей оболочки" ну и указать соответственно путь к вашему скрипту или *.exe

Любые другие средства в данной ununtu не подходят, проверенно недельным опытом и даже умудрился пару раз убить ОС меняя её конфиги. Это конечно всё-таки через графическую оболочку, но это лучше чем ничего. Хоть и сам разобрался, всё же спасибо за ответы. Я думаю тема закрыта.

Sergey_Crusher, вообще-то, имхо конечно, но когда вы пытаетесь задавать вопросы, БОЛЬШЕ ПОЛЬЗЫ бывает, когда вопрос относится к "цели", а не ко "средствам". по крайней мере, начали вы (как говорится в старой пословице) "за здравие":

Я продолжаю слышать об этих вещах, известных как tty "S.

как я могу получить к ним доступ

4 ответа

tty это одна из тех забавных команд Unix, которая печатает имя терминала, подключенного к стандартному вводу.

По умолчанию Ubuntu имеет 7 tty.

  • Вплоть до Ubuntu 17.10, 1-6 только командная строка и 7 запускает ваш сеанс X (ваш обычный рабочий стол).
  • В Ubuntu 17.10 и новее экран входа в систему GUI включен 1 , Графический рабочий стол на 2 и командные строки на 3-7 ,

Чтобы получить к ним доступ, используйте эту комбинацию клавиш:

Ctrl + Alt + F1 (или F3 на 17.10 и новее)

(изменение F1 на F1-F6 для доступа к нужному терминалу)

Чтобы вернуться к сеансу графического интерфейса пользователя (обычный рабочий стол):

Ctrl + Alt + F7 (или F2 на 17.10 и новее)

Вы можете изменить отображаемый TTY в командной строке с помощью chvt (требуется sudo привилегии), например, из SSH. Вот соответствующая часть справочной страницы ( man chvt ):

CHVT (1)

НАЗВАНИЕ

chvt - изменить виртуальный терминал переднего плана

СИНТАКСИС

чвт н

ОПИСАНИЕ

Команда chvt N делает /dev/ttyN терминалом переднего плана. (Соответствующий экран создается, если он еще не существовал. Чтобы избавиться от неиспользуемых VT, используйте deallocvt) Сочетание клавиш (Ctrl-)LeftAlt-FN (с N в диапазоне 1-12) обычно имеет аналогичный эффект.

Tty, сокращение от teletype и, возможно, более часто называемое терминалом, - это устройство, которое позволяет вам взаимодействовать с системой, отправляя и получая данные, такие как команды и вывод, который они производят.

Существует множество типов ttys, но в настоящее время большинство ttys реализованы в программном обеспечении, например, в графических консолях, к которым вы можете получить доступ с помощью Ctrl+Alt+Fn, или в эмуляторах терминалов, таких как терминал Gnome, которые выполняются в сеансе X.

Также есть tty команда, которая показывает узел устройства терминала, в котором он работает (или печатает "не tty", если он не работает внутри терминала; да, можно запускать команды вне терминала). Например:

Когда я вошел в систему и запустил оболочку на машине, оболочка обычно работает внутри терминала, а именно здесь /dev/pts/0 , Тем не менее, когда я бегу ssh host command чтобы выполнить команду на удаленном хосте, команда не выполняется внутри терминала.

Это меняет ваше рабочее пространство: например, вы можете открыть текстовый файл и изменить его на tty2, тогда у вас может быть команда /ls для справки. Это очень полезно для такой среды, как Ubuntu Server.

Это эквивалентно открытию двух вкладок в среде графического интерфейса.

В Ubuntu Server (16.04.3 LTS - для меня) я могу использовать ALT + F1-F6 или использовать ALT + LeftArrow, чтобы вернуться назад, или ALT + RightArrow, чтобы перейти вперед.

Если ваш tty не отображается на экране входа в систему, вы можете запустить sudo nano /etc/issue и наверху вы можете вставить все, что захотите, но добавить tty, который вам нужно разместить \l , Место \n для имени хоста.

Читайте также: