0. 环境配置

配置一个 Linux 环境,我们需要先安装一个虚拟机,然后在虚拟机上面安装一个 Linux 系统来学习

  • 安装 virtual machine
  • 在 vm 中安装 Linux(这里使用的是 CentOS 7)

具体的环境安装教程:

【小白入门 通俗易懂】2021韩顺平 一周学会Linux

1. 虚拟机相关操作

1.1 虚拟机克隆

如果已经安装好了一个 Linux 系统,没有必要重新安装,只需要进行克隆即可,有两种方法:

  • 直接拷贝一份安装好的虚拟机文件
  • 使用 vmware 的克隆操作,克隆时需要关闭 Linux 系统

这里放一个链接,以后需要克隆操作了来这里就行

虚拟机克隆的两种方式

1.2 虚拟机快照

在使用虚拟机系统的时候,如果想要回到原先的某一个状态,就可以使用虚拟机快照

虚拟机快照暂时用不上,这里先空着

1.3 vmtools

vmtools 是为了让我们在 windows 下更好地管理虚拟机,可以设置 windows 和 Linux 的共享文件夹

image-20221221173727524

至于使用教程,看【小白入门 通俗易懂】2021韩顺平 一周学会Linux

2. Linux目录结构

2.1 基本介绍

Linux 的文件系统采用的是层级式的树状目录结构,在此结构中最上层的是根目录/,然后在此目录下创建其他目录。

在Linux世界里,一切对象皆文件!

Linux 系统目录结构| 菜鸟教程

2.2 具体目录结构

许多目录了解即可,使用多了就熟了

  • /bin

    Binary 的缩写,存放经常使用的命令

  • /sbin

    s 表示 Super user,存放系统管理员使用的系统管理程序

  • /home

    存放普通用户的主目录,在 Linux 中每个用户都有一个自己的目录,且目录名是用户名

  • /root

    该目录为系统管理员,即超级权限者的用户主目录

  • /lib

    系统开机所需要的最基本的动态连接共享库,类似于 Win 里的 DLL 文件。

  • /lost+found

    该目录一般是空的,当系统非法关机后,这里面存放了一些文件

  • /etc

    所有的系统管理所需要的配置文件和子目录

  • /usr

    用户的很多应用程序和文件都存放在该目录下

  • /boot

    存放启动 Linux 时的一些核心文件,包括一些连接文件以及镜像文件

  • /proc

    这是一个虚拟的目录,是系统内存的映射,访问这个目录来获取系统的信息

  • /srv

    service 的缩写,存放一些服务启动之后需要提取的数据

  • /sys

    安装了内核中新出现的一个文件系统

  • /tmp

    存放一些临时文件

  • /dev

    类似于 Win 的设备管理器,把所有的硬件用文件的形式存储

  • /media

    Linux 系统会自动识别一些设备,例如 U盘、光驱等,识别后,会以文件的形式挂载到这个目录下

  • /mnt

    让用户临时挂载别的文件系统,就是之前提到的共享文件夹所在位置

  • /opt

    给主机额外安装软件所存放的目录

  • /usr/local

    这是另一个给主机额外安装软件所安装的目录

  • /var

    存放着不断扩充的东西,习惯将经常被修改的目录放在这里

  • /selinux [security-enhanced linux]

    安全子系统

2.3 Linux命令格式

Linux 命令一般由三个部分组成

1
command [-options] [parameter]

command 表示命令,必须存在;后面分别是选项和参数,可有可无。

3. 远程登录

在实际项目中,没有 Linux 图形化的用户界面,对 Linux 的操作都是通过远程操作的,常用的工具有Xshell和Xftp,前者通过命令行形式对 Linux 进行操作;后者则进行一些文件的交换。

image-20221221181122404

至于具体操作,看视频吧

4. Vi和Vim编辑器

Vi 是 Linux 内置的文本编辑器,而 Vim 具有程序编辑能力,可以看作是 Vi 的增强版本。

如何进入Vim

vim 文件名,如果文件名存在则打开现有文件;不存在就创建新文件

1
vim xxx.py

