当前位置: 首页 > 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

相关文章:

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

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

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句 接入系统:钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工…...

微信小程序点赞动画特效实现

这里提供两种实现点赞动画特效的方法&#xff1a; 方法一&#xff1a;使用 CSS 动画 wxml 文件: <view class"like-container"><image src"{{isLiked ? likedImg : unlikedImg}}" class"like-icon {{isLiked ? liked : }}" bindta…...

Day25笔记-普通文件读写with上下文二进制文件csv文件

一、文件读写【重点掌握】 常见文件的读写分类&#xff1a; ​ 1.普通文件文件,如txt&#xff0c;py&#xff0c;html等 ​ 2.二进制文件&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;压缩包等 ​ 3.csv文件&#xff0c;如csv,需要借助于系统模块csv ​ 4.对…...

MySQL安装教程

MySQL安装教程 如果需要删除原有mysql&#xff0c;然后安装过新的&#xff0c;可以参照如何彻底卸载旧mysql重装测试 1. 准备资源 mysql官网直达&#xff1a;https://dev.mysql.com/downloads/mysql/ CADN&#xff1a;https://download.csdn.net/download/luocong321/89592962 …...

【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

『正版软件』XYplorer 专业的 Windows 文件管理工具软件

在数字化时代&#xff0c;我们每天都在与各种文件打交道。无论是工作文档、个人照片还是多媒体资料&#xff0c;管理这些文件的效率直接关系到我们的工作效率和生活体验。今天&#xff0c;我要向大家推荐一款功能强大、操作简便的文件管理软件 —— XYplorer。 XYplorer&#x…...

“吉林一号”宽幅02B系列卫星

离轴四反光学成像系统 1.光学系统参数&#xff1a; 焦距&#xff1a;77.5mm&#xff1b; F/#&#xff1a;7.4&#xff1b; 视场&#xff1a;≥56゜&#xff1b; 光谱范围&#xff1a;400nm&#xff5e;1000nm。 2.说明&#xff1a; 光学系统采用离轴全反射式结构&#xff0c;整…...

我的AI工具箱Tauri版-FasterWhisper音频转文本

本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 FasterWhisper音频转文本服务 是自研AI工具箱Tauri版中的一款模块&#xff0c;专门用于将音频或视频中的语音内容自动转化为文本或字幕。通过简单的配置&#xff0c;该工具能够批量处理大量音频或视频文件&…...

Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略

Java后端中的延迟队列实现&#xff1a;使用Redis与RabbitMQ的不同策略 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在后端开发中&#xff0c;延迟队列&#xff08;Delayed Queue&#xff09…...

Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题

问题&#xff1a; linux 在执行cp的命令的时候&#xff0c;就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因&#xff1a; 查看别名&#xff0c;alias命令&#xff0c;看到cp的别名为cp -i&#xff0c;那就是说cp本身就是自带覆盖提醒&#xff0c;就算我们加上-f 的…...

互联网技术的持续演进:从现在到未来

互联网技术的持续演进&#xff1a;从现在到未来 在过去的十年里&#xff0c;互联网技术发生了飞速变化。无论是大数据、人工智能&#xff0c;还是5G网络和物联网&#xff0c;每一种技术的突破都在改变我们的生活方式和工作模式。作为现代社会的核心驱动力&#xff0c;互联网技…...

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&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终点。 返回数轴上被车 任意…...

基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

mybatis 配置文件完成增删改查(四) :多条件 动态sql查询

文章目录 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…...

先楫HPM6750 Windows下VSCode开发环境配置

用的是EVKmini&#xff0c;ft2232作为调试器jtag接口调试 启动start_gui.exe 以hello_world为例&#xff0c;更改一下build path&#xff0c;可以generate并使用gcc compile 最后会得到这些 点击start_gui里面的命令行&#xff0c;用命令行启动vscode 新建.vscode文件夹&…...

【JavaScript】LeetCode:41-45

文章目录 41 排序链表42 合并k个升序链表43 LRU缓存44 二叉树的中序遍历45 二叉树的最大深度 41 排序链表 递归 归并排序找到链表中心点&#xff0c;从中心点将链表一分为二。奇数个节点找中心点&#xff0c;偶数个节点找中心左边的点作为中心点。快慢指针找中心点&#xff0c…...

数据结构(Day18)

一、周学习内容 1、9.18 数据结构&#xff08;Day15&#xff09;-CSDN博客 2、9.19 数据结构&#xff08;Day16&#xff09;-CSDN博客 3、9.20 链表 目的 插入删除不需要移动任何节点&#xff08;元素&#xff09;。 不需要预估存储空间大小&#xff0c;长度动态增长或减小。…...

error: ‘InsertAtTop‘ was not declared in this scope

Qt编译错误记录&#xff1a; 报错&#xff1a;error: ‘InsertAtTop’ was not declared in this scope ui->comboBoxJob->setInsertPolicy(InsertAtTop);这行代码在Qt中编译就会报这个错误&#xff0c;原因是输入参数需要加类名限定&#xff0c;改为&#xff1a; ui-…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...