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相关文章:
Linux:终端(terminal)与终端管理器(agetty)
终端的设备文件 打开/dev目录可以发现其中有许多字符设备文件,例如对于我的RedHat操作系统,拥有tty0到tty59,它们是操作系统提供的终端设备。对于tty1-tty12使用ctrlaltF*可以进行快捷切换,下面的命令可以进行通用切换。 sudo ch…...
钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句
钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句 接入系统:钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工…...
微信小程序点赞动画特效实现
这里提供两种实现点赞动画特效的方法: 方法一:使用 CSS 动画 wxml 文件: <view class"like-container"><image src"{{isLiked ? likedImg : unlikedImg}}" class"like-icon {{isLiked ? liked : }}" bindta…...
Day25笔记-普通文件读写with上下文二进制文件csv文件
一、文件读写【重点掌握】 常见文件的读写分类: 1.普通文件文件,如txt,py,html等 2.二进制文件,如图片,音频,视频,压缩包等 3.csv文件,如csv,需要借助于系统模块csv 4.对…...
MySQL安装教程
MySQL安装教程 如果需要删除原有mysql,然后安装过新的,可以参照如何彻底卸载旧mysql重装测试 1. 准备资源 mysql官网直达:https://dev.mysql.com/downloads/mysql/ CADN:https://download.csdn.net/download/luocong321/89592962 …...
【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...
『正版软件』XYplorer 专业的 Windows 文件管理工具软件
在数字化时代,我们每天都在与各种文件打交道。无论是工作文档、个人照片还是多媒体资料,管理这些文件的效率直接关系到我们的工作效率和生活体验。今天,我要向大家推荐一款功能强大、操作简便的文件管理软件 —— XYplorer。 XYplorer&#x…...
“吉林一号”宽幅02B系列卫星
离轴四反光学成像系统 1.光学系统参数: 焦距:77.5mm; F/#:7.4; 视场:≥56゜; 光谱范围:400nm~1000nm。 2.说明: 光学系统采用离轴全反射式结构,整…...
我的AI工具箱Tauri版-FasterWhisper音频转文本
本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 FasterWhisper音频转文本服务 是自研AI工具箱Tauri版中的一款模块,专门用于将音频或视频中的语音内容自动转化为文本或字幕。通过简单的配置,该工具能够批量处理大量音频或视频文件&…...
Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略
Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在后端开发中,延迟队列(Delayed Queue)…...
Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题
问题: linux 在执行cp的命令的时候,就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因: 查看别名,alias命令,看到cp的别名为cp -i,那就是说cp本身就是自带覆盖提醒,就算我们加上-f 的…...
互联网技术的持续演进:从现在到未来
互联网技术的持续演进:从现在到未来 在过去的十年里,互联网技术发生了飞速变化。无论是大数据、人工智能,还是5G网络和物联网,每一种技术的突破都在改变我们的生活方式和工作模式。作为现代社会的核心驱动力,互联网技…...
vscode安装ESLint与Vetur插件后自动修复代码不生效
vscode安装ESLint与Vetur插件后自动修复代码不生效 1、安装ESLint 和 Vuter 2、运行结果 2.1、代码保存时代码中的分号;能被检测出来,但是不会自动修复 2.2、手动运行ESLint 修复命令(在终端中执行 npx eslint . --fix)可以修复问题 3、解决办法 在.vscode目录下setti…...
2848、与车相交的点
2848、[简单] 与车相交的点 1、题目描述 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。 返回数轴上被车 任意…...
基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...
mybatis 配置文件完成增删改查(四) :多条件 动态sql查询
文章目录 就是你在接收数据时,有的查询条件不写,也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时,有的查询条件不写,也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…...
先楫HPM6750 Windows下VSCode开发环境配置
用的是EVKmini,ft2232作为调试器jtag接口调试 启动start_gui.exe 以hello_world为例,更改一下build path,可以generate并使用gcc compile 最后会得到这些 点击start_gui里面的命令行,用命令行启动vscode 新建.vscode文件夹&…...
【JavaScript】LeetCode:41-45
文章目录 41 排序链表42 合并k个升序链表43 LRU缓存44 二叉树的中序遍历45 二叉树的最大深度 41 排序链表 递归 归并排序找到链表中心点,从中心点将链表一分为二。奇数个节点找中心点,偶数个节点找中心左边的点作为中心点。快慢指针找中心点,…...
数据结构(Day18)
一、周学习内容 1、9.18 数据结构(Day15)-CSDN博客 2、9.19 数据结构(Day16)-CSDN博客 3、9.20 链表 目的 插入删除不需要移动任何节点(元素)。 不需要预估存储空间大小,长度动态增长或减小。…...
error: ‘InsertAtTop‘ was not declared in this scope
Qt编译错误记录: 报错:error: ‘InsertAtTop’ was not declared in this scope ui->comboBoxJob->setInsertPolicy(InsertAtTop);这行代码在Qt中编译就会报这个错误,原因是输入参数需要加类名限定,改为: ui-…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