4.1 三种模式

  • 正常模式

    也称一般模式,是刚进入编辑器的默认模式。可以用【上下左右】来移动光标,也可以删除字符、删除整行;复制、粘贴来处理文件数据;可以定位行数

  • 插入模式

    按下i,I,o,O,a,A,r,R其中任意一个字母即可进入插入模式,一般来说按 i 即可,该模式主要对文本进行编辑

  • 命令行模式

    按下Esc再输入:,进入命令行模式,可以完成读取,保存,离开 vim,显示行号等操作

下面是各种模式相互切换图:

image-20221222094333426

4.2 快捷键使用

由于快捷键很多,这里只列几个常用的,最后附一张快捷键大全键盘表

  • 拷贝当前行:yy,拷贝当前行向下的5行:5yy,并粘贴:p(paste)
  • 删除当前行:dd,删除当前行向下的5行:5dd
  • 查找某个单词,在命令行模式下:/关键字,回车查找,输入n表示查找下一个
  • 显示行号【命令行模式】:set nu,隐藏行号:set nonu
  • 光标跳转【一般模式】,到最末行:G,到最首行:gg,将光标移动到目标行:先输入一个数字(要跳转的行数),在 shift+g
  • 动作撤销【一般模式】:u

vi-vim-cheat-sheet-sch

5. 关机 重启 用户登录注销

5.1 关机&重启指令

1
2
3
4
5
6
shutdown -h now 	//立即进行关机
shutdown -h 1 //1分钟后自动关机
shutdown -r now //立即重启计算机
halt //立即关机
reboot //立即重启
sync //把内存的数据同步到磁盘

:上面介绍的关机和重启命令均已经进行了 sync,但为了保险起见,还是先主动执行一次 sync,再关机或重启

5.2 用户登录和注销

root用户是系统管理员,有最大的权限。一般使用普通用户登录,su - 用户名,root切换到普通用户不需要输入密码,但相反则需要输入密码

若要注销用户,使用 logout,则会退回到上一个用户,直到所有用户都注销完。注意,该指令在图形运行级别无效,在运行级别 3 下有效,运行级别的概念之后会介绍

6. 用户管理

Linux 系统是一个多用户多任务的操作系统,任何一个想要使用系统资源的用户,都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统

6.1 添加用户

1
2
useradd cherry	//创建了一个名为cherry的用户
useradd -d 指定目录 用户名

说明:

  • 第一种方法创建的用户默认放在了 /home/cherry 文件夹下
  • 如果要指定用户的目录位置,则用第二种方法

6.2 修改密码

1
passwd cherry

给 cherry 指定密码,执行完上述指令后,输入密码即可

补充:显示当前用户所在的目录:pwd

6.3 删除用户

1
2
userdel cherry
userdel -r cherry
  • 第一种方法删除 cherry 用户,但保留了用户主目录,即 /home/cherry,这是为了保留里面的文件
  • 第二种方法同时删除了用户主目录

一般建议保留用户主目录

6.4 查询用户信息

1
2
id cherry
id root

当用户不存在时,返回无此用户

6.5 切换用户

1
2
su - cherry
su - root

正如前面提到,root 切换到 cherry 不需要密码,但反过来则需要输入密码

当返回到上一个用户时,使用exitlogout

6.6 查看用户

1
2
whoami
who am i

注意,第一个指令显示当前用户的名字,而第二个指令显示最开始用户的名字和登录时间等信息。

6.7 用户组

设置用户组,可以同时对多个用户进行统一管理

6.7.1 新增/删除
1
2
groupadd 组名
groupdel 组名
6.7.2 指定用户的组
1
2
useradd -g 用户组 用户名
usermod -g 用户组 用户名
  • 前者是在创建用户的之后直接给用户分配到一个组中
  • 后者则是修改已有的用户所在的组

注:当创建一个用户但没有给他分配组时,其用户名就是一个用户组

6.8 用户和组相关文件

  • /etc/passwd

    用户的配置文件,记录用户的各种信息

  • /etc/shadow

    口令的配置文件

  • /etc/group

    组的配置文件

7. 实用指令

7.1 运行级别

Linux 有许多种运行级别

  • 0:关机

  • 1:单用户(可以找回丢失密码)

    至于找回丢失密码具体操作详见教程

  • 2:多用户状态无网络服务

  • 3:多用户状态有网络服务

  • 4:系统未使用保留给用户

  • 5:图形界面

  • 6:系统重启

1
init 3	//切换到运行级别3

在 Centos 中进行了简化

