IO多路复用, IO Multiplexing

“IO多路复用, IO Multiplexing” 什么是IO多路复用 I/O 多路复用技术会用一个系统调用函数来监听我们所有关心的连接,也就说可以在一个监控线程里面监控很多的连接。 一个用机场管理来解释的例子,以及对select、poll、epoll的讲解 IO 多路复用是什么意思? - 罗志宇的回答 - 知乎 有趣的比喻 这些名词比较绕口,理解涵义就好。一个epoll场景: 一个酒吧服务员 (一个线程) ,前面趴了一群醉汉,突然一个吼一声“倒酒” (事件) ,你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就这样一个服务员服务好多人,有时没人喝酒,服务员处于空闲状态,可以干点别的玩玩手机。至于epoll与select,poll的区别在于后两者的场景中醉汉不说话,你要挨个问要不要酒,没时间玩手机了。io多路复用大概就是指这几个醉汉共用一个服务员。 作者: 匿名用户 链接: https://www.zhihu.com/question/32163005/answer/55687802 为什么要有IO多路复用 一个从本质上讲的清晰描述 要弄清问题 先要知道问题的出现原因 原因: 由于进程的执行过程是线性的(也就是顺序执行),当我们调用低速系统I/O(read,write,accept等等),进程可能阻塞,此时进程就阻塞 在这个调用上,不能执行其他操作.阻塞很正常. 接下来考虑这么一个问题: 一个服务器进程和一个客户端进程通信,服务器端read(sockfd1,bud,bufsize),此时客户端进程没有发送数据,那么read(阻塞调用)将 阻塞直到客户端调用write(sockfd,but,size)发来数据. 在一个客户和服务器通信时这没什么问题,当多个客户与服务器通信时,若服 务器阻塞于其中一个客户sockfd1,当另一个客户的数据到达 socket sockfd2时,服务器不 能处理,仍然阻塞在read(sockfd1,…)上;此时问题就出现了,不能及时处理另一个客户的服务,咋么办?I/O多路复用来解决! I/O多路复用:继续上面的问题,有多个客户连接,sockfd1,sockfd2,sockfd3..sockfdn 同时监听这n个客户,当其中有一个发来消息时就从select的阻塞中返回,然后就调用read 读取收到消息的sockfd,然后又循环回select阻塞;这样就不会因为阻塞在其中一个上而不能处 理另一个客户的消息 Q: 那这样子,在读取socket1的数据时,如果其它socket有数据来,那么也要等到socket1读取完了才能继续读取其它socket的数据吧。那不是也阻塞住了吗?而且读取到的数据也要开启线程处理吧,那这和多线程IO有什么区别呢? A: CPU本来就是线性的,不论什么都需要顺序处理,并行只能是多核CPU io多路复用本来就是用来解决对多个I/O监听时,一个I/O阻塞影响其他I/O的问题,跟多线程没关系. 跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源. 而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳.但多线程编程逻辑和处理上比I/O多路复用简单.而I/O多路复用处理起来较为复杂. 作者总结 用自己的话解释清楚新的知识,这就是内化的过程。 【IO多路复用】和【多线程】是两种解决单个服务器应对多客户端同时IO请求阻塞问题的方案,问题出现的根源在于原始情况下,服务器收到客户端的进程的连接请求后都会调用阻塞的read()方法尝试从客户端读取数据,若读取不到则一直保持阻塞,但是这种处理方式显然会造成问题,譬如如果正在等待读取的这个客户端不传数据了,而其它有正在等待处理的客户端数据传输请求,那么显然就会造成服务器资源的浪费 (不能及时处理真正紧急的客户端请求,而浪费时间在暂时没有处理需求的客户端请求上) 。 解决这个问题有个简单的思路: 【多线程】: 即针对每一个客户端进程都新建一个新的服务器端线程,即一对一地应付客户端的通信需求。 不过这个解决方案有个问题就是: 如果通信的客户端很多,那么服务器就需要开很多线程来处理IO,服务器这边的压力就会比较大,除开开启线程与维持线程本身需要的资源以外,服务器CPU在线程之间切换也要耗时,导致效率低下。 因此,【IO多路复用】搞定了多线程解决方案的痛点,只用一个线程来解决阻塞问题,具体做法就是: 依然调用一个阻塞方法,这个阻塞方法会监听跟踪每一个IO流的状态,当有一个新的数据传输请求到来,就会通知服务器,然后服务器找到对应有需求的客户端,并读取它要传输的数据。这样,就不用开一大堆线程去一对一的监听IO状态变化了。 而select、poll、epoll三个东西都是上述思路的不同实现方式,并且是按照它们被列出的顺序被先后发明出来的,每个更新发明出来的方法都是在之前方法上做了一些改进。 poll在select的基础上,去掉了select给定的只能最多处理1024个客户端连接的限制,并不会再修改传入该方法的参数数组。epoll是在poll的基础上,使其变成了线程安全的 (不会因为通信过程中其它线程关掉了已经加入到select或者poll中的IO流而产生未知的后果) ,同时会告知服务端具体是哪个IO流来了数据,不需要靠服务器自己去找。 ———————————————— 版权声明: 本文为CSDN博主「蓝色枫魂」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/qq_32690999/article/details/80157034 ...

