我从搜索栏启动了 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 是从名为 的 GUI 实用程序调用的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 shell 是 GUI shell,
bash
是基于文本的 shell。它们也是进程,可以通过fork()
和exec()
调用启动新的进程。
任何已安装的软件是否必须从某种终端运行?
不,不是这样的。系统上第一个进程的/sbin/init
PID 为 1(你的情况就是如此systemd
),没有关联的 控制终端. 事实上,守护进程进程没有控制终端。Linux 上的所有进程都是通过两个系统调用启动的 -fork()
和exec()
- 首先创建原始进程的“副本”,然后通过exec()
运行可执行文件、应用程序/bin
和/usr/bin
或您指定的任何其他位置。守护进程可以做同样的事情。
因此,从理论上讲,我可以创建一个没有控制终端(没有 tty)的守护进程,但我可以使用然后fork()
从exec()
运行某些东西/usr/bin
。当然,我调用的命令必须能够做到这一点 - 某些命令需要有控制 TTY 才能工作。
在这个问题中,似乎最大的混淆是 shell 与 tty 相同,但是它们是不同的 -tty
指定一个设备(真实的或虚拟的),而 shell - 它是一个与用户和系统交互以执行某些功能/操作的过程。
Shell 与 tty
请注意,进程名称是-gnome-shell,2741
。Gnome 外壳是 GUI shell,它与典型的基于文本的命令解释器(如bash
或 )有很大不同ksh
。您可以启动应用程序、文件、窗口,但与基于文本的 shell 相比,您更多地通过快捷方式和鼠标与其交互。
您使用的 TTY/dev/pts/0
和/dev/tty2
是完全不同的两件事。通常/dev/ttyXX
表示控制台驱动程序,并且/dev/tty2
是也与特殊 TTY 驱动程序关联的设备文件。/dev/tty[1-xx]
通常表示虚拟控制台,可以通过 ++ 访问Ctrl。Alt默认F1-7情况下,有 到tty1
打开tty7
,Ubuntu 上的 GUI 默认为tty7
。在其他发行版中,GUI 可能位于不同的 tty 上,例如,如果我没记错的话,在 Fedora 中是tty1
。当然,有办法打开超过 7 个虚拟控制台。请参阅为什么有这么多虚拟控制台?
您在图形化 shell 中使用的终端窗口的每个打开的选项卡和每个新窗口 - 都将有 /dev/pts/x
文件关联。partpts
代表“伪终端”。这些涉及通过软件实现的控制台,并不代表真实的硬件,例如当您使用终端仿真器或 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
这些设备读取和发送数据的速度。