1
2
3
systemctl get-default	//获取当前运行级别
systemctl set-default multi-user.target //设置为运行级别3
systemctl set-default graphical.target //设置为运行级别5

7.2 帮助指令

  • man获得帮助信息

    1
    man ls	//查看ls命令的帮助信息
  • help获得shell内置命令的帮助信息

    1
    help cd	//查看cd命令的帮助信息

2023/5/24

由于 man 指令比较重要,做些补充。

man 是遇到某个命令行不知道怎么用的快捷查询方法,因此掌握好 man 的使用非常重要。对于一个 man page,主要有以下几个部分:

  • NAME:简短的命令、数据名称说明。
  • SYNOPSIS:简短的命令语法简介。
  • DESCRIPTION:较为完整的说明。
  • OPTIONS:列举了所有可用选项的说明。
  • COMMANDS:可以在此程序中执行的命令。
  • FILES:参考或链接到的文件。
  • SEE ALSO:其他参考说明。
  • EXAMPLE:示例。

7.3 文件目录

在介绍文件目录前,先补充一下绝对路径和相对路径的概念。

Linux 下的根目录为 / ,从这里出发寻找文件,则是绝对路径。

而如果想使用相对路径,一个点 . 表示当前路径,两个点 .. 表示当前路径的上一个路径,../.. 表示上上一个路径,依此类推。

  1. pwd指令

    print working directory 显示当前工作目录的绝对路径

  2. ls指令

    list

    1
    2
    3
    4
    ls		//显示当前目录包含的文件和目录
    ls -a //隐藏的也显示出来
    ls -l //以列表方式显示
    ls -al //a和l也可以组合使用
  3. cd指令

    change directory 切换到指定目录

    1
    2
    3
    4
    5
    cd ~		//回到自己的家目录
    cd /root //【绝对路径】切换到/root
    cd .. //切换到上一级目录
    //如果此时在家目录home
    cd /cherry //【相对路径】切换到/home/cherry
  4. mkdir指令

    make directory 创建新的目录

    1
    2
    3
    mkdir /home/dog		//在home目录下创建dog
    mkdir -p /home/animal/dog //创建多级目录
    mkdir -m 711 test //在当前目录下创建目录并指定目录权限

    这里对创建多级目录多做一点解释,本身是没有 /animal 目录的,现在要在 /animal 下创建 /dog,因此称为创建多级目录

  5. rmdir指令

    remove directory 删除空目录

    1
    rmdir /home/dog

    此条指令只能删除空目录,如果该目录下有内容是无法删除的

  6. touch指令

    创建新文件

    1
    2
    touch hello.py	//在当前目录下创建文件
    touch /home/hello.py //在指定目录下创建文件
  7. cp指令

    拷贝文件到指定目录

    1
    2
    cp /home/hello.txt /home/bbb	//将home下的hello.txt文件拷贝到home/bbb目录里
    cp -r /home/bbb /opt //将home/bbb文件夹递归地拷贝到/opt下

    递归地拷贝即该文件夹包括里面所有内容都拷贝

    强制覆盖不提示方法:

    1
    \cp -r /home/bbb /opt
    1
    cp -rfd dir_a dir_b
    • r:recursive,递归地,即复制所有文件。
    • f:force,强制覆盖。
    • d:如果源文件为链接文件,也只是把它作为链接文件复制过去,而不是复制实际文件。
  8. rm指令

    remove 移除文件或目录

    1
    2
    3
    4
    rm /home/hello.py	//删除hello.py
    rm -r /home/dog //递归地删除整个文件夹
    rm -f /home/hello.py //强制删除不提示
    rm -rf /home/dog //递归地删除dog文件夹且不提示
  9. mv指令

    移动文件与目录或重命名

    1
    2
    mv oldNameFile newNameFile
    mv /temp/movefile /targetFolder
  10. cat指令

    查看文件内容,是一种比 Vim 更安全的一种查看内容的方式,因为cat是只读模式

    1
    2
    3
    cat /home/hello.py
    cat -n /home/hello.py //显示行号
    cat -n /home/hello.py | more

    第三行的more为管道命令

  11. more指令

    1
    more 要查看的文件

    image-20221223161945515

  12. less指令

    比more更强大,支持各种显示终端。更特别的是,less 在显示文件内容时,并不是一次性将整个文件加载完才显示,而是根据显示需要加载的内容,对于大型文件具有更高的效率

    1
    less 要查看的文件

    image-20221223172227171

  13. echo指令

    echo 输出内容到控制台,可以输出环境变量等

    1
    echo "Hello, world!"
  14. head指令

    显示文件开头的部分内容,默认情况下 head 指令显示文件的前10行内容

    1
    2
    head filename
    head -n 5 filename //查看文件前面5行内容
  15. tail指令

    和 head 类似,输出尾部的内容

    1
    2
    3
    tail filename
    tail -n 5 filename //查看文件尾5行内容
    tail -f filename //实时追踪该文档的所有更新
  16. >>>指令

    1
    2
    3
    4
    5
    ls -l > filename	//列表的内容写入filename中(覆盖写)
    ls -l > filename //列表的内容写入filename中(追加写)
    cat file1 > file2 //将文件1的内容写入文件2
    echo "echo" >> file
    cal >> info.txt //日历信息追加到info.txt中
  17. ln指令

    软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径

    ln -s [原文件目录] [软链接名]

    1
    2
    ln -s /root /home/myroot
    rm /home/myroot //删除软链接
  18. history指令

    查看已经执行过的历史命令,也可以执行历史指令

    1
    2
    3
    history 	//显示所有的历史指令
    history 10 //显示最近10个使用过的指令
    !5 //执行历史编号为5的指令

    执行历史编号指令,并不会在历史指令上添加该指令

