Linux学习笔记
0. 环境配置
配置一个 Linux 环境,我们需要先安装一个虚拟机,然后在虚拟机上面安装一个 Linux 系统来学习
- 安装 virtual machine
- 在 vm 中安装 Linux(这里使用的是 CentOS 7)
具体的环境安装教程:
1. 虚拟机相关操作
1.1 虚拟机克隆
如果已经安装好了一个 Linux 系统,没有必要重新安装,只需要进行克隆即可,有两种方法:
- 直接拷贝一份安装好的虚拟机文件
- 使用 vmware 的克隆操作,克隆时需要关闭 Linux 系统
这里放一个链接,以后需要克隆操作了来这里就行
1.2 虚拟机快照
在使用虚拟机系统的时候,如果想要回到原先的某一个状态,就可以使用虚拟机快照。
虚拟机快照暂时用不上,这里先空着
1.3 vmtools
vmtools 是为了让我们在 windows 下更好地管理虚拟机,可以设置 windows 和 Linux 的共享文件夹
至于使用教程,看【小白入门 通俗易懂】2021韩顺平 一周学会Linux
2. Linux目录结构
2.1 基本介绍
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 进行操作;后者则进行一些文件的交换。
至于具体操作,看视频吧
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,显示行号等操作
下面是各种模式相互切换图:
4.2 快捷键使用
由于快捷键很多,这里只列几个常用的,最后附一张快捷键大全键盘表
- 拷贝当前行:
yy
,拷贝当前行向下的5行:5yy
,并粘贴:p
(paste) - 删除当前行:
dd
,删除当前行向下的5行:5dd
- 查找某个单词,在命令行模式下:
/关键字
,回车查找,输入n
表示查找下一个 - 显示行号【命令行模式】:
set nu
,隐藏行号:set nonu
- 光标跳转【一般模式】,到最末行:
G
,到最首行:gg
,将光标移动到目标行:先输入一个数字(要跳转的行数),在 shift+g - 动作撤销【一般模式】:
u
5. 关机 重启 用户登录注销
5.1 关机&重启指令
1 | shutdown -h now //立即进行关机 |
注:上面介绍的关机和重启命令均已经进行了 sync,但为了保险起见,还是先主动执行一次 sync,再关机或重启
5.2 用户登录和注销
root用户是系统管理员,有最大的权限。一般使用普通用户登录,su - 用户名
,root切换到普通用户不需要输入密码,但相反则需要输入密码
若要注销用户,使用 logout
,则会退回到上一个用户,直到所有用户都注销完。注意,该指令在图形运行级别无效,在运行级别 3 下有效,运行级别的概念之后会介绍
6. 用户管理
Linux 系统是一个多用户多任务的操作系统,任何一个想要使用系统资源的用户,都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统
6.1 添加用户
1 | useradd cherry //创建了一个名为cherry的用户 |
说明:
- 第一种方法创建的用户默认放在了 /home/cherry 文件夹下
- 如果要指定用户的目录位置,则用第二种方法
6.2 修改密码
1 | passwd cherry |
给 cherry 指定密码,执行完上述指令后,输入密码即可
补充:显示当前用户所在的目录:pwd
6.3 删除用户
1 | userdel cherry |
- 第一种方法删除 cherry 用户,但保留了用户主目录,即 /home/cherry,这是为了保留里面的文件
- 第二种方法同时删除了用户主目录
一般建议保留用户主目录
6.4 查询用户信息
1 | id cherry |
当用户不存在时,返回无此用户
6.5 切换用户
1 | su - cherry |
正如前面提到,root 切换到 cherry 不需要密码,但反过来则需要输入密码
当返回到上一个用户时,使用exit
或logout
6.6 查看用户
1 | whoami |
注意,第一个指令显示当前用户的名字,而第二个指令显示最开始用户的名字和登录时间等信息。
6.7 用户组
设置用户组,可以同时对多个用户进行统一管理
6.7.1 新增/删除
1 | groupadd 组名 |
6.7.2 指定用户的组
1 | useradd -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 | systemctl get-default //获取当前运行级别 |
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 下的根目录为 /
,从这里出发寻找文件,则是绝对路径。
而如果想使用相对路径,一个点 .
表示当前路径,两个点 ..
表示当前路径的上一个路径,../..
表示上上一个路径,依此类推。
pwd
指令print working directory 显示当前工作目录的绝对路径
ls
指令list
1
2
3
4ls //显示当前目录包含的文件和目录
ls -a //隐藏的也显示出来
ls -l //以列表方式显示
ls -al //a和l也可以组合使用cd
指令change directory 切换到指定目录
1
2
3
4
5cd ~ //回到自己的家目录
cd /root //【绝对路径】切换到/root
cd .. //切换到上一级目录
//如果此时在家目录home
cd /cherry //【相对路径】切换到/home/cherrymkdir
指令make directory 创建新的目录
1
2
3mkdir /home/dog //在home目录下创建dog
mkdir -p /home/animal/dog //创建多级目录
mkdir -m 711 test //在当前目录下创建目录并指定目录权限这里对创建多级目录多做一点解释,本身是没有 /animal 目录的,现在要在 /animal 下创建 /dog,因此称为创建多级目录
rmdir
指令remove directory 删除空目录
1
rmdir /home/dog
此条指令只能删除空目录,如果该目录下有内容是无法删除的
touch
指令创建新文件
1
2touch hello.py //在当前目录下创建文件
touch /home/hello.py //在指定目录下创建文件cp
指令拷贝文件到指定目录
1
2cp /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:如果源文件为链接文件,也只是把它作为链接文件复制过去,而不是复制实际文件。
rm
指令remove 移除文件或目录
1
2
3
4rm /home/hello.py //删除hello.py
rm -r /home/dog //递归地删除整个文件夹
rm -f /home/hello.py //强制删除不提示
rm -rf /home/dog //递归地删除dog文件夹且不提示mv
指令移动文件与目录或重命名
1
2mv oldNameFile newNameFile
mv /temp/movefile /targetFoldercat
指令查看文件内容,是一种比 Vim 更安全的一种查看内容的方式,因为cat是只读模式
1
2
3cat /home/hello.py
cat -n /home/hello.py //显示行号
cat -n /home/hello.py | more第三行的more为管道命令
more
指令1
more 要查看的文件
less
指令比more更强大,支持各种显示终端。更特别的是,less 在显示文件内容时,并不是一次性将整个文件加载完才显示,而是根据显示需要加载的内容,对于大型文件具有更高的效率
1
less 要查看的文件
echo
指令echo 输出内容到控制台,可以输出环境变量等
1
echo "Hello, world!"
head
指令显示文件开头的部分内容,默认情况下 head 指令显示文件的前10行内容
1
2head filename
head -n 5 filename //查看文件前面5行内容tail
指令和 head 类似,输出尾部的内容
1
2
3tail filename
tail -n 5 filename //查看文件尾5行内容
tail -f filename //实时追踪该文档的所有更新>
和>>
指令1
2
3
4
5ls -l > filename //列表的内容写入filename中(覆盖写)
ls -l > filename //列表的内容写入filename中(追加写)
cat file1 > file2 //将文件1的内容写入文件2
echo "echo" >> file
cal >> info.txt //日历信息追加到info.txt中ln
指令软链接也称为符号链接,类似于 windows 里的快捷方式,主要存放了链接其他文件的路径
ln -s [原文件目录] [软链接名]
1
2ln -s /root /home/myroot
rm /home/myroot //删除软链接history
指令查看已经执行过的历史命令,也可以执行历史指令
1
2
3history //显示所有的历史指令
history 10 //显示最近10个使用过的指令
!5 //执行历史编号为5的指令执行历史编号指令,并不会在历史指令上添加该指令
7.4 时间日期
date
指令显示当前日期
1
2
3date //显示当前时间
date +%Y //显示当前年份
date "+%Y-%m-%d %H:%M:%S" //显示年月日时分秒date 指令还可以设置日期
1
date -s "2020-11-03 20:02:10"
cal
指令查看日历指令,默认显示本月日历
1
2cal
cal 2022 //显示2022年日历
7.5 搜索查找
find
指令find 指令将从指定目录向下递归地遍历其各个子目录,满足条件的文件或者目录将显示在中断。
find [搜索范围] [选项]
按文件名
find /home -name hello.txt
按拥有者
find /opt -user root
:在 /opt 目录下查找 root 用户的文件按内存
find / -size +200M
:在根目录下查找大于200M的文件(加号表示大于),单位有 k,M,G
locate
指令该指令可以快速定位文件路径。但是locate指令的执行需要利用事先建立好的文件名称及路径的locate的数据库实现快速定位给定的文件(大概率是建立了一个树)。locate无需遍历整个文件系统,查询速度快。
locate 搜索文件
由于locate基于数据库进行查询,第一次运行前必须使用 updatedb 指令创建locate数据库
which
指令查询某个指令在哪个目录下
1
which ls //查询ls指令在哪个目录下
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 压缩解压
gzip
/gunzip
指令gzip 用于压缩文件,gunzip 用于解压
gzip filename
:压缩文件,只能将文件压缩为 .gz 格式gunzip filename.gz
:解压缩文件1
2gzip /home/hello.txt
gunzip /home/hello.txt.gzzip
/unzip
指令zip [选项] xxx.zip
:将要压缩的内容unzip [选项] xxx.zip
:解压缩文件-r:递归压缩,-d:指定解压后文件的存放目录
1
2zip -r myhome.zip /home/ //将home目录及其包含的文件和子文件夹都进行压缩
unzip -d /opt/tmp /home/myhome.zip //将myhome.zip解压到/opt/tmp目录下tar
指令tar 指令是打包指令,最后打包的文件是 .tar.gz 文件
tar [选项] xxx.tar.gz 打包的内容
将 /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 文件所有者
ls -ahl
:查看文件的所有者-a:隐藏文件也显示;-h:贴合人类的形式显示文件大小;-l:用列表的形式展示文件
可以看到中间两排名字,第一个即是该文件/目录的所有者;第二个是所在组
chown
:修改文件所有者1
2chown tom apple.txt
chown -R tom /home/test //该目录即内部所有内容的所有者都修改成tom注:修改文件所有者,其所在组并不会变
8.2 组的创建
groupadd [组名]
1 | groupadd monster |
8.3 所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组
查看文件/目录所在组
即前面提到的
ls -ahl
修改文件/目录所在组
chgrp [组名] [文件名]
1
2chgrp cherry apple.txt
chgrp -R cherry /home/test //该目录即内部所有内容的所有组都修改成cherry改变用户所在组
在添加用户时,可以指定将该用户添加到哪个组中,也可以用 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 | chmod u=rwx,g=rx,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
在初学的时候就有一个疑问,某个文件的所有者不在该文件的所有组中,对外的权限又是什么样的呢?网上也没有查到很明确的解答,不如自己试验一下。
9. 定时任务调度
9.1 crond任务调度
9.1.1 概述
任务调度是指系统在某个时间执行的特定的命令或程序。
任务调度分类:
- 系统工作:有些重要的工作必须周而复始地进行,如病毒扫描
- 个别用户工作:个别用户希望执行某些程序,比如对 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
这里举个栗子
第一行at 15:05
表示任务将要执行的时间;然后中断会弹出at >
输入要执行的命令;再输入两次Ctrl+D
,输入完后终端会显示该任务编号和将要执行的时间。
atq
:查询任务队列
atrm [编号]
:删除某个编号的任务
再来个栗子
1 | at now + 2 minutes |
表示两分钟后执行 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
可以看到,sda 磁盘分成了三个区,后面列出了每个区的大小和挂载到的目录,sdb 为后面新加的磁盘,后面会介绍如何新加磁盘
lsblk -l
每个分区都有一个独一无二的 UUID
10.3 增加新磁盘
增加新磁盘主要分为 5 个步骤,现在一一介绍
虚拟机增加硬盘
分区命令
fdisk /dev/sdb
,输入该条指令后,就开始对 sdb 分区格式化磁盘
mkfs -t ext4 /dev/sdb1
其中 ext4 是分区类型
挂载目录
mount [设备名称] [挂载目录]
,例如mount /dev/sdb1 /newdisk
,同理,也会有取消挂载:mount /dev/sdb1 /newdisk
使用命令行挂载,重启后会失效!
永久挂载
修改 /etc/fstab 实现挂载
这里指介绍了大致步骤,部分具体操作没有列出,参考教程即可。
10.4 查询磁盘情况
查询系统整体磁盘使用情况
df -h
查询指定目录的磁盘占用情况
du
:默认为当前目录
-s
:指定目录占用大小汇总-h
:带计量单位-a
:含文件--max-depth=1
:子目录深度-c
:列出明细的同时,增加汇总值
10.5 实用工作指令
统计 /opt 文件夹下文件的个数
1
ls -l /opt | grep "^-" | wc -l
对上面这条语句作个解释:先以列表形式列出 /opt 下的内容,管道传给 grep,grep是过滤器,取出开头为 - 的内容,然后在交给 wc 处理,计算总共有多少条
统计 /opt 文件夹下目录的个数
1
ls -l /opt | grep "^d" | wc -l
统计 /opt 文件夹下文件的个数,包括子文件夹
1
ls -lR /opt | grep "^-" | wc -l
-R 表示递归地查找
统计 /opt 文件夹下目录的个数,包括子文件夹
1
ls -lR /opt | grep "^d" | wc -l
以树状显示目录结构
tree [目录]
,如果没有 tree,使用yum install tree
安装
11. 网络配置(未写)
这一块不是听的很懂,暂时空着
12. 进程管理
在 Linux 中,每一个被执行的程序都被称为一个进程,每一个进程都分配一个 ID 号(pid,进程号)。程序本来是一段代码,加载到内存运行后,就成了进程
进程以两种方式存在,前台和后台,一般来说前台的进程与用户交互,此时前台把信息发给后台,后台则执行实际操作。
12.1 显示进程
ps
命令是用来查看目前系统中有哪些正在执行以及它们执行的情况
现在输入 ps -aux
-a 显示现行终端机下执行的进程(除了阶段作业领导者)-u 以用户为主的格式显示进程情况 ,-x 显示所有进程,不以终端机来区分
- 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:显示进程所属的用户
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 | systemctl list-unit-files [| grep 服务名] //查看服务开机启动状态,grep可以进行过滤 |
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 动态监控进程
top
和 ps
指令很相似,都用来显示正在执行的进程,但是 top 不断更新正在运行的进程
top [选项]
:-d 秒数,-i 使 top 不显示任何闲置或僵死进程,-p 通过指定监控进程ID来仅仅监控某个进程的状态
12.6 监控网络状态
netstat [选项]
:-an 按一定顺序排列输出,-p 显示哪个进程在调用
13. Shell编程
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求一遍运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序
13.1 Hello world
写下第一个脚本
1 | !/bin/bash |
第一行为脚本开头规范,第二行 echo 表示输出,类似于 Python 中的 print
写完这个脚本后用户还没有执行权限,有两种执行方法
- 先赋予用户对它的执行权限,
chmod u+x filename.sh
,然后使用相对路径或绝对路径执行脚本 - 强制执行:
sh filename.sh
(后面也可以使用绝对路径)
13.2 变量
Shell 中变量主要分为系统变量和用户自定义变量,系统变量有 $HOME, $PWD, $SHELL, $USER
等等,还可以显示当前 shell 中所有变量:set
变量定义
定义变量:变量名=值;撤销变量:unset 变量名;声明静态变量:readonly 变量名=值,静态变量不能 unset
规则
变量名称不能以数字开头,且等号两侧不能有空格。变量名称一般为大写,这是一个规范。
命令返回的值
1 | A=`date` |
date 为输出当前时间指令,此时会把该值赋给 A,这两行为等价写法
设置环境变量
举个栗子:
在 /etc/profile 文件中定义 CHERRY_HOME 环境变量
1
export CHERRY_HOME=/home/cherry
让该环境变量生效
1
source /etc/profile
按照上述方式配置完成后,任何地方都可以访问到该环境变量(例如任何shell脚本等)
2023.6.5
事实上,环境变量还是很重要的。我们输入的指令,本质上都是运行了存储在某个地方的可执行文件。比如 ls 就是列出所有文件名。但是我只输入一个 ls,系统怎么找到目标的可执行文件呢?(实际上在 /usr/bin中)
答案就是 PATH 这个环境变量
1 | echo $PATH |
第二行开始是它的内容,当我们输入 ls 时,就会跑到这几个目录底下找 ls 可执行文件。
位置参数变量
当执行一个 shell 脚本时,如果希望获取到命令行的参数信息,则使用位置参数变量
$n
:n 为数字,$0 代表命令行本身,$1-$9 代表第一个到第九个参数,对于十个以上参数,${10},即用大括号包含$*
:把所有参数看成一个整体$@
:也代表所有参数,不过把每个参数区分对待$#
:表示所有参数的个数
1 | !/bin/bash |
运行该 shell 脚本输出情况为
预定义变量
就是 shell 设计者预先定义好的变量,可以直接在 shell 脚本中使用
$$
:当前进程的进程号(PID)$!
:后台运行的最后一个进程的进程号$?
:最后一次执行的命令的返回状态,如果值为 0,证明上一个命令正确运行
13.3 运算符
1 | !/bin/bash |
上面个总共是三种写法,记第二种就可以了。。。
13.4 判断
- if 语句
1 | if [ "ok" = "ok" ] |
[ ] 内放判断条件,注意每个部分都要用空格隔开。
多条判断
1 | !/bin/bash |
- case 语句
1 | !/bin/bash |
13.5 循环
for 循环
1
2
3
4
5
6
7
8
9
10for 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 很类似
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 | read -p "input number:" NUM1 |
第一个表示输出提示信息,然后等待用户输入一个数字
第二个则多了 -t ,表示等待一定时间过后变不再等待
13.7 函数
系统函数
basename
:输入一个完整路径,只返回文件名dirname
:输入一个完整路径,值返回路径
自定义函数
1 | !/bin/bash |