Linux常用命令

1

参考

《鸟哥的Linux私房菜》 《现代操作系统》
https://blog.csdn.net/SakuraA6/article/details/108810916

文件管理命令

cat命令

cat命令用于连接文件并打印到标准输出设备上,cat主要有三大功能:
-b 对非空输出行号
-n 输出所有行号

  1. 一次显示整个文件:
    1
    cat filename
  2. 从键盘创建一个文件:只能创建新文件,不能编辑已有文件
    1
    cat > filename
  3. 将几个文件合并为一个文件:
    1
    cat file1 file2 > file

chmod 命令

文件调用权限分为三级:文件拥有者、群组、其他。用于改变linux 系统文件或目
录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定
法;另一种是包含数字的数字设定法

1
2
ls -l log2012.log 
-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log

第一列共有10个位置,第一个字符指定了文件类型。在通常意义上,一个目录也是
一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一
个目录。从第二个字符开始到第十个字符,3个字符一组,分别表示了3组用户对文
件或者目录的权限。权限字符用横线代表空许可,r代表只读,w代表写,x代表可
执行。权限代号如下

1
2
3
4
5
r :读权限,用数字4表示
w :写权限,用数字2表示
x :执行权限,用数字1表示
- :删除权限,用数字0表示
s :特殊权限

实际例子

1
2
3
4
5
6
增加文件 t.log 所有用户可执行权限
chmod a+x t.log

给file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他
用户分配执行(1)的权限
chmod 751 t.log(或者:chmod u=rwx,g=rx,o=x t.log)

chown 命令

chown 将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户
ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支
持通配符

文件的操作命令(增删改查)

  1. touch 文件名称: 文件的创建(增)
  2. cat/more/less/tail 文件名称 :文件的查看(查)。命令 tail -f文件
    可以对某个文件进行动态监控,例如 tomcat 的日志文件,会随着程序的运行
    ,日志会变化,可以使用 tail -f catalina-2016-11-11.log 监控文件的
    变化
  3. 修改文件的内容(改)。输入wq 代表写入内容并退出,即保存;输入q!代
    表强制退出不保存
  4. rm -rf 文件: 删除文件(删)

Linux 目录树

  1. /bin:存放二进制可执行文件(ls、cat、mkdir等),常用命令一般都在这里
  2. /etc:存放系统管理和配置文件
  3. /home:存放所有用户文件的根目录,是用户主目录的基点,比如用户user
    的主目录就是/home/user,可以用~user 表示
  4. /usr:用于存放系统应用程序
  5. /opt:额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把
    tomcat 等都安装到这里
  6. /proc:虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获
    取系统信息
  7. /root:超级用户(系统管理员)的主目录
  8. /sbin:存放二进制可执行文件,只有root 才能访问。这里存放的是系统管
    理员使用的系统级别的管理命令和程序。如ifconfig 等
  9. /dev:用于存放设备文件
  10. /mnt:系统管理员安装临时文件系统的安装点,系统提供这个目录是让用
    户临时挂载其他的文件系统
  11. /boot:存放用于系统引导时使用的各种文件
  12. /lib:存放着和系统运行相关的库文件
  13. /tmp:用于存放各种临时文件,是公用的临时文件存储点
  14. /var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,
    比方说各种服务的日志文件(系统启动日志等)等
  15. /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归
    ”的文件(windows 下叫什么.chk)就在这里

Linux 基本命令

目录切换命令

  1. cd usr: 切换到该目录下 usr 目录
  2. cd ..: 切换到上一层目录
  3. cd /: 切换到系统根目录
  4. cd ~: 切换到用户主目录
  5. cd -: 切换到上一个操作所在目录

目录的操作命令(增删改查)

  1. mkdir 目录名称: 增加目录
  2. ls/ll(ll 是 ls -l 的别名,ll 命令可以看到该目录下的所有目录和文
    件的详细信息):查看目录信息
  3. find 目录 参数: 寻找目录(查)
  • 列出当前目录及子目录下所有文件和文件夹: find .
  • 在/home目录下查找以.txt 结尾的文件名:find /home -name “*.txt”,
    忽略大小写: find /home -iname “*.txt”
  • 当前目录及子目录下查找所有以.txt 和.pdf 结尾的文件:find . ( -name
    *.txt” -o -name “*.pdf” )或find . -name “*.txt” -o -name “*
    .pdf”
  1. mv 目录名称 新目录名称: 修改目录的名称(改)。注意:mv 的语法不仅
    可以对目录进行重命名而且也可以对各种文件,压缩包等进行重命名的操作。mv
    命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。后
    面会介绍到mv 命令的另一个用法
  2. mv 目录名称 目录的新位置: 移动目录的位置—剪切(改)。注意:mv语
    法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv
    与cp 的结果不同,mv 好像文件“搬家”,文件个数并未增加。而cp 对文件进行
    复制,文件个数增加了
  3. cp -r 目录名称 目录拷贝的目标位置: 拷贝目录(改),-r 代表递归拷
    贝 。注意:cp 命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和
    压缩包时不用写-r 递归
  4. rm [-rf] 目录 : 删除目录(删)。注意:rm 不仅可以删除目录,也可以
    删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都
    直接使用rm -rf 目录/文件/压缩包