7.4 时间日期

  1. date指令

    显示当前日期

    1
    2
    3
    date 		//显示当前时间
    date +%Y //显示当前年份
    date "+%Y-%m-%d %H:%M:%S" //显示年月日时分秒

    date 指令还可以设置日期

    1
    date -s "2020-11-03 20:02:10"
  2. cal指令

    查看日历指令,默认显示本月日历

    1
    2
    cal
    cal 2022 //显示2022年日历

7.5 搜索查找

  1. find指令

    find 指令将从指定目录向下递归地遍历其各个子目录,满足条件的文件或者目录将显示在中断。

    find [搜索范围] [选项]

    • 按文件名

      find /home -name hello.txt

    • 按拥有者

      find /opt -user root:在 /opt 目录下查找 root 用户的文件

    • 按内存

      find / -size +200M:在根目录下查找大于200M的文件(加号表示大于),单位有 k,M,G

  2. locate指令

    该指令可以快速定位文件路径。但是locate指令的执行需要利用事先建立好的文件名称及路径的locate的数据库实现快速定位给定的文件(大概率是建立了一个树)。locate无需遍历整个文件系统,查询速度快。

    locate 搜索文件

    由于locate基于数据库进行查询,第一次运行前必须使用 updatedb 指令创建locate数据库

  3. which指令

    查询某个指令在哪个目录下

    1
    which ls	//查询ls指令在哪个目录下
  4. grep指令和管道符号|

    什么是管道符号

    将前一个指令的结果交给后一个指令处理

    1
    cat /home/hello.txt | grep "yes"

    这一条指令表达的意思是浏览 /home/hello.txt 文件,然后交给 grep 处理,grep 的作用是查找 “yes” 所在行,如果要显示行号,加个 -n,-i表示忽略字母大小写

    现在来单独看看 grep 怎么使用

    grep [选项] 查找内容 源文件

    1
    grep -n "yes" /home/hello.txt

7.6 压缩解压

  1. gzip/gunzip指令

    gzip 用于压缩文件,gunzip 用于解压

    gzip filename:压缩文件,只能将文件压缩为 .gz 格式

    gunzip filename.gz:解压缩文件

    1
    2
    gzip /home/hello.txt
    gunzip /home/hello.txt.gz
  2. zip/unzip指令

    zip [选项] xxx.zip:将要压缩的内容

    unzip [选项] xxx.zip:解压缩文件

    -r:递归压缩,-d:指定解压后文件的存放目录

    1
    2
    zip -r myhome.zip /home/		//将home目录及其包含的文件和子文件夹都进行压缩
    unzip -d /opt/tmp /home/myhome.zip //将myhome.zip解压到/opt/tmp目录下
  3. tar指令

    tar 指令是打包指令,最后打包的文件是 .tar.gz 文件

    tar [选项] xxx.tar.gz 打包的内容

    image-20221224104245476

    将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz

    1
    tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

    将 pc.tar.gz 解压到 /opt/tmp2

    1
    tar -zxvf /home/pc.tar.gz -C /opt/tmp2

