当前位置: 首页 > news >正文

Linux:终端(terminal)与终端管理器(agetty)

终端的设备文件

        打开/dev目录可以发现其中有许多字符设备文件,例如对于我的RedHat操作系统,拥有tty0到tty59,它们是操作系统提供的终端设备。对于tty1-tty12使用ctrl+alt+F*可以进行快捷切换,下面的命令可以进行通用切换。

sudo chvt 13

        /dev/pts是伪终端设备目录,伪终端(Pseudo-Terminal Slave, PTS)是虚拟终端的一种,用于提供通过软件模拟的终端设备。/dev/pts中的字符设备文件对应打开的伪终端会话(例如,当你通过SSH登录或在GUI界面右击选择Open Terminal创建终端(GNOME Terminal)时,系统会自动创建一个伪终端设备)。

        使用ps -el命令,可以查看进程运行在哪个终端上,如下所示。

# GUI界面创建终端(GNOME Terminal)查询 
[zhangchen@EDA ~]$ ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
***
4 R     0   2606   1957  1  80   0 - 92017 ?      tty1     00:00:08 X
0 D  1000   5802      1  4  80   0 - 187419 flush_ ?       00:00:00 gnome-terminal
0 S  1000   5815   5802  0  80   0 - 29251 do_wai pts/0    00:00:00 bash
***

        GUI界面运行在tty1终端上(默认行为),而在GUI界面创建终端(GNOME Terminal)并运行Bash时,系统自动创建了伪终端设备pts/0。

终端的切换

        当切换到tty2-tty6时,会发现图1所示的CLI界面提示登录;但切换到tty6以上时,却只有如图2所示的空白界面。

图1 CLI界面

图2 空白界面

        这是因为切换到tty2-tty6时,系统自动在相应终端创建了一个agetty进程用于管理终端登录,如下所示。这是在切换后自动进行的,也就是说如果不进行切换,则不会创建agetty进程。

# 当使用ctrl+alt+F2切换后,回到GUI界面创建终端(GNOME Terminal)查询
[zhangchen@EDA ~]$ ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
***
4 R     0   2606   1957  1  80   0 - 89542 ?      tty1     00:00:12 X
0 D  1000   5802      1  1  80   0 - 189988 flush_ ?       00:00:01 gnome-terminal
0 S  1000   5815   5802  0  80   0 - 29251 do_wai pts/0    00:00:00 bash
4 S     0   6069      1  0  80   0 - 27551 n_tty_ tty2     00:00:00 agetty
***

        但对于tty6以上,则不会自动创建agetty进程需要人为创建,需要使用下面的命令进行人为出那个键,此时再切换到tty7,则会有和图1一样的登录界面。

# 创建tty7的agetty进程
[zhangchen@EDA ~]$ sudo systemctl start getty@tty7.service
# 创建tty7的agetty进程后再查询
[zhangchen@EDA ~]$ ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
***
4 S     0   2606   1957  1  80   0 - 89542 ep_pol tty1     00:00:18 X
0 R  1000   5802      1  1  80   0 - 190042 -     ?        00:00:03 gnome-terminal
0 S  1000   5815   5802  0  80   0 - 29251 do_wai pts/0    00:00:00 bash
4 S     0   6069      1  0  80   0 - 27551 n_tty_ tty2     00:00:00 agetty
4 S     0   6491      1  0  80   0 - 27551 n_tty_ tty7     00:00:00 agetty
***

        下面的命令用于杀死某个终端的agetty进程,这会导致所有用户创建的进程都被杀死。

# 杀死tty7的agetty进程
[zhangchen@EDA ~]$ sudo systemctl stop getty@tty7.service

        使用下面的命令管理agetty进程在Linux启动时相应终端的自动创建。

# 允许启动时agetty进程在tty7自动创建
[zhangchen@EDA ~]$ sudo systemctl enable getty@tty7.service # 
# 取消启动时agetty进程在tty7自动创建
[zhangchen@EDA ~]$ sudo systemctl disable getty@tty7.service
# 查询启动时agetty进程在tty7自动创建
[zhangchen@EDA ~]$ systemctl is-enabled getty@tty7.service

        使用下面的命令可以查询某个终端上的agetty进程的情况,可以从其中的active看出,此时agetty进程正在运行。

# 查询tty2上的agetty进程的情况
[zhangchen@EDA ~]$ systemctl status getty@tty2.service
● getty@tty2.service - Getty on tty2Loaded: loaded (/usr/lib/systemd/system/getty@.service; enabled; vendor preset: enabled)Active: active (running) since Sun 2024-09-22 18:12:50 CST; 6min agoDocs: man:agetty(8)man:systemd-getty-generator(8)http://0pointer.de/blog/projects/serial-console.htmlMain PID: 6069 (agetty)CGroup: /system.slice/system-getty.slice/getty@tty2.service└─6069 /sbin/agetty --noclear tty2 linux

        当在某个终端上成功登录后,此时再查询其agetty进程的情况,会有些许不同,可以看出agetty进程被login进程替换了(PID不变),如下所示。

