Должны ли программы из /bin или /usr/bin вызываться из оболочки?

Я запустил Chrome и Firefox из панели поиска и обнаружил, что они также открываются из терминала

$ pstree -aps 5221 | head -10
systemd,1 splash
  `-gdm3,1027
      `-gdm-session-wor,2418
          `-gdm-x-session,2529 --run-script env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --session=ubuntu
              `-gnome-session-b,2545 --session=ubuntu
                  `-gnome-shell,2741
                      `-chrome,5221    
                          |-cat,5227
                          |-cat,5228
                          |-chrome,5232

Chrome был вызван из утилиты с графическим интерфейсом gnome-shell,

Должно ли какое-либо установленное программное обеспечение запускаться из терминала?

Кроме того, я обнаружил, что терминал, с которым я работаю, не назван tty но

$ tty
/dev/pts/0

и не может общаться с tty2

$ echo "very strange long text" > /dev/tty2
$ grep -r  'very strange long text' /   2>/dev/null 

Тем не мение, grep не возвращает отправленное сообщение. Текст к tty2 потерян.

1 ответ

Решение

Нужен ли процесс терминалу?

Есть несколько вещей, которые вам нужно понять, чтобы ответить на этот вопрос:

  • /usr/bin а также /bin содержать исполняемые файлы
  • Оболочка является интерфейсом для пользователя - она ​​выполняет команды или выполняет функции, которые хочет пользователь; это как рычаги и переключатели на машине - вы нажимаете рычаг, и машина что-то делает
  • Оболочка GNOME - это оболочка GUI, bash текстовая оболочка Они также являются процессами и могут запускать новые через fork() а также exec() звонки.

Должно ли какое-либо установленное программное обеспечение запускаться из терминала?

Нет, не совсем. Самый первый процесс в системе, /sbin/init с PID 1 (и это systemd в вашем случае), не имеет связанного управляющего терминала. На самом деле, у процесса- демона нет управляющего терминала. Все процессы в Linux запускаются с помощью двух системных вызовов - fork() а также exec() - где вы сначала создаете "копию" исходного процесса, а затем через exec() вы запускаете исполняемый файл, приложения в /bin а также /usr/binили любое другое место, которое вы укажете. Демоны могут делать то же самое.

Теоретически, я мог бы создать процесс-демон, у которого нет управляющего терминала - нет tty - и все же я мог бы использовать fork() а потом exec() запустить что-то из /usr/bin, Конечно, команда, которую я вызываю, должна быть в порядке с этим - некоторые команды требуют наличия контрольного TTY для работы.

В этом вопросе, кажется, большая путаница в том, что shell такой же, как tty, однако они разные - tty обозначает устройство (реальное или виртуальное), а оболочка - это процесс, который взаимодействует с пользователем и системой для выполнения определенных функций / действий.


Shell vs tty

Обратите внимание, что имя процесса -gnome-shell,2741, Gnome Shell - оболочка графического интерфейса, она сильно отличается от типичного текстового интерпретатора команд, такого как bash или же ksh, Вы можете запускать приложения, файлы, окна, хотя вы взаимодействуете с ним с помощью ярлыков и мыши гораздо чаще, чем с текстовой оболочкой.

TTY, который вы используете /dev/pts/0 а также /dev/tty2 это две разные вещи полностью. В общем-то /dev/ttyXX указывает драйвер консоли, и /dev/tty2 это файл устройства, который также связан со специальным драйвером TTY. /dev/tty[1-xx] обычно обозначают виртуальные консоли, к которым можно получить доступ через Ctrl+Alt+F1-7. По умолчанию есть tty1 в tty7 открытый, с GUI на Ubuntu по умолчанию tty7, В других дистрибутивах GUI может быть на другом tty, например, если я правильно помню, в Fedora это было tty1, Конечно, есть способы открыть более 7 виртуальных консолей. Посмотрите, почему так много виртуальных консолей?

Каждая открытая вкладка и каждое новое окно окна терминала, которое вы используете в графической оболочке - это будет иметь /dev/pts/x файл связан. pts часть расшифровывается как "псевдотерминал". Они связаны с консолями, которые реализованы с помощью программного обеспечения и не представляют реального оборудования, например, когда вы используете эмулятор терминала или соединение SSH.

Также важно отметить, что такие оболочки как bash не tty, то /dev/tty2 это устройство, драйвер которого связан с ним. /bin/bash является исполняемым файлом и выполняется как сама команда. Пока в ядре есть процессы, которые управляют /dev/tty2 это не процесс; в отличие от /bin/bash это процесс, который вы можете начать. И это на самом деле то, что происходит, когда вы открываете терминал - окно вашего терминала запускается /bin/bash как процесс.

И, конечно же, вы можете написать /dev/tty2 или же /dev/pts/0 Если у вас есть разрешение. Например, чтобы использовать /dev/ttyUSB0 или же /dev/ttyACM0 чтобы написать в Arduino или другую встроенную систему, вы должны принадлежать dialout группа, которой принадлежат эти специальные устройства. Эти два устройства эмулируют последовательную консоль, поэтому вы можете отправлять данные на подключенные устройства или программировать их. В случае таких специальных аппаратных устройств, вы также должны учитывать скорость или baud rate в котором эти устройства читают и отправляют данные.

Смотрите также

Другие вопросы по тегам