8. 组和权限

在 Linux中每个用户必须属于一个组,不能独立于组外。

对于 Linux 每个文件/目录,有三个相对概念

  • 所有者:即有用该文件的用户
  • 所在组:该用户所在的组
  • 其他组:该组之外的组

Linux 文件/目录会根据相对概念的不同而显示出不同的权限

8.1 文件所有者

  1. ls -ahl:查看文件的所有者

    -a:隐藏文件也显示;-h:贴合人类的形式显示文件大小;-l:用列表的形式展示文件

    image-20221225153247761

    可以看到中间两排名字,第一个即是该文件/目录的所有者;第二个是所在组

  2. chown:修改文件所有者

    1
    2
    chown tom apple.txt
    chown -R tom /home/test //该目录即内部所有内容的所有者都修改成tom

    注:修改文件所有者,其所在组并不会变

8.2 组的创建

groupadd [组名]

1
2
groupadd monster
useradd -g monster fox //创建用户fox,放入到monster中

8.3 所在组

当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组

  1. 查看文件/目录所在组

    即前面提到的ls -ahl

  2. 修改文件/目录所在组

    chgrp [组名] [文件名]

    1
    2
    chgrp cherry apple.txt
    chgrp -R cherry /home/test //该目录即内部所有内容的所有组都修改成cherry
  3. 改变用户所在组

    在添加用户时,可以指定将该用户添加到哪个组中,也可以用 root 的管理权限改变某个用户所在的组

    1
    usermod -g newgroup username

8.4 组的权限

上面图片取一个下来

1
-rw-r--r--.  1  tom  root  0  12月 25 13:57  apple.txt

现在看看前面十位-rw-r--r--

第 0 位:确定文件类型

  • -:普通文件(即带后缀名)
  • l:链接,相当于 windows 的快捷方式
  • d:目录,即为文件夹
  • c:字符设备文件,如鼠标、键盘
  • b:块设备,如硬盘

之后 9 位按照三个一组,分成三组,分别对应所有者(User)、所有组(Group)、其他用户(Other)

rwx权限详解

对于文件来说:

  • [r]:代表可读,查看
  • [w]:代表可写,但是不代表删除,删除一个文件的前提是对该文件所在的目录有写权限
  • [x]:代表可执行

对于目录来说:

  • [r]:代表可读,可以 ls 查看内容
  • [w]:代表可写,可以修改,对目录内创建+删除+重命名目录
  • [x]:代表可执行,即可以 cd 进入该目录

8.5 权限修改

直接修改权限

u:所有者;g:所有组;o:其他人;a:所有人,权限通过 + - = 变更

1
2
3
chmod u=rwx,g=rx,o=x 文件/目录名
chmod g+w,o+r 文件/目录名
chmod o-x 文件/目录名

通过数字变更权限

r=4, w=2, x=1, so rwx=7

e.g. 将 /home/abc.txt 文件的权限修改成 rwxr-xr-x

1
chmod 755 /home/abc.txt

2023/6/2

在初学的时候就有一个疑问,某个文件的所有者不在该文件的所有组中,对外的权限又是什么样的呢?网上也没有查到很明确的解答,不如自己试验一下。

image-20230602141539244

9. 定时任务调度

9.1 crond任务调度

9.1.1 概述

任务调度是指系统在某个时间执行的特定的命令或程序。

任务调度分类:

  1. 系统工作:有些重要的工作必须周而复始地进行,如病毒扫描
  2. 个别用户工作:个别用户希望执行某些程序,比如对 MySQL 数据库的备份
9.1.2 语法

crontab [选项]

  • -e:编辑 crontab 定时任务
  • -l:查询 crontab 任务
  • -r:删除当前用户所有的 crontab 任务

先设置 crontab 定时任务

1
crontab -e

执行完上面指令后会进入一个文本编辑界面,此时输入

1
*/1 * * * * date >> /tmp/mydate.txt

这里表示每过一分钟将当前时间写入 mydate.txt 文件中

总共有五个 *,分别表示

  • 一个小时当中的第几分钟
  • 一天当中的第几小时
  • 一个月当中的第几天
  • 一年当中的几月
  • 一周当中的星期几(0和7代表星期日)

