Должны ли программы из /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
в котором эти устройства читают и отправляют данные.