/bin 或 /usr/bin 中的程序是否必须从 shell 调用?

/bin 或 /usr/bin 中的程序是否必须从 shell 调用?

我从搜索栏启动了 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/initPID 为 1(你的情况就是如此systemd),没有关联的 控制终端. 事实上,守护进程进程没有控制终端。Linux 上的所有进程都是通过两个系统调用启动的 -fork()exec()- 首先创建原始进程的“副本”,然后通过exec()运行可执行文件、应用程序/bin/usr/bin或您指定的任何其他位置。守护进程可以做同样的事情。

因此,从理论上讲,我可以创建一个没有控制终端(没有 tty)的守护进程,但我可以使用然后fork()exec()运行某些东西/usr/bin。当然,我调用的命令必须能够做到这一点 - 某些命令需要有控制 TTY 才能工作。

在这个问题中,似乎最大的混淆是 shell 与 tty 相同,但是它们是不同的 -tty指定一个设备(真实的或虚拟的),而 shell - 它是一个与用户和系统交互以执行某些功能/操作的过程。


Shell 与 tty

请注意,进程名称是-gnome-shell,2741Gnome 外壳是 GUI shell,它与典型的基于文本的命令解释器(如bash或 )有很大不同ksh。您可以启动应用程序、文件、窗口,但与基于文本的 shell 相比,您更多地通过快捷方式和鼠标与其交互。

您使用的 TTY/dev/pts/0/dev/tty2是完全不同的两件事。通常/dev/ttyXX表示控制台驱动程序,并且/dev/tty2是也与特殊 TTY 驱动程序关联的设备文件。/dev/tty[1-xx]通常表示虚拟控制台,可以通过 ++ 访问CtrlAlt默认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这些设备读取和发送数据的速度。

也可以看看

相关内容