Linux

Linux操作系统的组成

UNIX或者Linux系统⼤致可以分为以下⼏个部分

  • 硬件交互的操作系统内核
  • 中间层是shell层
  • 最外层是应⽤层

  • 内核层: 内核层是 UNIX/Linux 系统的核⼼和基础,它直接附着在硬件平台之上,控制和管理系统内各种资源 (硬件资源和软件资源),有效地组织进程的运⾏,从⽽扩展硬件的功能,提⾼资源的利⽤效率,为⽤户提供⽅便、⾼效、安全、可靠的应⽤环境。
  • Shell层: Shell 层是与⽤户直接交互的界⾯。⽤户可以在提示符下输⼊命令⾏,由 Shell 解释执⾏并输出相应结果或者有关信息,所以我们也把 Shell 称作命令解释器,利⽤系统提供的丰富命令可以快捷⽽简便地完成许多⼯作。

Linux的文件系统

Linux操作系统中的文件类型

在linux中,⼀切皆为⽂件。

  • ⽂件分为下⾯的⼀些类型:
    • 普通文件(-)
    • 目录文件(d)
    • 链接文件(l)
    • 设备文件(b/c)
    • 管道文件(p)

Linux操作系统的组织结构

  • 没有各种盘符的概念
  • 根⽬录只有⼀个/,采⽤层级式的树状⽬录结构
  • /:根⽬录,所有的⽬录、⽂件、设备都在/之下,/就是Linux⽂件系统的组织者,也是最上级的领导者。
  • /bin:bin 就是⼆进制(binary)英⽂缩写。在⼀般的系统当中,都可以在这个⽬录下找到linux常⽤的命令。系统所需要的那些命令位于此⽬录。
  • /boot:Linux的内核及引导系统程序所需要的⽂件⽬录。
  • /dev:dev 是设备(device)的英⽂缩写。这个⽬录对所有的⽤户都⼗分重要。因为在这个⽬录中包含了所有linux系统中使⽤的外部设备。但是这⾥并不是放的外部设备的驱动程序。这⼀点和常⽤的windows,dos操作系统不⼀样。它实际上是⼀个访问这些外部设备的端⼝。可以⾮常⽅便地去访问这些外部设备,和访问⼀个⽂件,⼀个⽬录没有任何区别。
  • /home:如果建⽴⼀个⽤户,⽤户名是"xx",那么在/home⽬录下就有⼀个对应的/home/xx路径,⽤来存放⽤户的主⽬录。
  • /lib:lib是库(library)英⽂缩写。这个⽬录是⽤来存放系统动态连接共享库的。⼏乎所有的应⽤程序都会⽤到这个⽬录下的共享库。因此,千万不要轻易对这个⽬录进⾏什么操作,⼀旦发⽣问题,系统就不能⼯作了。
  • /proc:存储的是当前内核运⾏状态的⼀系列特殊⽂件,⽤户可以通过这些⽂件查看有关系统硬件及当前正在运⾏进程的信息,甚⾄可以通过更改其中某些⽂件来改变内核的运⾏状态。此外还有/srv /sys三个⽬录,内核相关⽬录,不要动。
  • /root:Linux超级权限⽤户root的家⽬录。
  • /sbin:这个⽬录是⽤来存放系统管理员的系统管理程序。⼤多是涉及系统管理的命令的存放,是超级权限⽤户root的可执⾏命令存放地,普通⽤户⽆权限执⾏这个⽬录下的命令,sbin中包含的都是root权限才能执⾏的。
  • /usr:这是linux系统中占⽤硬盘空间最⼤的⽬录。⽤户的很多应⽤程序和⽂件都存放在这个⽬录下。 Unix software resource usr。类似windows系统的program files
  • /usr/local:这⾥主要存放那些⼿动安装的软件,即不是通过或apt-get安装的软件。它和/usr⽬录具有相类似的⽬录结构。
  • /usr/share :系统共⽤的东⻄存放地,⽐如 /usr/share/fonts 是字体⽬录,/usr/share/doc和/usr/share/man帮助⽂件。
  • /etc:管理所有的配置⽂件的⽬录,⽐如安装mysql的配置⽂件my.conf
  • /mnt:可供系统管理员使⽤,⼿动挂载⼀些临时设备媒体设备的⽬录。
  • /media:是⾃动挂载的⽬录。当把U盘插⼊到系统中,会⾃动挂载到该⽬录下。⽐如插⼊⼀个U盘,会⾃动到/media⽬录中挂载。
  • /opt:额外安装软件存放的⽬录。⽐如mysql的安装包就可以放在该⽬录

Linux vs Windows


NAT vs 桥接模式 vs 仅主机

  • NAT模式默认情况下是DHCP模式,是自动获取IP的,导致每次虚拟机开启之后获取的IP可能会变化

  • 假如项目中后续连接的是虚拟机上面的MySQL,那么MySQL的HOST地址可能会经常改变,这就需要我们经常去改项目中的MySQL的连接地址,比较麻烦

    • 桥接模式是共享的物理网卡,可以ping通
  • 所以需要改为静态IP,也就是每次开机之后IP不会变,这样才能方便我们后面项目的开发。