而有一些特殊符号

  • * 代表任何时间,比如第一个 * 表示一小时中每分钟都执行一次
  • , 代表不连续时间,0 8,12,16 * * * 代表每天8:00,12:00,16:00
  • - 代表连续时间,0 5 * * 1-6 代表周一到周六的 5:00 执行一次

9.2 at定时任务

at 命令是一次性定时计划任务,执行完一个任务就不再执行此任务了。在使用 at 命令的时候,一定要保证 atd 进程的启动,可以使用相关指令来查看。

ps -ef :查看当前所有进程,如果要过滤,则ps -ef | grep atd

这里举个栗子

image-20221227150246714

第一行at 15:05 表示任务将要执行的时间;然后中断会弹出at >输入要执行的命令;再输入两次Ctrl+D,输入完后终端会显示该任务编号和将要执行的时间。

atq:查询任务队列

atrm [编号] :删除某个编号的任务

再来个栗子

1
2
at now + 2 minutes
at> my.sh

表示两分钟后执行 my.sh 脚本

10. 磁盘分区和挂载

Linux 无论有几个分区,分给哪一个目录使用,归根结底就只有一个根目录。Linux 中每个分区都是用来组成整个文件系统的一部分。Linux 采用了一种“载入”的处理方法。硬盘和磁盘可以看成一个东西。

10.1 硬盘说明

Linux 硬盘主要分为 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘,现在介绍一下 SCSI 硬盘在 Linux 下的分区情况

SCSI 硬盘标识为sdx~,sd 表示分区所在的设备类型,即 SCSI。x 为盘号,a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘,以此类推。~ 代表分区,前四个分区用数字 1~4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区

10.2 查看硬盘挂载情况

lsblk

image-20221227171659530

可以看到,sda 磁盘分成了三个区,后面列出了每个区的大小和挂载到的目录,sdb 为后面新加的磁盘,后面会介绍如何新加磁盘

lsblk -l

image-20221227171857787

每个分区都有一个独一无二的 UUID

10.3 增加新磁盘

增加新磁盘主要分为 5 个步骤,现在一一介绍

  1. 虚拟机增加硬盘

  2. 分区命令

    fdisk /dev/sdb,输入该条指令后,就开始对 sdb 分区

  3. 格式化磁盘

    mkfs -t ext4 /dev/sdb1

    其中 ext4 是分区类型

  4. 挂载目录

    mount [设备名称] [挂载目录],例如mount /dev/sdb1 /newdisk,同理,也会有取消挂载:mount /dev/sdb1 /newdisk

    使用命令行挂载,重启后会失效!

  5. 永久挂载

    修改 /etc/fstab 实现挂载

这里指介绍了大致步骤,部分具体操作没有列出,参考教程即可。

10.4 查询磁盘情况

查询系统整体磁盘使用情况

df -h

image-20221227173043974

查询指定目录的磁盘占用情况

du:默认为当前目录

  • -s:指定目录占用大小汇总
  • -h:带计量单位
  • -a:含文件
  • --max-depth=1:子目录深度
  • -c:列出明细的同时,增加汇总值

10.5 实用工作指令

  1. 统计 /opt 文件夹下文件的个数

    1
    ls -l /opt | grep "^-" | wc -l

    对上面这条语句作个解释:先以列表形式列出 /opt 下的内容,管道传给 grep,grep是过滤器,取出开头为 - 的内容,然后在交给 wc 处理,计算总共有多少条

  2. 统计 /opt 文件夹下目录的个数

    1
    ls -l /opt | grep "^d" | wc -l
  3. 统计 /opt 文件夹下文件的个数,包括子文件夹

    1
    ls -lR /opt | grep "^-" | wc -l

    -R 表示递归地查找

  4. 统计 /opt 文件夹下目录的个数,包括子文件夹

    1
    ls -lR /opt | grep "^d" | wc -l
  5. 以树状显示目录结构

    tree [目录],如果没有 tree,使用yum install tree安装

11. 网络配置(未写)

这一块不是听的很懂,暂时空着

12. 进程管理

在 Linux 中,每一个被执行的程序都被称为一个进程,每一个进程都分配一个 ID 号(pid,进程号)。程序本来是一段代码,加载到内存运行后,就成了进程

进程以两种方式存在,前台和后台,一般来说前台的进程与用户交互,此时前台把信息发给后台,后台则执行实际操作。