2021-07-02 · 1 min · 132 words · -

用户栈和内核栈

“用户栈和内核栈” 进程是程序的一次执行过程。用剧本和演出来类比,程序相当于剧本,而进程则相当于剧本的一次演出,舞台、灯光则相当于进程的运行环境。 进程的堆栈 每个进程都有自己的堆栈,内核在创建一个新的进程时,在创建进程控制块 task_struct 的同时,也为进程创建自己堆栈。一个进程有2个堆栈,用户堆栈和内核堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。当进程在用户态运行时,CPU 堆栈指针寄存器指向用户堆栈地址,使用用户堆栈,当进程运行在内核态时,CPU 堆栈指针寄存器指向的是内核栈空间地址,使用的是内核栈; 进程用户栈和内核栈之间的切换 当进程由于中断或系统调用从用户态转换到内核态时,进程所使用的栈也要从用户栈切换到内核栈。系统调用实质就是通过指令产生中断,称为软中断。进程因为中断 (软中断或硬件产生中断) ,使得CPU切换到特权工作模式,此时进程陷入内核态,进程进入内核态后,首先把用户态的堆栈地址保存在内核堆栈中,然后设置堆栈指针寄存器的地址为内核栈地址,这样就完成了用户栈向内核栈的切换。 当进程从内核态切换到用户态时,最后把保存在内核栈中的用户栈地址恢复到CPU栈指针寄存器即可,这样就完成了内核栈向用户栈的切换。 这里要理解一下内核堆栈。前面我们讲到,进程从用户态进入内核态时,需要在内核栈中保存用户栈的地址。那么进入内核态时,从哪里获得内核栈的栈指针呢? 要解决这个问题,先要理解从用户态刚切换到内核态以后,进程的内核栈总是空的。这点很好理解,当进程在用户空间运行时,使用的是用户栈;当进程在内核态运行时,内核栈中保存进程在内核态运行的相关信息,但是当进程完成了内核态的运行,重新回到用户态时,此时内核栈中保存的信息全部恢复,也就是说,进程在内核态中的代码执行完成回到用户态时,内核栈是空的。 理解了从用户态刚切换到内核态以后,进程的内核栈总是空的,那刚才这个问题就很好理解了,因为内核栈是空的,那当进程从用户态切换到内核态后,把内核栈的栈顶地址设置给CPU的栈指针寄存器就可以了。 X86 Linux内核栈定义如下 (可能现在的版本有所改变,但不妨碍我们对内核栈的理解) : 在/include/linux/sched.h中定义了如下一个联合结构: union task_union { struct task_struct task; unsigned long stack[2408]; }; 从这个结构可以看出,内核栈占8kb的内存区。实际上,进程的task_struct结构所占的内存是由内核动态分配的,更确切地说,内核根本不给task_struct分配内存,而仅仅给内核栈分配8K的内存,并把其中的一部分给task_struct使用。 这样内核栈的起始地址就是union task_union变量的地址+8K 字节的长度。例如: 我们动态分配一个union task_union类型的变量如下: unsigned char *gtaskkernelstack gtaskkernelstack = kmalloc(sizeof(union task_union)); 那么该进程每次进入内核态时,内核栈的起始地址均为: (unsigned char *) gtaskkernelstack + 8096 进程上下文 进程切换现场称为进程上下文(context),包含了一个进程所具有的全部信息,一般包括: 进程控制块 (Process Control Block,PCB) 、有关程序段和相应的数据集。 进程控制块PCB (任务控制块) 进程控制块是进程在内存中的静态存在方式,Linux内核中用task_struct表示一个进程 (相当于进程的人事档案) 。进程的静态描述必须保证一个进程在获得CPU并重新进入运行态时,能够精确的接着上次运行的位置继续进行,相关的程序段,数据以及CPU现场信息必须保存。处理机 现场信息主要包括处理机内部寄存器和堆栈等基本数据。 进程控制块一般可以分为进程描述信息、进程控制信息,进程相关的资源信息和CPU现场保护机构。 进程的切换 当一个进程的时间片到时,进程需要让出CPU给其他进程运行,内核需要进行进程切换。 Linux 的进程切换是通过调用函数进程切换函数schedule来实现的。进程切换主要分为2个步骤: ...