压缩文件的操作命令

Linux 中的打包文件一般是以.tar 结尾的,压缩的文件一般是以.gz 结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般
.tar.gz。命令:tar -zcvf 打包压缩后的文件名 要打包压缩的文件

  1. z:调用 gzip 压缩命令进行压缩
  2. c:打包文件
  3. v:显示运行过程
  4. f:指定文件名

假如 test 目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我
们要打包 test 目录并指定压缩后的压缩包名称为 test.tar.gz 可以使用
命令:tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt 或
tar -zcvf test.tar.gz /test/

解压压缩包

命令:tar [-xvf] 压缩文件,其中:x:代表解压

  1. 将 /test 下的 test.tar.gz 解压到当前目录下可以使用命令:
    tar -xvf test.tar.gz
  2. 将 /test 下的 test.tar.gz 解压到根目录/usr 下:
    tar -xvf test.tar.gz -C /usr(- C 代表指定解压的位置)

Linux 的权限命令

操作系统中每个文件都拥有特定的权限、所属用户和所属组。权限是操作系统
用来限制资源访问的机制,在Linux 中权限一般分为读、写和执行,分为三
组。分别对应文件的属主,属组和其他用户,通过这样的机制来限制哪些用
户、哪些组可以对特定的文件进行什么样的操作

其他常用命令

  1. pwd 显示当前所在位置
  2. sudo + 其他命令:以系统管理者的身份执行指令,也就是说,经由sudo
    所执行的指令就好像是root 亲自执行
  3. grep 要搜索的字符串 要搜索的文件 –color:搜索命令,–color 代
    表高亮显示
  4. ps -ef/ps -aux: 这两个命令都是查看当前系统正在运行进程,两者的
    区别是展示格式不同。如果想要查看特定的进程可以使用这样的格式:ps aux
    |grep redis(查看包括redis字符串的进程),也可使用pgrep redis -a
  5. kill -9 进程的pid: 杀死进程(-9 表示强制终止。)

网络通信命令

  1. 查看当前系统的网卡信息:ifconfig
  2. 查看与某台机器的连接情况:ping
  3. 查看当前系统的端口使用:netstat -an

进程上下文切换?

进程执行过程中所涉及到的CPU上下文切换,我们称之为特权模式切换。从用
户态到内核态的转变就发生一次特权模式切换,如从磁盘上读取一个文件,
就发生了一次内核调用,也就发生一次特权模式切换

  1. CPU需要将寄存器中的用户态的指令位置保存起来,截至执行内核态的代码
  2. CPU寄存器需要更新为内核态的新位置,最后跳转到内核态执行内核调用。
    之后再恢复之前的用户态,这样的一次系统调用过程实际上发生了两次CPU上
    下文切换

这不是进程上下文切换,进程上下文切换只是说一个进程切换到另一个进程
首先进程的管理是有内核进行管理和调度的。进程的切换只能发生在内核态
所以进程的上下文切换不仅仅包括了虚拟内存,栈,全局变量等用户空间
资源,还包括了内核态堆栈,寄存器等内核空间状态

中断上下文切换?

中断是为了快速响应硬件事件的,跟进程上下文不同,中断上下文不涉及进程
的用户态。即便打断的是一个用户态的进程,也不需要保存和恢复这个进程的
虚拟内存,全局变量等用户态资源。中断上下文只包括内核态中断服务程序执
行必需的状态。CPU寄存器,内核堆栈,硬件中断参数

为什么线程切换会有消耗,消耗啥?

线程切换过程包括:线程上下文的保存和恢复,用户态和内核态的转换,CPU
上下文的切换,这些工作都需要CPU去完成

  1. CPU上下文切换 CPU寄存器和程序计数器切换
  2. 线程上下文切换 涉及线程状态的保存和恢复,包括寄存器、栈等私有数据
  3. 特权模式切换 线程的调度是需要内核级别的权限的(操作CPU和内存),
    也就是说线程的调度工作是在内核态完成的,因此会有一个从用户态到内核态
    的切换。而且,不管是线程本身的切换还是特权模式的切换,都要进行CPU的
    上下文切换