12.1 显示进程

ps 命令是用来查看目前系统中有哪些正在执行以及它们执行的情况

现在输入 ps -aux

-a 显示现行终端机下执行的进程(除了阶段作业领导者)-u 以用户为主的格式显示进程情况 ,-x 显示所有进程,不以终端机来区分

image-20221231114238365

  • USER:用户名称
  • PID:进程号
  • %CPU:进程占用 CPU 的百分比
  • %MEM:进程占用物理内存百分比
  • VSZ:进程占用的虚拟内存大小(KB)
  • RSS:进程占用的物理内存大小(KB)
  • TTY:终端名称,缩写
  • STAT:进程状态,S 表示睡眠
  • START:进程的启动时间
  • TIME:进程占用 CPU 的总时间
  • COMMAND:启动进程所用的命令和参数

应用举例:以全格式显示 sshd 相关的进程 -e 表示显示所有,-f 表示全格式

1
ps -ef | grep sshd

12.2 终止进程

若是某个进程执行一半需要停止时,或是消耗了很大的系统资源,需要考虑停止该进程。使用 kill 命令来完成此项任务

kill [选项] [进程号]:通过指定进程号来终止进程

killall [进程名称]:通过进程名称终止进程

有时候我们终止一些比较重要的进程,系统会认为我们误操作,加个 -9 可以强制终止

12.3 进程树

pstree [选项]:更加直观地查看进程信息(主要是体现父子关系)

-p:显示进程的 PID,-u:显示进程所属的用户

image-20221231120212291

12.4 服务管理

服务(Service)的本质就是进程,但是是运行在后台的,通常会监听某个端口,等待其它程序的请求,比如(mysqld, sshd, firewalld 等),因此又称为守护进程。

12.4.1 Service管理指令

基本语法:service [服务名] [start|stop|restart|reload|status]

由于 CentOS7 以后许多服务不再放到 service 下管理,而是 systemctl 下,我们对前者做个简略介绍,再介绍后者。

service 指令管理的服务在 /etc/init.d 目录下查看

12.4.2 开机流程

开机->BIOS->/boot->systemd进程->运行级别->运行级别对应的服务

12.4.3 chkconfig指令

通过该指令可以给服务的各个运行级别设置自启动/关闭

基本语法

  • chkconfig --list:查看服务开启状态

  • chkconfig [服务名] --list

  • chkconfig --level 5 服务名 on/off

    1
    chkconfig --level 3 network off

    表示设置 network 在运行级别3状态下自动关闭,chkconfig 重新设置服务后自启动或关闭,需要重启机器 reboot 生效

12.4.4 systemctl管理指令

systemctl [start|stop|restart|status] 服务名

设置服务的自启动状态

1
2
3
4
systemctl list-unit-files [| grep 服务名]	//查看服务开机启动状态,grep可以进行过滤
systemctl enable 服务名
systemctl disable 服务名
systemctl is-enabled 服务名 //查询某个服务是否是自启动的
12.4.5 防火墙相关指令
  • 打开端口

    1
    firewall-cmd --permanent --add-port=端口号/协议
  • 关闭端口

    1
    firewall-cmd --permanent --remove-port=端口号/协议
  • 重新载入

    1
    firewall-cmd --reload
  • 查询端口是否开放

    1
    firewall-cmd --query-port=端口号/协议

12.5 动态监控进程

topps 指令很相似,都用来显示正在执行的进程,但是 top 不断更新正在运行的进程

top [选项]:-d 秒数,-i 使 top 不显示任何闲置或僵死进程,-p 通过指定监控进程ID来仅仅监控某个进程的状态

12.6 监控网络状态

netstat [选项]:-an 按一定顺序排列输出,-p 显示哪个进程在调用

13. Shell编程

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求一遍运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序

13.1 Hello world

写下第一个脚本

1
2
#!/bin/bash
echo "hello, world!"

第一行为脚本开头规范,第二行 echo 表示输出,类似于 Python 中的 print

写完这个脚本后用户还没有执行权限,有两种执行方法

  • 先赋予用户对它的执行权限,chmod u+x filename.sh,然后使用相对路径或绝对路径执行脚本
  • 强制执行:sh filename.sh(后面也可以使用绝对路径)

13.2 变量