# 在tty2登录成功后,再查询tty2上的agetty进程的情况
[zhangchen@EDA ~]$ systemctl status getty@tty2.service
● getty@tty2.service - Getty on tty2Loaded: loaded (/usr/lib/systemd/system/getty@.service; enabled; vendor preset: enabled)Active: active (running) since Sun 2024-09-22 18:12:50 CST; 7min agoDocs: man:agetty(8)man:systemd-getty-generator(8)http://0pointer.de/blog/projects/serial-console.htmlMain PID: 6069 (login)CGroup: /system.slice/system-getty.slice/getty@tty2.service‣ 6069 login -- zhangchen

        此时bash运行在tty2上,它的父进程是被进程替换后的login,如下所示。

# 在tty2登录成功后,再查询
[zhangchen@EDA ~]$ ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
***
4 S     0   2606   1957  2  80   0 - 89542 ep_pol tty1     00:00:31 X
0 D  1000   5802      1  0  80   0 - 190042 flush_ ?       00:00:06 gnome-terminal
0 S  1000   5815   5802  0  80   0 - 29251 do_wai pts/0    00:00:00 bash
4 S     0   6069      1  0  80   0 - 34137 do_wai ?        00:00:00 login
4 S  1000   6960   6069  0  80   0 - 29293 n_tty_ tty2     00:00:00 bash
***

        下面的命令可以查询所有正在运行的agetty进程(即使已成功登录,仍然能查询到)。

[zhangchen@EDA ~]$ systemctl list-units --type=service | grep getty
getty@tty2.service                 loaded active running Getty on tty2

        顺带一提,如果某个终端正常退出登录(exit)后,agetty进程在该终端又会重新出现,但此时PID就是不同的了,如下所示。

# 在tty2退出登录后,再查询tty2上的agetty进程的情况
[zhangchen@EDA ~]$ systemctl status getty@tty2.service
● getty@tty2.service - Getty on tty2Loaded: loaded (/usr/lib/systemd/system/getty@.service; enabled; vendor preset: enabled)Active: active (running) since Sun 2024-09-22 18:29:46 CST; 23s agoDocs: man:agetty(8)man:systemd-getty-generator(8)http://0pointer.de/blog/projects/serial-console.htmlMain PID: 8212 (agetty)CGroup: /system.slice/system-getty.slice/getty@tty2.service└─8212 /sbin/agetty --noclear tty2 linux

        如果已经在tty2成功登陆再执行下面的命令,则会导致该终端由用户登录后创建的进程都被杀死(如果是tty2-tty6,再次切换到它时系统又会自动在相应终端创建了一个agetty进程,否则如图2所示)。

# 杀死tty2的agetty进程
[zhangchen@EDA ~]$ sudo systemctl stop getty@tty2.service

        在终端中使用startx命令,会创建一个新的GUI界面(不论是在CLI还是GUI界面创建的终端)。

# 创建GUI子进程
[zhangchen@EDA ~]$ startx

        如果使用下面的命令在tty1创建一个agetty进程,会导致原本的GUI界面被杀死。

# 创建tty1的agetty进程
[zhangchen@EDA ~]$ sudo systemctl start getty@tty1.service
http://www.lryc.cn/news/443914.html

相关文章:

  • 钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句
  • 微信小程序点赞动画特效实现
  • Day25笔记-普通文件读写with上下文二进制文件csv文件
  • MySQL安装教程
  • 【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件
  • 『正版软件』XYplorer 专业的 Windows 文件管理工具软件
  • “吉林一号”宽幅02B系列卫星
  • 我的AI工具箱Tauri版-FasterWhisper音频转文本
  • Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略
  • Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题
  • 互联网技术的持续演进:从现在到未来
  • vscode安装ESLint与Vetur插件后自动修复代码不生效
  • 2848、与车相交的点
  • 基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)
  • mybatis 配置文件完成增删改查(四) :多条件 动态sql查询
  • 先楫HPM6750 Windows下VSCode开发环境配置
  • 【JavaScript】LeetCode:41-45
  • 数据结构(Day18)
  • error: ‘InsertAtTop‘ was not declared in this scope
  • MySQL缓冲池详解
  • 【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过
  • How can I stream a response from LangChain‘s OpenAI using Flask API?
  • 什么是慢充优惠话费充值api?如何选择平台
  • 【MySQL 03】表的操作
  • 3、论文阅读:EnYOLO:一种基于图像增强的水下目标区域自适应实时检测框架
  • MYSQL面试知识点手册
  • 排序算法的分析和应用
  • iptables限制网速
  • ALSA ubuntu 编译
  • 【学习笔记】SSL/TLS证书安全机制之证书透明