Linux 常用命令

  • sudo 是代表root的权限去执行

  • 修改root的密码

    1
    sudo passwd root
  • 添加一个用户

    1
    2
    3
    4
    useradd –m test –s /bin/bash
    # -s 的作用是指定使用的脚本解析器
    # -m 会创建目录
    # /bin/bash 是脚本解析器
  • 查看当前系统的用户

    1
    cat /etc/passwd 
  • 切换用户

    1
    su [用户名]
  • ctrl + a:光标回到行首

  • ctrl + e:光标回到尾部

  • Linux下基本上所有的命令成功没有提示,失败是会有提示的

  • 出现登录后只有一个$符号的原因:useradd没有执行-s指令

  • 删除用户后,要删除该用户的家目录

    1
    2
    userdel -r [用户名]
    # -r 删除用户名对应的目录
  • 删除用户出现如下原因:

    • 删除的用户不能是正在运行的用户
      • 解决方案:多次exit或者直接关闭xshell
  • Xshell中输入退格健出现乱码 的解决方案

  • 查看之前的记录

    1
    history
    1
    2
    3
    eg:
    # 将后面的75行历史记录导出到xxx.txt
    history | tail -75 > xxx.txt
  • scp 远程copy文件命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    scp filename username@ip:path
    # filename:文件名称
    # username:copy到的目标主机的用户名
    # ip:目标主机IP
    # path:目标主机路径

    # 分为两种情况:
    # 从本机copy到远程机器
    scp file1 coo1heisenberg@xxx.xxx.xxx.xxx:~/

    # 从远程机器copy到本机
    scp coo1heisenberg@xxx.xxx.xxx.xxx:~/file1 .
  • 如何让xshell中名字变色($PS1)

    • 直接在命令行执行即可
    1
    export PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@ \[\e[36;40m\]\w\[\e[0m\]]\\$ "
  • 查看对应命令的帮助

    • man 命令,通过/来进行搜索
  • 文件查找

    • find命令:find 起始目录 查找条件 操作

      • * 代表零个或者任意多个字符

      • ? 代表有且只有一个字符

      • [] 连续的一部分字符

        1
        2
        3
        find . -name "file*"
        find . -name "file?"
        find . -name "file[1-3]"
      • -empty:查找大小为 0 的目录或文件

        1
        find . -empty
      • -perm :查找具有指定权限的文件和目录,权限的表示

        1
        find . -perm 777
      • -size n[bckMG]:查找指定文件大小的文件,n 后面的字符表示单位,缺省为 b,代表 512 字节的块。后面要带加号或者减号,表示大于或者小于多大的文件

        1
        find . -size +1G
      • -type x:查找类型为 x 的文件

        • f 普通文件

          1
          find . -type f
        • l 符号链接文件(symbolic links)

          • ln -s 建立软连接

            1
            2
            3
            touch file1
            touch file2
            ln -s file1 file2
          • ln 建立硬链接

            1
            ln file1 file2
            • 硬链接数:就是file1和file2的inode值是一样的,说明这两个文件都可以访问磁盘上inode对应的数据
              • 当硬链接数为0时,文件所对应的block就会被操作系统回收,分配给其他文件
      • -exec 命令名称 {}:可以让find指令与其他指令一起操作

        1
        2
        3
        find . -name "file*" -exec ls -l {} \

        # 这后面的 {} \ 是必须加上的,就是把 find 命令找出的文件放到了{}
        1
        2
        3
        # 比如说 : 把 file* 文件都复制到dir对应的目录下

        find . -name "file*" -exec cp {} dir \
      • |:就是管道,是上面命令的另外一种写法

        1
        2
        3
        find . -name "file*"|xargs ls -l

        # xargs:是分别进行的意思,find命令在执行管道的时候必须加上xargs
        1
        2
        3
        # 比如说 : 把 file* 文件都复制到dir对应的目录下

        find . -name "file*" | xargs -i cp {} dir
  • df -h:查看磁盘空间剩余大小

  • 对文件内容进行排序

    1
    sort 文件名
  • 查看文件内容类型

    1
    2
    3
    file 文件名 

    # 根据文件内容,判别文件类型
  • 报告或删除文件中重复的行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    uniq 文件名

    -c 在输出行前面加上每行在输入文件中出现的次数
    -d 仅显示重复行
    -u 仅显示不重复的行

    eg:
    sort file4|uniq
    # 先排序再去重
  • 统计指定文件中的行数、字数、字节数

    1
    2
    3
    4
    5
    6
    wc 文件名

    -c 统计字节数
    -l 统计行数
    -m 统计字符数。这个标志不能与 -c 标志一起使用
    -w 统计字数。一个字被定义为由空白、跳格(tab)或换行字
  • 搜索文件内容 grep

    1
    2
    3
    4
    grep [选项] [查找模式] [文件名 1,文件名 2,…]

    eg:
    grep world file1

Linux 其他命令

  • 绝对路径: 路径的写法,由根⽬录/写起
    • 例如: /usr/share/doc 这个⽬录。
  • 相对路径:路径的写法,不是由 / 写起
    • 例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:cd ../man或cd man
  1. 设置静态IP

    • 查看虚拟机本地的IP地址,执行命令
    1
    2
    3
    4
    5
    # 查看本地IP地址
    ifconfig

    # 如果提示没有找到这个命令,那么首先需要安装工具
    sudo apt install net-tools
  2. pwd :显示当前⽬录路径

  3. ls:(list directory contents)显示当前⽂件夹下的⽬录或⽂件

    • 常⽤选项:

      • -a 显示所有的⽂件夹和⽂件,包括隐藏⽂件
      • -l 以详细的形式显示
      • -i 加 i 显示inode值
    • 文件的大小会显示单位,可读性比较好

      1
      2
      ls -ah
      # h : human readable(人类可读的)
  4. cd : 进⼊⼀个路径或者⽬录,绝对路径或者相对路径都可以

    • cd [路径]:⽐如 cd ~(代表进⼊家⽬录)
    • cd . :进入当前⽬录
    • cd ..:进⼊上⼀级⽬录
    • cd /home:进⼊根目录下的home⽬录
    • ~:代表当前用户的家目录
    • cd -:到上一次目录

Linux⽂件与⽬录管理相关指令

目录文件

  • mkdir: 创建新目录

    1
    mkdir 目录的相对路径或绝对路径
  • rmdir: 删除空目录

    1
    rmdir 目标目录的相对路径或绝对路径
  • rm: 移除⽂件或⽬录

    1
    2
    3
    -f :就是 force 的意思,忽略不存在的⽂件,不会出现警告信息;
    -i :互动模式,在删除前会询问使⽤者是否动作
    -r :递归删除啊!最常⽤在⽬录的删除了!这是⾮常危险的选项!!!
    • 危险的命令

      1
      sudo rm -rf /
  • cp:复制文件或目录

    1
    2
    3
    4
    5
    cp [-adfilprsu] 来源档(source) ⽬标档(destination)
    -a:相当于 -pdr 的意思,⾄于 pdr 请参考下列说明;(常⽤)
    -d:若来源档为连结档的属性(link file),则复制连结档属性⽽⾮⽂件本身
    -p:连同⽂件的属性⼀起复制过去,⽽⾮使⽤默认属性(备份常⽤)
    -r:递归持续复制,⽤於⽬录的复制⾏为;(常⽤)
  • mv:移动⽂件与⽬录,或修改⽂件与⽬录的名称

    1
    2
    3
    4
    5
    6
    7
    8
    mv [-fiu] source destination
    -f :force 强制的意思,如果⽬标⽂件已经存在,不会询问⽽直接覆盖;
    -i :若⽬标⽂件 (destination) 已经存在时,就会询问是否覆盖!
    -u :若⽬标⽂件已经存在,且 source ⽐较新,才会覆盖 (update)

    eg:
    mv file1 dir1 # 移动
    mv file1 file2 # 改名

    我们可以使⽤ man [命令] 来查看各个命令的使⽤⽂档,如 :man cp。

  • tree:查看文件的树状结构

    • 查看文件的大小

      1
      tree -h

普通文件

  • touch:创建文件

    1
    touch 目标文件的相对路径或绝对路径
  • 查看文件内容

    1. cat命令: 以只读的⽅式打开⼀个⽂件。可以加 -n 表示带上⾏号(适合查看⽂件内容⽐较少的)

      1
      2
      3
      4
      5
      6
      7
      命令: cat [选项] [文件]
      功能: 查看目标文件的内容

      -b 对非空输出行编号
      -E 在每行结束处显示$
      -n 对输出的所有行编号
      -s 不输出多行空行
    2. more命令:和cat功能类似,不过是以分⻚的形式⼀⻚⼀⻚显示数据

      1
      2
      3
      4
      5
      6
      7
      cat [选项]  目标文件
      选项:
      +n: 从笫n⾏开始显示
      -c: 从顶部清屏,然后显示
      分页查看命令:
      空格: 向后翻一页
      b: 键就会往回(back)⼀⻚显示
    3. less:也⽤来分⻚显示数据,但是功能⽐more强⼤。并不会⼀次性将全部⽂件读取才显示,⽽是根据显示的需要加载对应的数据。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      less [选项] 目标文件
      选项:
      -f :强迫打开特殊⽂件,例如外围设备代号、⽬录和⼆进制⽂件
      -m :显示类似more命令的百分⽐
      -N :显示每⾏的⾏号
      分页查看命令:
      f 向后翻⼀⻚
      d 向后翻半⻚
      h 显示帮助界⾯
      q 退出less 命令
      u 向前滚动半⻚
      y 向前滚动⼀⾏
    4. head:查看⼀个⽂件,取开头的⼀部分内容

      1
      head -n 目标文件,表示查看目标文件的前n行内容,比如 head -5 a.txt
    5. tail:查看⼀个⽂件的尾部内容

      1
      2
      3
      tail -n 目标文件,查看⽂件的最后n行内容,比如 tail -5 a.txt
      tail -f filename,尾部持续不断地输出内容。Control + c退出
      例如:tail -5f filename
  • 重定向和追加

    1. echo: 输出内容到控制台。

      1
      echo $PATH 输出Linux的环境变量到控制台
    2. > 命令:输出重定向(会将原来的内容覆盖)

      1
      2
      3
      echo hello > a.txt 将字符串hello, 写入a.txt文件
      ls -l > a.txt 将目录信息,写入a.txt文件
      cat a.txt > b.txt(⽂件可以存在,可以不存在) 将a.txt文件内容写入b.txt文件中
    3. >> 命令:追加(不会覆盖原⽂件的内容,追加到底部)

      1
      2
      3
      echo hello >> a.txt 将字符串hello, 追加 写入到a.txt文件
      ls -l >> a.txt 将目录信息,追加 写入a.txt文件
      cat a.txt >> b.txt(⽂件可以存在,可以不存在) 将a.txt文件内容写入b.txt文件中
  • 压缩与解压缩

    • tar 是⽤来建⽴,还原备份⽂件的⼯具程序,它可以加⼊,解开备份⽂件内的⽂件。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      tar
      -c:产⽣.tar⽂件
      -v:显示详细信息
      -z:打包同时压缩
      -f:指定压缩后的⽂件名
      -x:解压.tar⽂件

      压缩: tar -zcvf combine.tar.gz 1.txt
      解压: tar -zxvf combine.tar.gz -C java/

      -C 表示解压到指定⽬录


      如果需要解压和压缩为 `.zip` 格式的⽂件,那么需要安装zip和unzip命令

      eg:
      # 把所有文件打包并压缩到test.tar.gz下
      tar -zcvf test.tar.gz *
      tar -zxvf test.tar.gz -C xxx/

      # .tar.gz 一般表示打包并压缩

文本编辑

Ubuntu默认没有安装vim,需要先安装vim⼯具。

1
sudo apt install vim

更改vim配置:

  • 在家目录下创建一个vimrc文件,并写入以下内容

    1
    2
    3
    set nu                                                                                    set cursorline
    set hlsearch
    set tabstop=4
  • 然后执行下面的命令生效配置

    1
    cp vimrc .vimrc

    效果图

vim有三种模式:命令模式(Command mode)、插⼊模式(Insert mode)、末⾏模式(Last Linemode)。

  • 命令模式

    通过指令 vim filename 进⼊命令模式。除此之外,还有⼀些其他的参数,⽐如:
    -R:把指定的⽂件以只读的⽅式放⼊vim编辑器中
    +:打开⽂件,并把光标置于最后⼀⾏的⾸部
    +n:打开⽂件,并把光标置于第n⾏的⾸部

    命令模式快捷键:

    • 删除:
      x:删除光标处的字符
      dd:删除光标所在的整行

      ​ eg:3dd 删除光标所在行以及下面的两行(删除 3 行)

      ​ ndd:删除当前⾏后n⾏⽂本(包括此⾏)
      ​ dG:删除光标所在⾏⼀直到⽂件末尾的所有内容
      ​ D:删除光标位置到⾏尾的所有内容

      ​ yy:复制光标所在的整行

      ​ eg:3yy yy从光标开始往下复制 3 行

      ​ p:将复制后的文本粘贴到光标处

      ​ 剪切的效果:先 dd 再去 p

      ​ u:撤销上次操作

    • 光标移动:
      w: 光标移动⾄下⼀个单词⾸
      e: 光标移动⾄下⼀个单词尾
      b: 光标移动⾄上⼀个单词⾸
      gg: 光标移动到⽂件开头
      G: 光标移动⾄⽂件末尾
      nG: 光标移动到第n⾏,n为数字
      0或^:光标移动⾄当前⾏的⾏⾸
      $: 光标移动⾄当前⾏的⾏尾

      ​ eg::50 到达文件的第 50 行

    • 查找与替换

      ​ /[str] :查找字符串 str,[str]表示要查找的字符串

      ​

      ​ :s/[src]/[dst]:部分替换 (只能替换光标之所在的行),将本行出现的字符串 src 替换为 dst

      ​ /i:忽略大小写

      ​ /g:全部匹配

      ​ eg::s/hello/world/ig 替换一行

      ​

      ​ :%s/[src]/[dst]/g:全部替换,将文档中所有 src 的字符串替换为 dst 字符串

      Ctrl +v 竖向选择模式,主要用于批量注释代码,输入步骤如下:

      ​ 1、首先按 ctrl+v,竖选选中要注释的行

      ​ 2、输入 I(注意是大写的 I),然后输入//

      ​ 3、再输入 esc,就会看到选中的行被注释了

      在命令模式下输入:new 2.c ,表示再打开一个 vim,是横向的

      用 vnew 2.c 表示纵向的

      sed:管道查找替换程序

      1
      2
      sed 's/aa/bb/' a.txt > b.txt 
      # 将 a.txt 中的 aa 替换成 bb 并重,定向输出到 b.txt 中。
  • 插入模式

    在命令模式下,通过按下i、I、a、A、o、O这6个字⺟进⼊插⼊模式,不同的字⺟代表不同的进⼊⽅式。

    ​ i: 在当前光标位置前⾯插⼊随后输⼊的⽂本,光标后的⽂本相应向右移动
    ​ I: 在光标所在⾏的⾏首插⼊随后输⼊的⽂本
    ​ o: 在光标所在⾏下⾯插⼊新的⼀⾏,然后光标停在空⾏⾸,等待输⼊⽂本
    ​ O: 在光标所在⾏上⾯插⼊新的⼀⾏,然后光标停在空⾏⾸,等待输⼊⽂本
    ​ a: 在当前光标位置后⾯插⼊随后输⼊的⽂本,光标后的⽂本相应向右移动
    ​ A: 在光标所在⾏的⾏尾插⼊随后输⼊的⽂本

    按下ESC键离开插⼊模式,进⼊命令模式

  • 末行模式

    在命令模式下,按下: 键进⼊末⾏模式。
    在该模式下,可以使⽤⼀系列的指令,完成保存、离开vim编辑器等功能。

    :wq:保存并退出vim编辑器
    :wq!:保存并强制退出vim编辑器
    :q:不保存退出
    :q!:不保存强制退出
    :w:保存不退出
    :w!:强制保存不退出
    :w filename:另存到filename⽂件
    ZZ:直接退出

    :%!xxd:十六进制模式

    :%!xxd -r:返回文本模式,中间有一个空格的

三种模式之间的关系:


用户管理

Linux系统是⼀个多⽤户、多任务的操作系统。多⽤户是指在linux操作系统中可以创建多个⽤户,⽽这些多⽤户⼜可以同时执⾏各⾃不同的任务,⽽互不影响

在Linux系统中,会存在着以下⼏个概念:

  • 用户名: 每个用户在操作系统中,都具有唯一用户名
  • ⽤户所属的组:多个用户可以属于同一个用户组。
  • ⽤户的家⽬录:在/home目录下,与该用户的用户名一致的目录。

添加用户

  • sudo useradd [选项] ⽤户名

    1
    2
    3
    4
    sudo useradd test
    注意这种⽅式创建出来的没有家⽬录,我们创建的时候需要带参数
    sudo useradd -m test: -m 表示在 /home⽬录下创建⼀个家⽬录
    sudo useradd -m -s /bin/bash test: 表示指定shell版本是我们熟悉的bash
  • 设置用户密码

    1
    sudo passwd [⽤户名]
  • 切换用户

    1
    su [⽤户名]

删除用户

  • sudo userdel [⽤户名]

    • -r: 不仅会删除该⽤户,还会删除该⽤户对应的家⽬录

用户组管理

  • 添加组
    1
    2
    3
    4
    5
    6
    7
      groupadd [groupname]

    创建⽤户的时候加⼊组: useradd -m -s /bin/bash -g [groupname] [username]

    - 查看⽤户及组信息
    ```shell
    id ⽤户名
  • 修改用户所属组
    1
    usermod -g [groupname] [username]

文件权限管理

权限及命令

1
2
3
4
5
6
7
8
ls -l
total 40
#⽂件信息 ⽂件数 ⽤户 组名 ⼤⼩ ⽉份 ⽇期 时间 ⽂件名
drwxr-xr-x 2 xxxxxxxx xxxxxxxx 4096 Aug 2 23:52 coo1heisenberg
prw-r--r-- 1 xxxxxxxx xxxxxxxx 0 Aug 2 23:43 fifo_file
-rw-r--r-- 1 xxxxxxxx xxxxxxxx 26825 Aug 3 00:25 main.txt
-rw-r--r-- 1 xxxxxxxx xxxxxxxx 33 Aug 3 00:37 test.txt
drwxr-xr-x 3 xxxxxxxx xxxxxxxx 4096 Aug 3 01:27 xxx

前10位字符的说明:

  • 第1位:-表示是⼀个普通的⽂件;d表示是⼀个⽬录;
  • rwx:分别代表Read、Write、Execute即读、写、执⾏权限,这个顺序不会变,如果没有权限的话就⽤-代替
  • 第2-4位:表示⽂件所有者的对于文件所具有的权限
  • 第5-7位:表示和文件所有者同组的其他用户对文件所具有的权限
  • 第8-10位:⽂件其他组⽤户拥有的权限

我们可以使用chmod命令,手动修改文件权限

  • 第一种方式

    1
    2
    chmod u=rwx,g=rw,o=r filename
    u:所有者 g:所有组 o:其他组,a代表全部,没有就用空格替代
  • 第二种方式

    1
    2
    r=4,w=2,x=1 rwx = 4 + 2 + 1 = 7
    chmod 751 等价于 u=rwx,g=rx,o=x

进程管理

查看进程

  • Linux系统中查看进程使⽤情况的命令是ps命令,但是ps命令一般都不会单独使用
1
2
3
4
5
6
常⻅选项:
-e:显示所有进程
-f:全格式
a:显示终端上的所有进程
u:以⽤户的格式来显示进程信息
x:显示后台运⾏的进程

⼀般常⽤格式为ps -ef或者ps aux两种。显示的信息⼤体⼀致,略有区别

eg:

在这里插入图片描述

1
2
3
4
5
6
7
8
9
UID:⽤户ID
PID:进程ID
PPID:⽗进程ID
C:CPU⽤于计算执⾏优先级的因⼦。数值越⼤,表明进程是CPU密集型运算,执⾏优先级会降低;数值越
⼩,表明进程是I/O密集型运算,执⾏优先级会提⾼
STIME:进程启动的时间
TTY:完整的终端名称
TIME:CPU时间
CMD:完整的启动进程所⽤的命令和参数

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
USER:⽤户名称
PID:程号
%CPU:进程占⽤CPU的百分⽐
%MEM:进程占⽤物理内存的百分⽐
VSZ:进程占⽤的虚拟内存⼤⼩(单位:KB)
RSS:进程占⽤的物理内存⼤⼩(单位:KB)
TT:终端名称(缩写),若为?,则代表此进程与终端⽆关,因为它们是由系统启动的
STAT:进程状态,其中S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有⽐普通优先级更低的
优先级,R-正在运⾏,D-短期等待,Z-僵死进程,T-被跟踪或者被停⽌等
STARTED:进程的启动时间
TIME:CPU时间,即进程使⽤CPU的总时间
COMMAND:启动进程所⽤的命令和参数,如果过⻓会被截断显示

ps -ef 与 ps -aux的区别:

  • 如果想查看进程的⽗进程ID和完整的CMD命令,可以使⽤ef
  • 如果想查看进程的CPU占⽤率和内存占⽤率,可以使⽤aux

进一步筛选想要查询的目标进程信息:

1
2
#搜索匹配进程
ps -ef | grep [搜索内容]

终止进程

  • kill [选项] 进程号
1
2
3
选项:
-9:操作系统从内核级别强制杀死⼀个进程
-15:可以理解为操作系统发送⼀个通知告诉应⽤主动关闭

服务管理

  • 服务本质上来说也是⼀个进程,只不过是在后台运⾏。监听着某⼀端⼝,等待该端⼝的请求到来,⽐如ssh服务监听着22端⼝,mysql服务监听着3306端⼝;

  • systemctl start/stop/restart/status/reload 服务名称

    1
    2
    #⽐如关闭ssh服务
    systemctl stop sshd

网络管理

查看网络设置

1
ifconfig

查看⽹络端⼝占⽤

  • netstat
1
2
3
4
5
-a:显示全部
-n:以数字的形式显示
-p:显示该连接被哪个应⽤程序占⽤PID
eg:
netstat -anp | grep 3306
  • lsof -i: 端⼝号

测试网络是否正常

1
ping [⽬的ip或者域名]

Linux 知识点整理


Linux怎么看进程占用的 CPU?

答:

ps 和 top 命令都能查看进程占用的的 CPU

补充:

ps 命令可以看到:

ps命令

top 命令也可以看的到,可以看到各个进程的相关信息,包括进程ID(PID)、进程名、CPU 使用率等。默认情况下,进程按照 CPU 使用率的降序排列,最占用 CPU 的进程会显示在列表的顶部

top命令


Linux怎么查看一个进程的进程号?

答:

ps 和 top 命令都能查看进程的 PID


Linux怎么看进程中的线程?

答:

先通过 ps 命令找到进程的 pid 号之后,通过 ps -T -p <pid>,就可以显示进程中的线程了。或者 top -H -p <pid> 命令也可以

补充:

  • 方式一:ps

  • 在 ps 命令中,-T 选项可以开启线程查看。下面的命令列出了由进程号为 <pid> 的进程创建的所有线程

    1
    ps -T -p <pid>

    ps -T -p 3788

  • SPID 栏表示线程ID,而 CMD 栏则显示了线程名称

  • 方式二:top

  • top 命令可以实时显示各个线程情况。要在 top 输出中开启线程查看,请调用 top 命令的 -H 选项,该选项会列出所有 Linux 线程。在 top 运行时,你也可以通过按 H 键将线程查看模式切换为开或关

    1
    top -H

    top -H

  • 要让 top 输出某个特定进程 <pid> 并检查该进程内运行的线程状况:

    1
    top -H -p <pid>

详细链接:Linux查看进程的线程信息_查看线程-CSDN博客


Linux怎么看端口被哪个进程占用了?

答:

通过 netstat 或者 lsof 命令都可以知道端口被哪个进程占用了

补充:

netstat 命令可以看到端口被哪个进程占用了

比如:查看 443 端口被哪个进程占用了,可以看到是被 nginx 占用了

举例

或者 lsof 命令也可以:lsof -i : <端口号>:

1
lsof -i:443 

详细链接:Linux netstat命令 | 菜鸟教程、技术|Linux 命令神器:lsof 入门


怎么查看一个进程占用的端口号?

答:

通过 netstat 或者 lsof 命令输出的内容之后,通过 grep 指定的进程号,然后就可以过滤出进程占用的端口号

补充:

  • 可以使用 netstat 命令或者 lsof 命令来实现

  • 查看一个进程的端口的命令如下:

  • 使用 netstat 命令:

    1
    netstat -tulnp | grep <进程ID>
    • -tulnp:监听的 TCP 和 UDP 端口,并包含每个端口对应的进程信息
  • 使用 lsof 命令:

    1
    lsof -i -P -n | grep <进程ID>
    • -i:显示与网络相关的文件(包括 TCP/UDP 的监听和连接)
    • -P:以数字端口号显示,而不是服务名称。例如,显示 80 而不是 http
    • -n:以数字形式显示 IP 地址,而不是解析成主机名。例如,显示 192.168.1.1 而不是 example.com
  • 在这两个命令中,<进程号> 是您要查看的进程的进程号。通过这些命令,您可以查看指定进程正在使用的端口信息


Linux 怎么看 tcp 状态?

答:

netstat 或者 ss 命令可以查看到 tcp 连接的状态

补充:

使用命令 netstat -nat 可以显示所有的 TCP 连接和监听状态

netstat -nat

使用命令 ss -t 可以显示当前的 TCP 连接状态

ss -t

详细链接:Linux netstat命令 | 菜鸟教程


如何判断远端端口是否开启?

答:

可以用 nc 或者 telnet 来判断远程端的端口是否开启

补充:

  • nc 命令探测远程端口

    1
    2
    3
    4
    5
    6
    7
    8
    # nc: 即执行的命令主体:
    # z: 零 I/0 模式(被用来扫描);
    # v: 显式地输出;
    # w3: 设置超时时间为 3 秒:
    # 192.168.1.8: 目标系统的 IP 地址;
    # 22: 需要验证的端口。

    nc -zvw3 192.168.1.8 22
    • 未连接成功案例

      1
      2
      3
      (base) oelab@OELab-Server:~$ nc -zvw3 192.168.1.8 22
      nc: connect to 192.168.1.8 port 22 (tcp) timed out: Operation now in progress

  • telnet 命令探测远程端口

    1
    2
    3
    telnet [HostName or IP] [PortNumber]

    telnet 192.168.1.8 22
    • 未连接成功案例

      1
      2
      3
      (base) oelab@OELab-Server:~$ telnet 192.168.1.8 22
      Trying 192.168.1.8...
      telnet: Unable to connect to remote host: Connection refused

详细链接:技术|查看远程 Linux 系统中某个端口是否开启的 3 种方法


Linux查看TCP连接数?

答:

先通过 netstat -nat 命令显示 tcp 连接信息,然后用 grep 过滤出处于 ESTABLISHED 状态的 tcp 连接,最后用 wc -l 统计连接个数,就可以查看当前系统上处于 ESTABLISHED 状态的连接数了

补充:

eg:

1
netstat -nat | grep ESTABLISHED| wc -l
  • wc -l:wc 命令用于统计输出的行数,-l 参数表示只统计行数

结果示意图


Linux top 命令有哪些信息?

答:

主要有 系统的负载均衡情况、CPU 使用情况、内存使用情况、运行进程数量,还有进程列表,进程列表主要会显示当前运行的进程的详细信息,包括进程ID(PID)、CPU 使用率、内存使用率、进程优先级 等

补充:

top指令信息

  1. Load Average(负载均衡):显示系统在最近1、5、15分钟内的平均负载情况
  2. CPU 使用情况:显示总体的CPU使用率以及每个CPU核心的使用率
  3. 内存使用情况:显示物理内存的总量、使用量、空闲量等信息
  4. Swap 使用情况:显示交换空间(swap)的总量、使用量、空闲量等信息
  5. 运行进程数量:显示当前运行的进程数量和总的进程数量
  6. 进程列表:显示当前运行的进程的详细信息,包括进程ID(PID)、CPU使用率、内存使用率、进程优先级等
  7. 系统运行时间:显示系统的运行时间
  8. 用户信息:显示当前登录系统的用户数量和用户的相关信息
  9. 系统负载信息:显示系统的负载情况,包括运行队列长度、上下文切换次数等

CPU 使用率达到100%呢?怎么排查?

答:

Java中,首先先通过 top 命令找到占用 CPU 最高的进程,然后通过 top -Hp 命令找到进程中占用 CPU 最高的线程,记录这个线程的 id 号,接着通过 jstack 打印这个线程的堆栈信息,通过这些信息定位到具体的代码位置去排查问题

补充:

  1. 通过 top 找到占用率高的进程

    top指令

  2. 通过 top -Hp pid 找到占用 CPU 高的线程ID。这里找到3788的线程ID

    top -Hp pid

  3. 再把线程ID转化为16进制,printf "0x%x\n" 958,得到线程ID 0x3be

  4. 通过命令 jstack 163 | grep '0x3be' -C5 --color 或者 jstack 163 | vim +/0x3be - 找到有问题的代码

详细链接:线上cpu使用率100%如何排查-腾讯云开发者社区-腾讯云、记一次线上CPU使用率飙升排查过程 - 走走停停


怎么用 top 命令查看是多少个 CPU 核心?

答:

执行 top 命令之后,然后按键盘的数字 1,就能显示服务器有多少个 CPU 核心了

补充:

1
top 1

查看CPU核心数

详细链接:Linux CPU使用率超过100%的原因 - 简书


Linux top 结果 CPU 占用会超过 100% 吗?

答:

top 命令显示的是所有 cpu 占用的总数,如果 cpu 是多核心的,那么是会观察到 cpu 显示超过 100% 的,可以通过按键盘数字 1,来显示每个 cpu 的 cpu 占用率

补充:

top 显示的 CPU 占用率是所有 CPU 核心占用 CPU 的数值累加,比如说:CPU1 的 CPU 占用率是 80%,CPU2 的 CPU 占用率是 80%,那么 top 显示的 CPU 占用率就是 160%

通过在 top 的情况下按大键盘的1,查看的 cpu 的核数为26核

top 1

top 命令显示的是所有 cpu 占用的总数,也就是说如果你是 4 核 cpu 那么 cpu 最高占用率可达 400%,top 里显示的是把所有使用率加起来


Linux 如何查看内存使用情况?

答:

可以用 free 命令来看

补充:

可以用 free 命令查询操作系统的内存情况

free -m

  • total:表示系统总共的内存大小
  • used:表示已使用的内存大小
  • free:表示空闲的内存大小
  • shared:表示被共享使用的内存大小
  • buff/cache:表示被缓存和缓冲的内存大小
  • available:表示系统当前可用的内存大小

详细链接:linux free命令输出的每一列的含义_free -m | grep mem-CSDN博客


Linux 怎么查看磁盘剩余多少?

答:

df -h 就能查看磁盘的空间大小了

补充:

使用命令 df -h 可以显示磁盘空间的使用情况,包括已使用、可用和总共的磁盘空间

df -h

详细链接:Linux df 命令 | 菜鸟教程


Linux 服务器当中如何查看负载情况?通过什么指标进行查看?

答:

可以通过 top 命令或者 uptime 命令,会有一个平均负载的情况,主要有三个数字,依次则是过去 1 分钟、 5 分钟、15 分钟的平均负载,可以通过观察这三个数字的大小,可以简单判断系统的负载是下降的趋势还是上升的趋势

补充:

  • 通常我们发现系统变慢时,我们都会执行 top 或者 uptime 命令,来查看当前系统的负载情况,比如:执行了uptime,系统返回的了结果,最后一个就是系统平均负载的情况

    uptime

    • Load Average 的三个数字,依次则是过去 1分钟、5分钟、15分钟 的平均负载。可以通过观察这三个数字的大小,可以简单判断系统的负载是下降的趋势还是上升的趋势。负载值一般不超过cpu核数的 1-1.5 倍,如果超过 1.5 倍,那就要重视,此时会严重影响系统
    • 如果 load average: 1.00,5.00,10.00 三个数字依次增大,则说明在过去的 1 分钟系统的负载比过去 15 分钟系统的负载小,表明系统的负载是下降的趋势
    • 如果 load average: 10.00,5.00,1.00 三个数字依次降低,则说明在过去的 1 分钟系统的负载比过去 15
      分钟系统的负载大,表明系统的负载是上升的趋势
    • 如果 load average: 0.07,0.04,0.0 三个数字基本相同,或者相差不大, 表明系统的负载是平稳的。
    • 平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数
  • 所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程

  • 而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应

    • 比如:CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
    • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
    • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高

详细链接:Linux性能调优 | 01 平均负载的理解和分析_如何分析linux主机的整体负载在降低?-CSDN博客


Linux 查看文件的命令有哪些?

答:

  • 查看文件内容常用的命令是:
    • cat:可以显示文件的所有内容
    • head:显示文件的开头部分,默认显示头部 10行
    • tail:显示文件的未尾部分,默认显示未尾 10 行
    • more:逐页显示文件内容,只能向前翻页,无法向后滚动
    • less:与 more 类似,提供更多功能,如:向前/向后翻页、搜索等

详细链接:技术|在 Linux 上查看文件内容的 5 种方法


Linux 查看文件大小?

答:

可以用 ls -l 或者 du -h 命令查看文件的大小

补充:

  1. ls-l:显示文件的详细信息,包括文件大小(以字节为单位)

    1
    ls -l filename
  2. du -h:显示目录或文件的大小,以人类可读的方式(例如:KB、MB)显示

    1
    du -h filename
  3. stat:显示文件的详细信息,包括文件大小和其他属性

    1
    stat filename

详细链接:查看文件、目录、文件系统大小 - Linux Guide


Linux 查询当前所在目录的语句?

答:

pwd 命令

补充:

pwd:使用 pwd 命令,可以显示当前工作目录的绝对路径

详细链接:Linux pwd命令 | 菜鸟教程


Linux 创建文件夹和文件的语句是什么?

答:

创建文件夹用 mkdir 命令,创建文件用 touch 命令


Linux 如何删除一个文件?

答:

rm 命令可以用来删除文件


Linux 如何删除一个目录(文件夹)?

答:

rm -r 命令来递归删除目录

补充:

1
rm -r directory_name
  • 在这个命令中,rm 是删除命令,-r 是递归删除的参数,directory_name 是要删除的目录名称

Linux 怎么创建、复制、移动一个文件?

答:

创建文件用 touch 命令、复制文件用 cp 命令、移动文件用 mv 命令


Linux cp 命令怎么复制整个文件夹?

答:

可以用 cp 命令结合 -r 参数,进行递归复制,这样就能复制整个文件夹了

补充:

1
cp -r /path/to/source /path/to/destination
  • -r 表示进行递归复制

Linux 如何文件重命名?

答:

可以用 mv 命令将文件重命名


Linux 文件夹中如何查看最近被修改的文件?

答:

可以用 ls 命令结合 -lt 参数,按照文件修改时间排序显示,这样最近修改的文件将会显示在最上面

补充:

1
ls -lt
  • 在这个命令中, ls 是列出文件和目录的命令,-l 是以列表方式显示文件和目录的详细信息,-t 是按照文件修改时间排序,最近修改的文件将会显示在最上面

Linux 怎么修改文件的权限?

答:

通过 chmod 命令来修改文件权限,如果这个文件需要执行权限,可以通过 chmod u+x 文件名 命令来实现


Linux 中如何查找一个文件?

答:

可以适用 find 命令来查找目标文件

补充:

查找一个文件的命令如下:

1
find /path/to/search -name "filename"
  • 在这个命令中,find 是用来搜索文件的命令,/path/to/search 是要搜索的目录路径,-name "filename"表示要查找的文件名

Linux 怎么查看实时滚动日志?

答:

可以用 tail 命令,再加一个 -f 的参数,来查看实时滚动日志

补充:

查看日志最好用 tail 的方式,而不是 cat。因为 cat 是读取所有文件数据,如果日志文件很大,可能会影响系统性能,而 tail 命令只显示文件的尾部内容,只显示部分数据

如果要看实时滚动的数据的话,用这个命令:tail -f,这样你看日志的时候,就会是阻塞状态,有新日志输出的时候,就会实时显示出来

1
tail -f xxx.log

现在有一个txt文件,如何查看后三行?

答:

可以用 tail 命令,再加上 -n 3 的参数,就可以查看文件最后三行的内容了

1
tail -n 3 xxx.txt

查找一个字符串是否在文件中?

答:

可以用 grep 命令

补充:

可以使用 grep 命令来查找一个字符串是否在文件中出现。grep 命令用于在文件中搜索指定的字符串模式,并输出匹配的行。命令的基本语法如下:

1
grep [选项] 字符串 文件名
  • 其中,选项可以是:
    • -i:忽略大小写
    • -r:递归地搜索指定目录及其子目录下的文件
    • -n:显示匹配行的行号
    • -l:仅显示包含匹配字符串的文件名

Linux 怎么查找一个文件里的某一个字符串的位置?

答:

可以用 grep -n 命令,查找一个文件中某个字符串的位置


Linux 查看文件行数命令?

答:

可以使用 wc -l 命令,查看文件的行数


在一个目录下寻找含有字符串“admin”的文件?

答:

可以通过 grep -r "admin" 目录名 命令来实现,-r 是表示递归地搜索指定目录下的所有文件


统计一个文件中某一个字段的次数?

答:

可以通过 grep -o 过滤出字段之后,然后用 wc -l 统计出现的次数

1
grep -o '字段A' filename | wc -l

如何替换一个文件中的字符串?

答:

可以用 sed 命令,比如:使用 sed -i 's/日字符串/新字符串/g' 文件名 命令

补充:

  • 可以使用 sed 命令。以下是一个示例:

    1
    sed -i 's/日字符串/新字符串/g' 文件名
  • 在上面的命令中:

  • -i 选项表示直接在原始文件中进行修改,而不是输出到标准输出

  • s/旧字符串/新字符串/g :是替换操作的模式,其中旧字符串是要替换的字符串,新字符串是替换后的新字符串

  • g 表示全局替换,即一行中出现多次的旧字符串都会被替换

例如,假设要将文件 example.txt 中的字符串 Hello 替换为 Hi,可以运行以下命令:

1
sed -i 's/Hello/Hi/g' example.txt

详细链接:Linux sed 命令 | 菜鸟教程