Shell 中变量主要分为系统变量和用户自定义变量,系统变量有 $HOME, $PWD, $SHELL, $USER等等,还可以显示当前 shell 中所有变量:set

变量定义

定义变量:变量名=值;撤销变量:unset 变量名;声明静态变量:readonly 变量名=值,静态变量不能 unset

规则

变量名称不能以数字开头,且等号两侧不能有空格。变量名称一般为大写,这是一个规范。

命令返回的值

1
2
A=`date`
A=$(date)

date 为输出当前时间指令,此时会把该值赋给 A,这两行为等价写法

设置环境变量

举个栗子:

  1. 在 /etc/profile 文件中定义 CHERRY_HOME 环境变量

    1
    export CHERRY_HOME=/home/cherry
  2. 让该环境变量生效

    1
    source /etc/profile

按照上述方式配置完成后,任何地方都可以访问到该环境变量(例如任何shell脚本等)

2023.6.5

事实上,环境变量还是很重要的。我们输入的指令,本质上都是运行了存储在某个地方的可执行文件。比如 ls 就是列出所有文件名。但是我只输入一个 ls,系统怎么找到目标的可执行文件呢?(实际上在 /usr/bin中)

答案就是 PATH 这个环境变量

1
2
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/cherry/.local/bin:/home/cherry/bin

第二行开始是它的内容,当我们输入 ls 时,就会跑到这几个目录底下找 ls 可执行文件。

位置参数变量

当执行一个 shell 脚本时,如果希望获取到命令行的参数信息,则使用位置参数变量

  • $n:n 为数字,$0 代表命令行本身,$1-$9 代表第一个到第九个参数,对于十个以上参数,${10},即用大括号包含
  • $*:把所有参数看成一个整体
  • $@:也代表所有参数,不过把每个参数区分对待
  • $#:表示所有参数的个数
1
2
3
4
5
#!/bin/bash
echo "POS0=$0,POS1=$1,POS2=$2"
echo "All parameter:$*"
echo "$@"
echo "$#"

运行该 shell 脚本输出情况为

image-20230104111615769

预定义变量

就是 shell 设计者预先定义好的变量,可以直接在 shell 脚本中使用

  • $$:当前进程的进程号(PID)
  • $!:后台运行的最后一个进程的进程号
  • $?:最后一次执行的命令的返回状态,如果值为 0,证明上一个命令正确运行

13.3 运算符

1
2
3
4
5
#!/bin/bash
RES1=$(((2+3)*4))
RES2=$[(2+3)*4]
TEMP=`expr 2 + 3`
RES3=`expr $TEMP \* 4`

上面个总共是三种写法,记第二种就可以了。。。

13.4 判断

  1. if 语句
1
2
3
4
if [ "ok" = "ok" ]
then
echo "equal"
fi

[ ] 内放判断条件,注意每个部分都要用空格隔开。

多条判断

1
2
3
4
5
6
7
8
#!/bin/bash
if [ $1 -ge 60 ]
then
echo "pass!"
elif [ $1 -lt 60 ]
then
echo "no pass!"
fi
  1. case 语句
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
case $1 in
"1")
echo "Monday"
;;
"2")
echo "Tuesday"
;;
*)
echo "other..."
;;
esac

13.5 循环

  1. for 循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i in "$@"
    do
    echo "num is $i"
    done

    SUM=0
    for((i=1;i<=$1;i++))
    do
    SUM=$[$SUM+$i]
    done

    可以看到 for 循环有两种形式,第一种是 for in,遍历每一个值,第二种则和 c 语言的 for 很类似

  2. while 循环

    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    SUM=0
    i=0
    while [ $i -le $1 ]
    do
    SUM=$[$SUM+$i]
    i=$[$i+1]
    done

    从 0 加到 $1

13.6 输入

1
2
read -p "input number:" NUM1
read -t 10 -p "input number:" NUM2

第一个表示输出提示信息,然后等待用户输入一个数字

第二个则多了 -t ,表示等待一定时间过后变不再等待

13.7 函数

系统函数

  • basename:输入一个完整路径,只返回文件名
  • dirname:输入一个完整路径,值返回路径

自定义函数

1
2
3
4
5
6
7
8
#!/bin/bash
function Sum(){
SUM=$[$1+$2]
echo "sum:$SUM"
}
read -p "input1:" n1
read -p "input2:" n2
Sum $n1 $n2