2021-06-10 · 2 min · 380 words · -

kernel thread, 内核线程, KTL

kernel thread, 内核线程, KTL 内核线程, ktl 为什么需要内核线程 Linux 内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。 这与用户线程是不一样的。因为内核线程只运行在内核态 因此,它只能使用大于P AGE_OFFSET (传统的x86_32上是3G) 的地址空间。 内核线程概述 内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程,它与内核中的其他进程"并行"执行。内核线程经常被称之为内核守护进程。 他们执行下列任务 周期性地将修改的内存页与页来源块设备同步 如果内存页很少使用,则写入交换区 管理延时任务 (Deferred work),如:中断的下半部 实现文件系统的事务日志 内核线程主要有两种类型 线程启动后一直等待,直至内核请求线程执行某一特定操作。 线程启动后按周期性间隔运行,检测特定资源的使用,在用量超出或低于预置的限制时采取行动。 它们在CPU的管态执行,而不是用户态。 它们只可以访问虚拟地址空间的内核部分 (高于TASK_SIZE的所有地址) ,但不能访问用户空间 内核线程的进程描述符 task_struct task_struct 进程描述符中包含两个跟 进程地址空间 相关的字段 mm, active_mm struct task_struct { // ... struct mm_struct *mm; struct mm_struct *avtive_mm; //... }; 大多数计算机上系统的全部虚拟地址空间分为两个部分: 供用户态程序访问的虚拟地址空间和供内核访问的内核空间。每当内核执行上下文切换时, 虚拟地址空间的用户层部分都会切换, 以便当前运行的进程匹配, 而内核空间不会放生切换。 mm 对于普通用户进程来说,mm 指向虚拟地址空间的用户空间部分,而对于内核线程,mm 为NULL。这为优化提供了一些余地, 可遵循所谓的惰性 TLB 处理(lazy TLB handing)。 active_mm active_mm 主要用于优化,由于内核线程不与任何特定的用户层进程相关,内核并不需要倒换虚拟地址空间的用户层部分,保留旧设置即可。由于内核线程之前可能是任何用户层进程在执行,故用户空间部分的内容本质上是随机的,内核线程决不能修改其内容,故将mm设置为NULL,同时如果切换出去的是用户进程,内核将原来进程的 mm 存放在新内核线程的 active_mm 中,因为某些时候内核必须知道用户空间当前包含了什么。 惰性 TLB 进程 为什么没有 mm 指针的进程称为惰性 TLB 进程? ...

2021-05-05 · 3 min · 596 words · -

signal, 信号

signal, 信号 信号(signal)机制 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式。一个信号就是一个异步的通知,发送给某个进程,或者同进程的某个线程,告诉它们某个事件发生了。 当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。 如果目标进程先前注册了某个信号的处理程序(signal handler),则此处理程序会被调用,否则缺省的处理程序被调用。 发送信号 kill 系统调用 (system call) 可以用来发送一个特定的信号给进程。 kill 命令允许用户发送一个特定的信号给进程。 raise 库函数可以发送特定的信号给当前进程。 在Linux下运行 man kill 可以查看此命令的介绍和用法。 The command kill sends the specified signal to the specified process or process group. If no signal is specified, the TERM signal is sent. The TERM signal will kill processes which do not catch this signal. For other processes, it may be necessary to use the KILL (9) signal, since this signal cannot be caught. ...

2021-04-30 · 4 min · 807 words · -

sendfile

sendfile 在了解零拷贝之前,我们先来看看标准的的 I/O 操作. 传统 IO, 缓存 IO, Buffer I/O, 标准 IO 标准 IO 又被称作缓存 IO 或传统 IO, 大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存 (page cache) 中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。写的过程就是数据流反方向。 缓存 I/O 有以下这些优点: 缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。 缓存 I/O 可以减少读盘的次数,从而提高性能。 对于读操作: 当应用程序要去读取某块数据的时候,如果这块数据已经在页缓存中,那就返回之。而不需要经过硬盘的读取操作了。如果这块数据不在页缓存中,就需要从硬盘中读取数据到页缓存。 对于写操作: 应用程序会将数据先写到页缓存中,数据是否会被立即写到磁盘,这取决于所采用的写操作机制: 如果用户采用的是同步写机制 (synchronous writes), 那么数据会立即被写回到磁盘上,应用程序会一直等到数据被写完为止; 如果用户采用的是延迟写机制 (deferred writes), 那么应用程序就完全不需要等到数据全部被写回到磁盘,数据只要被写到页缓存中(内核的缓冲区)去就可以了。在延迟写机制的情况下,操作系统会定期地将放在页缓存中的数据刷到磁盘上。与异步写机制 (asynchronous writes) 不同的是,延迟写机制在数据完全写到磁盘上的时候不会通知应用程序,而异步写机制在数据完全写到磁盘上的时候是会返回给应用程序的。所以延迟写机制本身是存在数据丢失的风险的,而异步写机制则不会有这方面的担心。 传统 IO 的缺点 在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,这样的话,数据在传输过程中需要在应用程序地址空间和页缓存之间进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。 当然也可以采用直接 I/O 技术来满足自缓存应用程序 ( self-caching applications) 的需求。 对于某些特殊的应用程序来说,能够绕开内核缓冲区能够获取更好的性能,这就是直接I/O出现的意义。 ...

2021-04-21 · 2 min · 280 words · -

vnc rdp

vnc rdp VNC是什么? 简单来说,所谓的 VNC(Virtual Network Computing )是一种图形化的桌面共享系统,它使用远程帧缓冲协议 (RFB) 来远程控制另一台计算机。它将键盘和鼠标事件从一台计算机传输到另一台计算机,通过网络向另一个方向转发图形屏幕更新。 类似这样的技术VNC不是绝无仅有,但VNC 的流行和普及却因为其具有的过人之处 – VNC是平台无关的—— 有多种客户端和服务器的实现,几乎涵盖了所有的主流平台。甚至一些VNC的实现被称“无客户端”,这是因为不需要安装插件或客户端软件而,而是依靠HTML5技术,只需要一个浏览器就可以访问远程桌面了。 VNC 是开源的—— VNC最初是在英国剑桥的Olivetti & Oracle研究实验室开发的。原始的VNC源代码和许多现代的衍生品在GNU通用公共许可证下是开放源码的。 VNC的协议是简单、普适的—— VNC使用的是 RFB(Remote Framebuffer) 协议。这是一个开放且简单的协议。因为它在framebuffer级别工作,协议是基于像素的所以适用于所有窗口系统和应用程序,包括Microsoft Windows、macOS和X Window系统。这个协议的性能表现是很出色的。 RDP 又是什么? 有过 Windows 使用经验的人对于远程桌面(Remote Desktop Protocol ,RDP)一定不会陌生。RDP 是由微软公司开发的一种专有协议,它为用户提供了通过网络连接到另一台计算机的图形界面。在使用上,用户需要使用 RDP 客户端软件,而在远程另一台计算机则需要运行 RDP 服务器软件。 VNC协议是基于像素的。尽管这带来了极大的灵活性,可以显示任何类型的桌面,但它的效率往往不如那些更好地理解底层图形布局(例 如: X11)或桌面(例如:RDP )的解决方案。这些协议以更简单的形式(例如:打开窗口)发送图形原语或高级命令,而 VNC 的 RFB 协议尽管支持压缩但只能是发送原始像素数据。 https://aws.amazon.com/cn/blogs/china/vnc-or-rdp-how-to-choose-a-remote-desktop-on-the-cloud/

2021-03-13 · 1 min · 49 words · -

xterm

xterm http://www.hasdiffer.com/xterm-vs-terminal.html xterm 和终端都是运行 X Windows 系统的基于 UNIX 的系统通用的终端仿真器。终端仿真器基本上是一种终端应用程序,它允许用户访问最初开发的程序以与某些其他类型的终端进行通信。它只是复制了经典计算机终端的功能。终端仿真器通常由系统管理员使用,因为某些内置的命令行程序无法自行运行,因此使用第三方终端仿真器与系统进行通信。命令行通常是在Linux系统上运行的最佳方法,因为大多数任务在控制台上运行效果最佳。 Windows的内置终端仿真器是"命令提示符",而Mac OS X使用"终端"作为其终端仿真应用程序,该应用程序位于/ Application/Utilities。终端机是Linux用户最重要的应用程序之一,它为用户提供了对Shell的访问。终端是Linux真正威力的源泉。但是,Linux提供了每个GUI版本专有的许多终端仿真器。运行X Windows系统的Linux系统使用" xterm"作为它们的默认终端仿真器程序。尽管xterm似乎有点经典,但它仍然是X Windows System的默认终端,它仅基于文本原理。 什么是终端机?终端是一个命令行界面,它使用户可以以书面文字与人类相同的方式与计算机进行通信。 Linux的终端就像Windows的命令提示符。它是Linux最强大的功能之一,可为用户提供对命令行界面的访问权限。简而言之,Terminal是Linux桌面环境的默认终端仿真器。其他桌面环境(如Ubuntu)也将Terminal用作其默认的终端仿真器软件包。每个桌面环境都有不同的方法来访问终端。最简单的方法之一是在按住Ctrl + Alt + T的同时启动终端窗口。 什么是Xterm?XTerm是运行X Windows系统的Linux系统的默认终端仿真器程序。您只需在"终端"窗口中键入xterm并按Enter,它将与xterm窗口一起启动X11环境。但是,在GNOME桌面环境中,默认情况下未安装xterm。必须先安装并从另一个终端仿真器(例如Terminal)启动xterm。另外,您还可以创建自己的桌面启动器以打开xterm窗口。与终端不同,用户可以同时运行多个xterm实例。 xterm和Terminal的区别 基本Terminal和xterm都是终端仿真器程序,允许在图形环境中使用终端。这是GUI中的纯文本窗口,允许用户直接执行命令。这是Linux的默认终端仿真应用程序。但是,Linux提供了各种终端仿真器,其中之一是" xterm"。它是运行X Windows系统的Linux和UNIX系统的默认终端仿真器。这是用于轻量级发行的复杂终端。 进程管理用户可以在同一显示器上同时运行多个xterm实例,这意味着每个窗口对应一个单独的进程,每个窗口为运行它的shell或进程提供独立的输入和输出。另一方面,终端一次仅控制一个会话,这意味着控制终端与该会话具有一对一的关系,并且每个会话作为终端的子进程单独运行。记录会话的终端将成为该过程的控制终端。 剪贴板剪切的所有内容(⌘-X)和复制的内容(is-C)都存储在剪贴板中,当您使用粘贴(⌘-V)时,系统会进一步从剪贴板中读取它。选项不会自动放入终端。您复制的所选文本最初存储在一个名为"粘贴板"的地方。另一方面,XTerm仅使用剪贴板缓冲区复制和粘贴文本,但是默认配置中未使用它。默认情况下,Xterm仅支持PRIMARY缓冲区,该缓冲区仅在用户用鼠标突出显示文本并且在用户按下鼠标中键时将所选文本粘贴到同一窗口中时才接收输入。 访问在Linux系统中打开终端的最简单方法之一是同时按住Ctrl + Alt + T键的组合,终端窗口将打开。只能通过打开"终端"应用程序从"应用程序"文件夹中的"实用工具"文件夹访问它。也可以在Dash中查找Terminal,或为Launcher添加快捷方式。同时按Alt + F2并键入" gnome-terminal"也将打开"终端"窗口。但是,您只需在"终端"窗口中键入xterm,然后按Enter键即可启动X11环境以及xterm窗口。 总结尽管xterm和Terminal都是基于Linux和UNIX的系统的终端仿真器程序,但是xterm是运行X Windows System的系统的默认终端仿真应用程序。 终端是命令行界面,允许用户访问Shell。 它是Linux的心脏,也是系统管理员最常用的最强大功能之一,因为大多数内置命令行程序本身并不出色,并且它们需要第三方程序通过命令与系统进行交互。 Linux提供了各种终端仿真器,包括xterm,它是X Windows系统的默认终端仿真器。 本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。 转载请注明: 文章转载自 有区别网 [http://www.hasdiffer.com] 本文标题: Xterm和终端的区别 本文链接: http://www.hasdiffer.com/xterm-vs-terminal.html //更多关于【Xterm和终端的区别】请查看: http://www.hasdiffer.com/xterm-vs-terminal.html

2020-10-12 · 1 min · 57 words · -

tree command, 以树形结构显示文件目录结构, 目录树

tree command, 以树形结构显示文件目录结构, 目录树 # tree -L 3 dir_0 以树形结构显示文件目录结构 sudo pacman -S tree sudo apt-get install tree tree -aI .git tree -I '*svn|*node_module*' Linux tree命令用于以树状图列出目录的内容。 执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。 语法 tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录...] 参数说明: -a 显示所有文件和目录。 -A 使用 ASNI 绘图字符显示树状图而非以 ASCII 字符组合。 -C 在文件和目录清单加上色彩,便于区分各种类型。 -d 显示目录名称而非内容。 -D 列出文件或目录的更改时间。 -f 在每个文件或目录之前,显示完整的相对路径名称。 -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|“号。 -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。 -i 不以阶梯状列出文件或目录名称。 -L level 限制目录显示层级。 -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。 -n 不在文件和目录清单加上色彩。 -N 直接列出文件和目录名称,包括控制字符。 -p 列出权限标示。 -P<范本样式> 只显示符合范本样式的文件或目录名称。 -q 用”?“号取代控制字符,列出文件和目录名称。 -s 列出文件或目录大小。 -t 用文件和目录的更改时间排序。 -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。 -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。 -I pattern Do not list those files that match the wild-card pattern. https://blog.csdn.net/xuehuafeiwu123/article/details/53817161

2020-05-16 · 1 min · 91 words · -

dnf basic

dnf basic 升级所有系统软件包 用处: 该命令用于升级系统中所有有可用升级的软件包 # "update" is just a deprecated alias for "upgrade", they do exactly the same thing. dnf update dnf upgrade 安装 dnf install rsync 删除 dnf remove nano 或 # dnf erase nano 删除无用孤立的软件包 用处: 当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。 dnf autoremove dnf --version dnf repolist – 查看系统中可用和不可用的所有的 DNF 软件库 用处: 该命令用于显示系统中可用和不可用的所有的 DNF 软件库 命令: # dnf repolist all – 列出所有安装了的 RPM 包 dnf list installed – 列出所有 RPM 包 dnf list – 列出所有可供安装的 RPM 包 用处: 该命令用于列出来自所有可用软件库的可供安装的软件包 命令: # dnf list available – 搜索软件库中的 RPM 包 用处: 当你不知道你想要安装的软件的准确名称时,你可以用该命令来搜索软件包。你需要在"search"参数后面键入软件的部分名称来搜索。 (在本例中我们使用"nano") 命令: # dnf search nano – 查看软件包详情 用处: 当你想在安装某一个软件包之前查看它的详细信息时,这条命令可以帮到你。 (在本例中,我们将查看"nano"这一软件包的详细信息) 命令: # dnf info nano – 安装软件包 用处: 使用该命令,系统将会自动安装对应的软件及其所需的所有依赖 (在本例中,我们将用该命令安装nano软件) 命令: # dnf install nano – 升级软件包 用处: 该命令用于升级制定软件包 (在本例中,我们将用命令升级"systemd"这一软件包) 命令: # dnf update systemd – 检查系统软件包的更新 用处: 该命令用于检查系统中所有软件包的更新 命令: # dnf check-update dnf upgrade --refresh dnf system-upgrade reboot – 删除软件包 用处: 删除系统中指定的软件包 (在本例中我们将使用命令删除"nano"这一软件包) 命令: # dnf remove nano 或 # dnf erase nano – 删除无用孤立的软件包 用处: 当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。 命令: # dnf autoremove – 删除缓存的无用软件包 用处: 在使用 DNF 的过程中,会因为各种原因在系统中残留各种过时的文件和未完成的编译工程。我们可以使用该命令来删除这些没用的垃圾文件。 命令: # dnf clean all – 获取有关某条命令的使用帮助 用处: 该命令用于获取有关某条命令的使用帮助 (包括可用于该命令的参数和该命令的用途说明) (本例中我们将使用命令获取有关命令"clean"的使用帮助) 命令: # dnf help clean – 查看所有的 DNF 命令及其用途 用处: 该命令用于列出所有的 DNF 命令及其用途 命令: # dnf help – 查看 DNF 命令的执行历史 用处: 您可以使用该命令来查看您系统上 DNF 命令的执行历史。通过这个手段您可以知道在自您使用 DNF 开始有什么软件被安装和卸载。 命令: # dnf history – 查看所有的软件包组 用处: 该命令用于列出所有的软件包组 命令: # dnf grouplist – 安装一个软件包组 用处: 该命令用于安装一个软件包组 (本例中,我们将用命令安装"Educational Software"这个软件包组) 命令: # dnf groupinstall 'Educational Software' – 升级一个软件包组中的软件包 用处: 该命令用于升级一个软件包组中的软件包 (本例中,我们将用命令升级"Educational Software"这个软件包组中的软件) 命令: # dnf groupupdate 'Educational Software' – 删除一个软件包组 用处: 该命令用于删除一个软件包组 (本例中,我们将用命令删除"Educational Software"这个软件包组) 命令: # dnf groupremove 'Educational Software' – 从特定的软件包库安装特定的软件 用处: 该命令用于从特定的软件包库安装特定的软件 (本例中我们将使用命令从软件包库 epel 中安装 phpmyadmin 软件包) 命令: # dnf –enablerepo=epel install phpmyadmin – 更新软件包到最新的稳定发行版 用处: 该命令可以通过所有可用的软件源将已经安装的所有软件包更新到最新的稳定发行版 命令: # dnf distro-sync – 重新安装特定软件包 用处: 该命令用于重新安装特定软件包 (本例中,我们将使用命令重新安装"nano"这个软件包) 命令: # dnf reinstall nano – 回滚某个特定软件的版本 用处: 该命令用于降低特定软件包的版本 (如果可能的话) (本例中,我们将使用命令降低"acpid"这个软件包的版本) 命令: # dnf downgrade acpid DNF 包管理器作为 YUM 包管理器的升级替代品,它能自动完成更多的操作。但在我看来,正因如此,所以 DNF 包管理器不会太受那些经验老道的 Linux 系统管理者的欢迎。举例如下: ...

2020-04-26 · 2 min · 372 words · -

ssh client config

ssh config host host0 hostname 192.168.1.10 port 22 user root # for openwrt ssh-rsa HostkeyAlgorithms +ssh-rsa PubkeyAcceptedKeyTypes +ssh-rsa https://daemon369.github.io/ssh/2015/03/21/using-ssh-config-file https://blog.csdn.net/XXY2083123843/article/details/128370472 vim ~/.ssh/config #--- Host * ControlMaster auto # ssh multiplexing ControlPath ~/.ssh/master-%r@%h:%p ControlPersist 10m ForwardAgent yes # ssh agent forward User root # 默认用户 使用通配符 (wildcard) host 192.168.* user root ssh client config, 保持连接 避免SSH连接因超时闲置断开 ssh 客户端保持连接 vim ~/.ssh/config Host 192.168.* ServerAliveInterval 120 User root 用 SSH 过程连接电脑时,经常遇到长时间不操作而被服务器踢出的情况,常见的提示如: ...

2020-04-18 · 2 min · 236 words · -

shell 进制转换

shell 进制转换 16进制转换成10进制 printf %d 0xF echo $((16#F)) 10进制转换成16进制 printf %x 15 echo "obase=16;15"|bc 三、10进制转换成8进制 printf %o 9 11 四、8进制转换成10进制 echo $((8#11)) 9 五、同理二进制转换成10进制 echo $((2#111)) 7 六、10进制转换成二进制 echo “obase=2;15”|bc 1111 https://blog.csdn.net/rheostat/article/details/8057405

2020-03-24 · 1 min · 32 words · -

dpkg

dpkg Ubuntu 查看软件包是否安装 # 显示包含此软件包的所有位置 dpkg -S softwarename # -s status, 查看软件包状态 dpkg -s <package-name> # 可以加通配符* dpkg-query -l <package-name> # 列出软件包的位置, 安装路径 dpkg -L <package-name> # 列出哪些软件包被安装 dpkg --get-selections | grep <package-name>* # 查看版本 dpkg -l softwarename debian install deb debian install deb package deb 包 deb 包是debian,ubuntu等LINUX发行版的软件安装包,是类似于rpm的软件包,而非debian,ubuntu系统不推荐使用deb软件包,因为要解决软件包依赖问题,安装也比较麻烦。 安装方法有两种: 一般在此类发行版中可以直接双击安装。 手动安装。如果您喜欢使用终端,您需要管理员权限来安装一个 .deb 文件。 sudo dpkg -i foo.deb 但是在包含有依赖关系的安装包手动安装的过程中会出现安装不成功的问题,这时只需输入命令: sudo apt-get -f install 待命令执行完成,软件也就安装成功了。 卸载安装包时,在终端中,输入:sudo dpkg -r package_name ...

2020-03-22 · 1 min · 78 words · -

umask

umask umask 值用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由 umask 值决定的。 对于 root用户,系统默认的umask值是0022;对于普通用户,系统默认的umask值是0002。执行umask命令可以查看当前用户的umask值。 umask # > 0022 umask 值一共有4组数字,其中第1组数字用于定义特殊权限,我们一般不予考虑,与一般权限有关的是后3组数字。 https://www.cnblogs.com/wish123/p/7073114.html

2020-03-15 · 1 min · 14 words · -

Shell 判断进程是否存在

Shell 判断进程是否存在 #! /bin/bash function check(){ count=`ps -ef |grep $1 |grep -v "grep" |wc -l` #echo $count if [ 0 == $count ];then nohup python /runscript/working/$1 & fi } ———————————————— 版权声明: 本文为CSDN博主「栎枫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接: https://blog.csdn.net/superbfly/article/details/52513765

2020-02-19 · 1 min · 38 words · -

xxd

xxd, 以 16进制查看文件 xxd 命令用于使用二进制或十六进制格式显示文件内容,可以将指定文件或标准输入以十六进制转储,也可以把十六进制转储转换成原来的二进制形式。 command xxd -b file xxd file

2020-02-14 · 1 min · 11 words · -

tr command

tr command # 转大写 echo 'hello' | tr '[:lower:]' '[:upper:]' # 转小写 echo 'HELLO' | tr '[:upper:]' '[:lower:]' # 删除文本中的换行符 tr -d '\n' < input.txt > output.txt # 删除空行 cat file | tr -s "\n" > new_file tr -s "[\012]" < plan.txt tr -s ["\n"] < plan.txt 什么是 tr 命令? tr, translate 的简写 \NNN character with octal value NNN (1 to 3 octal digits) \\ backslash \a audible BEL \b backspace \f form feed \n new line \r return \t horizontal tab \v vertical tab CHAR1-CHAR2 all characters from CHAR1 to CHAR2 in ascending order [CHAR*] in SET2, copies of CHAR until length of SET1 [CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0 [:alnum:] all letters and digits [:alpha:] all letters [:blank:] all horizontal whitespace [:cntrl:] all control characters [:digit:] all digits [:graph:] all printable characters, not including space [:lower:] all lower case letters [:print:] all printable characters, including space [:punct:] all punctuation characters [:space:] all horizontal or vertical whitespace [:upper:] all upper case letters [:xdigit:] all hexadecimal digits [=CHAR=] all characters which are equivalent to CHAR https://blog.csdn.net/jeffreyst_zb/article/details/8047065 通过使用tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed的 (极其) 简化的变体: 它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr所能够做的。 ...

2020-02-14 · 5 min · 1054 words · -

gnome keyring

gnome keyring install sudo pacman -S gnome-keyring libsecret vim .bashrc eval $(/usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh) export $(gnome-keyring-daemon --start --components=pkcs11,secrets,ssh,gpg) dbus-update-activation-environment --systemd DISPLAY secret-tool, 用 secret-tool 测试 gnome keyring daemon 是否正常 secret-tool 由 libsecret 提供 secret-tool store --label='Label' foo bar secret-tool lookup foo bar secret-tool store --label='Label' {attribute} {value} ... secret-tool lookup {attribute} {value} ... secret-tool clear {attribute} {value} ... secret-tool search [--all]{attribute} {value} ... secret-tool secret-tool - 通过命令行访问 GNOME keyring (以及其他任何实现了DBus Secret Service API的服务) 。 secret-tool - Store and retrieve passwords ...

2019-11-05 · 1 min · 83 words · -

ufw

ufw UFW,即简单防火墙 uncomplicated firewall,是一个 Arch Linux、Debian 或 Ubuntu 中管理防火墙规则的前端。 UFW 通过命令行使用(尽管它有可用的 GUI),它的目的是使防火墙配置简单(即不复杂uncomplicated)。 # check ufw status sudo ufw status # Status: active # Status: inactive docker 网络 会忽略 ufw 配置 https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw

2019-07-28 · 1 min · 31 words · -

fzf command

fzf command # 可以直接运行 fzf # 查找当前目录和子目录的文件 # exact match fzf -e find . -type f | fzf https://github.com/junegunn/fzf

2019-07-08 · 1 min · 19 words · -

linux shell 查找文件位置,which, command -v, hash, type

linux shell 查找文件位置,which, command -v, hash, type command -v foo 避免使用which, 相对于hash、type、command等内置命令,which是一个没有明显的功能优势的外部命令。 使用which时会启动一个新的进程 很多linux发行版上的which执行完后甚至没有返回码,这就意味着在上面执行完"if which foo"就不会奏效,即使"foo"命令 不存在,系统也会报告存在,这样明显是适得其反。(部分POSIX风格的shell对hash命令也会有类似情况) 很多linux发行版上的which会做一些邪恶的事情,比如改变输出结果甚至会接入到包管理器中。 https://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a-bash-script?page=1&tab=votes#tab-top https://blog.51cto.com/xoyabc/1902804

2019-06-21 · 1 min · 20 words · -