如何查看上下文切换情况?

  1. vmstat 查看系统的上下文切换情况
  2. pidstat 可以看到具体的某个应用程序的上下文切换情况

进程同步、互斥和通信的区别?

进程之间存在两种基本关系:竞争关系和协作关系。进程的互斥、同步、通信都
是基于这两种基本关系而存在的

  1. 为了解决进程间竞争关系(间接制约关系)而引入进程互斥
  2. 为了解决进程间松散的协作关系(直接制约关系)而引入进程同步
  3. 为了解决进程间紧密的协作关系而引入进程通信
  • 资源竞争会产生两个问题:一个是死锁问题,一个是饥饿问题。进程的互斥
    是解决进程间竞争关系(间接制约关系 ) 的手段。 进程互斥指若干个进程要
    使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资
    源的进程必须等待,直到占有资源的进程释放该资源。
  • 某些进程为完成同一任务需要分工协作,这就需要相互协作的进程在某些协
    调点上协调各自的工作。这种协作进程之间相互等待对方消息或信号的协调关
    系称为进程同步,也就是说进程同步指两个以上进程基于某个条件来协调它
    们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进
    程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号
    到达才被唤醒
  • 进程之间互相交换信息的工作称之为进程通信IPC,主要是指大量数据的交换

协程是什么?

协程是比线程更小的一种执行单元,你可以认为是轻量级的线程,一个线
程也可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程
序所控制(也就是在用户态执行)

为什么是轻量级的线程?

协成是基于线程实现的,协程的创建、切换、销毁都是在某个线程中来进行的
,协程占用内存少,只需要极少的栈内存(大概是4~5KB),默认情况下,
线程栈的大小为1MB

协程和线程的区别?

  1. 线程在进行切换的时候,需要将CPU中的寄存器的信息存储起来,然后读
    入另外一个线程的数据
  2. 线程的切换会涉及到用户模式到内核模式的切换,据说每次模式切换都
    需要执行上千条指令
  3. 线程切换时CPU的高速缓存中的数据,也可能失效,需要重新加载
  4. 协程在切换的时候,寄存器需要保存和加载的数据量比较小
  5. 协程没有用户模式到内核模式的切换操作
  6. 更有效率的调度,因为协程是非抢占式的,前一个协程执行完毕或者堵塞
    ,才会让出CPU,而线程则一般使用了时间片的算法,会进行很多没有必要的
    切换
  7. 无需系统自动切换(系统自动切换会浪费很多的资源),而协程是我们用
    户手动切换,而且是在同一个栈上执行,速度就会非常快而且省资源

Linux下如何查看tcp连接?

netstat -nat|grep -i “80”|wc -l

网络监听需要什么函数?

  1. listen listent函数创建一个监听队列以存放待处理的客户连接,将套接字
    sockfd指定为被监听的socket

互斥锁和信号量的区别?

  1. 互斥锁和互斥量是一个意思,互斥锁的作用就是互斥,是用来保护临界区的
  2. 信号量是一种更高级的同步机制,mutex(互斥锁)可以说是信号量在仅取
    值0/1时的特例。信号量可以有更多的取值空间,用来实现更加复杂的同步,而
    不单单是线程间互斥

互斥锁与自旋锁的区别?

  1. 重量级锁需要通过操作系统自身的互斥量(mutex lock,也称为互斥锁)
    来实现,然而这种实现方式需要通过用户态与和核心态的切换来实现,但这个
    切换的过程会带来很大的性能开销
  2. 申请锁时,从用户态进入内核态,申请到后从内核态返回用户态(两次切
    换),没有申请到时阻塞睡眠在内核态。使用完资源后释放锁,从用户态进入
    内核态,唤醒阻塞等待锁的进程,返回用户态(又两次切换),被唤醒进程
    在内核态申请到锁,返回用户态(可能其他申请锁的进程又要阻塞)。所以
    ,使用一次锁,包括申请,持有到释放,当前进程要进行四次用户态与内
    核态的切换。同时其他竞争锁的进程在这个过程中也要进行一次切换
  3. 自旋锁与互斥锁不同的是自旋锁不会引起调用者睡眠。如果自旋锁已经被
    别的进程保持,调用者就轮询(不断的消耗CPU的时间)是否该自旋锁的保
    持者已经释放了锁
  4. 在申请锁失败的话,自旋锁会不断的查询,申请线程不会进入休眠,信号
    量和互斥锁如果申请锁失败的话线程进入休眠,如果申请锁被释放后会唤醒
    休眠的线程

sleep让进程睡眠,那我们能不能做到微妙级别的sleep呢?

  1. usleep()函数 单位是微秒

磁盘坏掉了,操作系统是怎么处理应对的?

  1. 磁盘扫描工具扫描磁盘驱动器

缓存?

缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此
速率很快

进程的内存空间分布?

用户空间被分为几个段,从高地址到低地址分别为:Stack, Heap, BSS,
Data, Text

  1. 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码
  2. 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据
  3. 未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据
  4. 堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放
  5. 栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,
    用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动
    释放内存

什么是中断?

  1. 中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的
    程序,保存现场后自动去执行相应的处理程序,处理完该事件后再返回中断处
    继续执行原来的程序
  2. 中断一般三类,一种是由CPU外部引起的,称为外中断。如I/O中断、时钟中
    断,一种是来自CPU内部事件或程序执行中引起的中断,例如程序非法操作,
    地址越界、浮点溢出)称为内中断,或者(异常,陷入),最后一种是在程序
    中使用了系统调用引起的
  3. 中断处理一般分为中断响应和中断处理两个步骤,中断响应由硬件实施,中
    断处理主要由软件实施

CPU在中断时会干嘛?

中断是CPU响应外设需求的一种模式,在外设需要CPU时,会向中断控制器发送
中断请求,这时CPU 要保护现场,即把正在运行的程序保存起来,一般是把状
态压入堆栈,然后读中断号,启动相应的中断服务程序,服务完成后,载入保
护现场,即把堆栈的数据弹出,继续运行之前的程序

中断分为几种?

  1. 中断(Interruption),也称外中断,指来自CPU执行指令以外的事件的发
    生,如设备发出的I/O 结束中断,表示设备输入/输出处理已经完成,希望处
    理机能够向设备发下一个输入 / 输出请求,同时让完成输入/输出后的程序
    继续运行。时钟中断,表示一个固定的时间片已到,让处理机处理计时、启动
    定时运行的任务等。这一类中断通常是与当前程序运行无关的事件,即它们
    与当前处理机运行的程序无关
  2. 异常(陷入),也叫内中断。是由CPU内部事件所引起的中断,例如进程在
    运算中发生了上溢或者下溢,有如程序出错,如非法指令,地址越界等。通常
    把这类中断称为内中断或者陷入。若系统发现有陷入事件,CPU也将暂停正在
    执行的程序,转去执行该陷入事件的处理程序

如何处理中断?

  1. 屏蔽中断 当处理机正在处理一个中断时,将屏蔽掉所有的中断,即处理机
    对任何新到的中断请求,都暂时不予理睬,而让他们等待,直到处理机已完成
    本次中断的处理后,处理机再去检查是否有中断发生,不适合用于对实时性要
    求较高的中断请求
  2. 嵌套中断 当同时有多个不同优先级的中断请求时,CPU优先响应最高优先
    级的中断请求

中断程序处理过程?

  1. 测定是否有未响应的中断信号
  2. 保护被中断进程的CPU环境
  3. 转入相应的设备处理程序
  4. 中断处理
  5. 恢复CPU的现场并退出中断

为什么要内核态/用户态?

  1. 在CPU的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃
    ,比如清内存、设置时钟等
  2. CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作
    系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令

fd是什么?

  1. fd全称是file descriptor,是进程独有的文件描述符表的索引
  2. 每当进程用open()函数打开一个文件,内核便会返回该文件的文件操作
    符(一个非负的整形值),此后所有对该文件的操作,都会以返回的fd文件
    操作符为参数

多路复用怎么解决阻塞IO 存在的问题?

  1. 异步编程框架是说框架内的业务代码与框架的接口是异步的,而框架与操
    作系统的接口是同步非阻塞

查看内存的命令?

  1. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的
    资源占用状况
  2. pmap -d 5647 可以根据进程查看进程相关信息占用的内存情况
  3. free Linux的free命令是常用来查看内存的命令

查看日志的命令?

  1. tail -n 10 test.log 查询日志尾部最后10行的日志
  2. head 跟tail是相反的head是看前多少行日志

Linux 查看文件中是否存在某字符

  1. grep “port:8080” pro.sh 查找pro文件中是否包含port:8080 内容
    1
    2
    3
    grep 指定字符串 文件的完整路径
    若不清楚字符串的大小写,可以在命令末尾加 -i ,这样查询将忽略字符串的大小写
    若需要查询指定字符串在文件中的位置,可以在命令末尾加 -n

linux如何分割文件字符串?

  1. cut
    1
    2
    3
    4
    -d 指定分隔符,如:按照“:”分割,-d:
    -c 提取第n个字节,如:-c5,表示提取每行的第5个字节
    -f 指定输出的域
    cut –d: -f1,2 //按照”:”来分割,并输出第1和2段

常用的消息队列以及区别?

消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘
上,队列可以存储消息直到它们被应用程序读走

Author: 高明
Link: https://skysea-gaoming.github.io/2021/04/23/Linux2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.