Linux笔记
第一章 首次登录和在线求助
1、在命令行模式下执行命令
(1)开始执行命令
命令格式:
command [-options] parameter1 parameter2 ...
如:ls -al install.log ——列出文件install.log的信息
命令
选项
参数1
参数2
第一个被输入的数据绝对是命令或者是可执行文件。
(2)基础命令的操作
执行命令主要分两种情况:一种该命令直接返回结果然后回到命令提示符等待下一个命令的输入;一种是进入该命令的环境,直到结束该命令才回到命令提示符的环境。
——显示日期与时间的命令:date
(命令后的参数还可以带“+”号)
——显示日历的命令:cal
简单好用的计算器:bc
进入bc这个软件的工作环境,使用quit退出环境
(3)重要的热键【Tab】,【Ctrl】+c,【Ctrl】+d
- 【Tab】(连按两次):具有“命令补全”和“文件补全”的功能,它可以避免我们打错命令或文件名。
- 【Ctrl】+c:中断目前的程序
- 【Ctrl】+d:可直接离开命令行模式
2、在线求助man page和info page
在Linux中有大量的命令,但我们不需要背命令,可使用man page和info page了解命令的用法
(1)man page
如下是了解命令date的用法,
退出可按下“q”键,查找关键词时,可按下“/”之后,光标会移到最后一行并等待输入
如上标注,命令后的代号都是有意义的
1 |
用户在shell环境中可以操作的命令或可执行文件 |
2 |
系统内核可调用的函数与工具 |
3 |
一些常用的函数与函数库 |
4 |
设备文件的说明,通常在/dev下的文件 |
5 |
配置文件或者是某些文件的格式 |
6 |
游戏 |
7 |
惯例与协议等 |
8 |
系统管理员可用的管理命令 |
9 |
跟kernel有关的文件 |
(2)info page
info与man的用途其实差不多,info page则是将文件数据拆分成一个个的段落,每个段落用自己的页面来撰写,并且在各个页面中还有类似于“超链接”来跳到各不同的页面中,每个独立的页面称为一个节点。
3、正确的关机方法
在关机前应该使用命令
sync将数据同步写入磁盘,然后使用命令
shutdown、reboot、halt、poweroff等重启、关机命令
关机命令:shutdown
第二章 Linux的文件权限与目录配置
1、Linux文件权限概念
(1)Linux文件属性
(2)如何改变文件属性与权限
改变所属用户组:chgrp
改变文件所有者:chown(在用户和用户组之间加上“.”,可一起修改)
改变权限:chmod
- 数字类型改变文件权限 各权限分数对照表:r(4)、w(2)、x(1),如文件权限为 [-rwxrwx---],该文件的权限数字就是770
- 符号类型改变文件权限 通过u,g,o来代表user,group,others3种身份的权限,a代表全部身份
(3)目录与文件的权限意义
权限对文件的重要性
- r:可读文件的内容
- w:可编辑、新增或者修改文件内容
- x:该文件具有可被系统执行的权限,文件是否可执行是由是否具有“x”这个权限决定的,与文件名没有关系。
权限对目录的重要性
- r:表示具有读取目录列表的权限,所以可用ls命令读取列表
- w:表示具有更改目录列表结构的权限,如新建文件目录、删除文件目录、重命名、转移文件目录位置(若用户具有该目录的w权限,即使不具有该目录下文件的任何权限,也可以把这些文件删除)
- x:表示用户能否进入该目录成为工作目录的用途;工作目录就是你目前所在的目录,不具备该权限的用户不能进入该目录
(4)Linux文件种类与扩展名
Linux文件种类
- 普通文件(-)——纯文本文件、二进制文件、数据格式文件
- 目录(d)
- 连接文件(l)——类似windows下的快捷方式
- 设备与设备文件——块设备文件(b)、字符设备文件(c)
- 套接字(s)
- 管道(p)
Linux文件扩展名:一个Linux文件是否可执行,与它的权限有关,而与文件名一点关系也没有。
Linux文件长度限制:单一文件或目录的最大容许文件名为255个字符;包含完整路径名称及目录(/)的完整文件名为4096个字符。
第三章 Linux文件与目录管理
1、目录与路径
(1)绝对路径与相对路径
绝对路径:由根目录(/)开始写起的文件名或目录名称
相对路径:相对于目前路径的文件名写法
举例来说,你目前在/home这个目录下,如果想要进入/var/log这个目录时,可以这么写
1、cd /var/log(绝对)
2、cd ../var/log(相对)
.:代表当前目录,也可以使用./来表示
..:代表上一层目录,也可以../来表示
(2)目录的相关操作
特殊的目录有以下这些:
- .:代表此层目录
- ..:代表上一层目录
- -:代表前一个工作目录
- /:代表根目录 根目录的上一层(..)与根目录自己(.)是同一个目录
- ~:代表用户身份所在的主文件夹
- ~account:代表account这个用户的主文件夹
处理目录的命令:
- cd(切换目录)
cd [相对路径或绝对路径] cd ~hjy:去到hjy这个用户的主文件夹 cd ~:回到自己的主文件夹 cd :没加上任何路径,默认回到自己的主文件夹 cd ..:表示去到上层目录 cd -:回到前一个目录 |
- pwd(显示目前所在目录)
pwd:显示当前所在目录 pwd -P:正确显示实际路径,而不是连接文件的路径。如/var/mail是连接文件
|
- mkdir(新建目录) 参数:-m(设置目录权限)、-p(可创建多层目录)
mkdir test:创建一个名为test的目录 mkdir -p test/test1:创建多层目录 mkdir -m 711 test:创建自定义权限的test目录 |
- rmdir(删除“空”的目录) 参数:-p(连同上层“空”的目录一起删除)
2、文件与目录管理
(1)查看文件与目录:
ls
- ls [-al等参数] 目录名称
- ls [--color={never,auto,always}] 目录名称
- ls [--full-time] 目录名称
(2)复制、删除与移动:
cp、
rm、
mv
- cp(复制文件或目录):默认下,cp的源文件于目的文件的权限是不同的,目的文件的所有者会是命令操作者本身,因此文件备份时,需要加上-p参数
复制(cp)这个命令是非常重要的,不同身份者执行这个命令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大。
范例一:将主文件夹下的.bashrc复制到/test下,并更名为bashrc
范例二:在root身份下切换目录到/tmp,并将/var/log/wtmp复制到/tmp且查看属性
可看到在不加参数时,文件的属性/权限会改变,如果想要全部属性一模一样,显示如下(
如果在一般用户下执行,权限也是不一样的)
rmdir仅能删除空目录,要删除非空目录需使用“rm -r”命令
范例一:复制一个文件,创建一个目录,将文件移到目录中,并把目录重命名
3、文件内容查阅
(1)直接查看文件内容——cat、tac、nl
范例:显示文件的第11—20行,先取前20行,再取后10行
(4)查看非文本文件——od
(5)修改文件时间或创建新文件——touch
每个文件在Linux下都会记录许多的时间参数,主要由以下3个:
- modification time(mtime):当文件内容数据更改时就会更新该时间
- status time(ctime):当文件状态改变是就会更新该时间,如更改权限属性
- access time(atime):当文件数据被访问时就会更新该时间,如cat命令读取文件
范例一:新建一个空文件并查看时间
范例二:touch修改创建时间\
"ll"是命令ls -l的命令别名
4、文件与目录的默认权限与隐藏权限
(1)文件默认权限——umask
umask指定目前用户在新建文件或目录时的权限默认值,以下两种方式查看默认权限
0022与权限有关是后3位,表示group与others的权限不包括“w”。
若创建文件时默认的权限是-rw-rw-rw-,若创建目录时默认的权限是drwxrwxrwx。但由于被拿掉了部分权限,则用户
- 创建文件时,默认权限为-rw-r--r--
- 创建目录时,默认权限为drwxr-xr-x
假定用户组要共同完成一个文件,则需要用户组中每个用户都有rwx权限,由于文件的默认权限是-rw-r--r--,则同组其他成员无法修改文件,如下
使用umask命令可修改默认权限
(2)文件隐藏属性——
chattr、
lsattr
+a:文件只能添加数据,而不能删除也不能修改数据,只有root才能设置这个属性
+i:使文件无法删除、改名、设置连接,也无法写入或添加数据,只有root才能设置这个属性
(3)文件特殊权限——SUID、SGID、SBIT
除了r、w、x权限外,还有其他权限如s、t,如下
当s出现在文件所有者的x权限上时,则该文件具有SUID权限,SUID有以下限制与功能:
- SUID权限仅对可执行二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 执行者将具有该程序所有者的权限
当s出现在文件用户组的x权限上时,则该文件具有SGID权限,与SUID不同的是,SGID可针对文件或目录设置。
对于文件,SGID有以下限制与功能:
- SGID对可执行二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 执行者在执行的过程中将会获得该程序用户组的支持
如:一般用户对于locate命令具有可执行权限,当执行时,用户组身份会升级为slocate身份,所以可以查询mlocate.db数据库。
对于目录,SGID有以下限制与功能:
- 用户若对此目录具有r与x的权限时,该用户能够进入此目录
- 用户在此目录下的有效用户组将会变成该目录的用户组
- 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同
SBIT仅对目录有效,其作用:
- 当用户对于此目录具有w,x权限时
- 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件
若一般用户具有该目录的w权限,即使不具有该目录下文件的任何权限,也可以把这些文件删除;一旦该目录设置SBIT权限,除了root可以删除所有文件外,一般用户即使有该目录的w权限,也只能删除自己建立的文件。
例如要将一个文件权限改为“-rwsr-xr-x”,因此在原先的755之前还要加上4,即利用“chmod 4755 filename”来设置
5、命令与文件的查询
(1)命令的查询
PATH环境变量定义的是系统搜索命令的路径。
范例一:
- whereis——搜索命令所在路径及帮助文档所在位置
参数-b(只查找可执行命令),-m(只查找帮助文件)
范例一:
(2)文件名的查找
在后台数据库(/var/lib/mlocate)中按文件名搜索,搜索速度更快,不需遍历整个操作系统。该数据库更新比较慢(需1天),所以新建的文件不能立刻用locate搜索到,可用updatedb命令更新数据库即可,如下图
在系统中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配。
find [搜索范围] [搜索条件]:在搜索范围内查找,搜索范围要尽可能小,不然会费时间。
-
- 不区分大小写:find /root -iname install.log
- 查找没有所有者文件,可清除:find /root -nouser
- 查找一定时间内改动过的文件,如
- +4代表大于等于5天前的文件名:find /var -mtime +4
- -4代表小于等于4天内的文件名:find /var -mtime -4
- 4代表4~5那一天的文件名:find /var -mtime 4
- 等等.....用法较灵活
(3)字符串的查找
在文件中搜索符合条件的字符串,如果需要匹配使用正则表达式匹配,正则表达式是包含匹配
6、权限与目录间的关系(极重要)
- 让用户能进入某目录成为“可工作目录”的基本权限是什么
- 可用命令:cd
- 目录所需权限:用户对该目录至少具有x权限
- 额外需求:若ls查阅目录,则用户还需要r权限
-
- 可用命令:cat、more、less
- 目录所需权限:用户对该目录至少具有x权限
- 文件所需权限:用户对文件至少需要具有r的权限
- 让用户可以修改一个文件的基本权限是什么
- 可用命令:nano、vi
- 目录所需权限:用户对该文件所在的目录至少具有x权限
- 文件所需权限:用户对文件至少需要具有r,w的权限
- 让一个用户创建一个文件的基本权限是什么
- 目录所需权限:用户对该目录需要具有w,x的权限,重点在w
- 让用户进入某目录并执行该目录下的某个命令的基本权限是什么
- 目录所需权限:用户对该目录需要具有x的权限
- 文件所需权限:用户对该文件需要具有x的权限
第四章 Linux磁盘与文件系统管理
1、认识EXT2文件系统
(1)硬盘组成与分区复习
- 磁盘的组成:
- 盘片(记录数据)
- 机械手臂与磁头(读取盘片上的数据)
- 主轴马达(转动盘片,让磁头读取数据)
- 盘片上的物理组成:
- 扇区为最小的物理存储单位,每个扇区为512bites
- 柱面为由扇区组成的圆,是分区的最小单位
- 第一个扇区最重要,该扇区记录两个重要的信息
- 主引导分区(MBR):可以安装引导加载程序的地方,有446bytes
- 分区表:记录整个硬盘分区的状态,有64bytes
- 磁盘文件名
- /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名
- /dev/hd[a-d][1-63]:为IDE接口的磁盘文件名
- 磁盘分两种接口:IDE接口和SATA接口
- 磁盘分区
- 由于分区表最多只有64bytes,主分区与扩展分区最多可以有4个(硬盘的限制)
- 扩展分区最多只能有一个(操作系统的限制),其中扩展分区还可以再分出逻辑分区
- 主分区和逻辑分区能够格式化后作为数据访问的分区,而扩展分区无法格式化
- 逻辑分区的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逻辑分区(5号到63号),SATA硬盘则有11个逻辑分区(5号到15号)
(2)Linux的Ext2文件系统(inode)
Ext2文件系统在格式化时区分为多个块组(block group)的,每个块组都有独立的inode/block/superblock系统。
文件系统最前面有一个启动扇区(boot sector),可以安装引导装载程序,这样就可以将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整个磁盘唯一的MBR。
- data block(数据块)——用于放置文件内容
在Ext2文件系统中所支持的block大小有1KB、2KB及4KB三种,在格式化时block大小就固定了,且每个block都有编号,以方便inode的记录。
-
- block大小与数量在格式化时就固定了
- 每个block内最多只能放置一个文件的数据,若文件大于block大小,会占用多个block;若小于block大小,则会造成磁盘空间浪费
例:假若你的Ext2文件系统使用 4K block ,而该文件系统中有 10000 个小文件,每个文件大小均为 50bytes, 请问此时你的磁盘浪费多少容量?
由亍于Ext2 文件系统中一个 block 仅能容纳一个文件,因此每个 block 会浪费4096 - 50 = 4046 (byte), 系统中总共有10000个小文件,所有文件容量为:50 x 10000 (bytes) = 488.3Kbytes,但此时浪费的容量为:4046 x 10000 (bytes) = 38.6MBytes 。想一想,不到 1MB的总文件容量却浪费将近 40MB 的容量,且文件越多将造成越多的磁盘容量浪费。 |
- inodetable inode用来记录文件属性,一个文件占用一个inode,同时记录文件数据所在的block号码
- inode记录的文件属性包括:该文件的访问模式、所有者和组、大小、创建时间和改变时间等。
- 每个inode大小均固定为128bytes
- 一个文件占用一个inode,所以文件系统能够创建的文件数量与inode数量有关
- 系统读取文件时需先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能读取block的内容
- superblock——用于记录整个文件系统相关信息的地方
一般一个文件系统只有一个superblock,即除第一个block group外,后续的不一定有,就算有,也是作为救援的备份。superblock记录的主要信息有:
-
- inode和block的总量
- 未使用和已使用的inode/block数量
- block与inode大小(block为1k,2k,4k,inode为128bytes)
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息
- 一个validbit数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1
- 文件系统描述——用于描述各个block group的开始与结束的block号码
- 块对应表
- 添加文件时会用到block,根据块对应表可快速找到空位置来处理文件
- 删除文件时,原本占用的block就会释放出来
- inode对应表——功能与块对应表差不多,不同的是,块对应表记录的是使用与未使用的block号码,而inode对应表记录的是使用与未使用的inode号码
df命令调出目前挂载的设备,dumpe2fs命令是用来看Ext*文件系统的,而xfs_growfs命令是用来看xfs文件系统的
(3)Ext2/Ext3文件的访问与日志文件系统的功能
假若想要新增一个文件,此时文件系统的行为是:
- 先确定用户对于欲添加文件的目录是否具有w,x权限,若有则添加
- 根据inode对应表找到没有使用的inode的号码,并将新文件的权限/属性写入
- 根据块对应表找到没有使用的block号码,并将实际的数据写入block中,且更新inode的block指向数据
- 将写入的inode与block数据同步更新inode对应表与block对应表,并更新superblock的内容
一般,inode table和data block称为数据存放区域,而superblock、block bitmap、与inode bitmap等区段称为metadata(中间数据)。
若添加文件时由于不明原因(断电)导致系统中断,写入的数据仅有inodetable及datablock而已,而同步更新中间数据没有完成,就会产生数据不一致状态。
Ext2重启时,要对比metadata区域与实际数据存放区,很费时。而Ext3文件系统为了解决该问题增加了日记文件系统,只要检查日志文件系统就知道哪个文件发生错误。如下:
- 预备:当写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息
- 实际写入:开始写入文件的权限与数据,开始更新metadata数据
- 结束:完成后,在日志记录块当中完成该文件的记录
(4)Linux文件系统的操作
在编辑一个较大的文件, 在编辑的过程中又频繁写入到磁盘中,由于磁盘写入速度要比内存慢很多, 效率就慢很多! 为了解决该问题,因此Linux使用异步处理的方式。
异步处理过程:
当系统加载一个文件到内存后,如果该文件没有被更改过,则内存中的数据会被设置为clean。 但如果文件更改过,此时内存中的数据会被设置为Dirty。此时所有操作都
还在内存中执行,并没有写入到磁盘中! 系统会不定时地将内存中设置为Dirty癿数据写回磁盘,以保持磁盘与内存数据的一致性。 也可以使用sync命令来手动强迫写入磁盘。
(5)挂载点的意义
将文件系统与目录树结合的操作称为挂载,挂载点一定是目录,该目录为进入该文件系统的入口。
2、文件系统的简单操作
(1)磁盘与目录的容量:df,du
Linux下连接文件有两种,一种是硬连接(hard link),一种是软连接(也称符号连接,即快捷方式)
不加参数-s就是硬连接,加参数-s就是软连接。
文件名只与目录有关,但文件内容则与inode有关,
硬连接使得多个文件名对应同一个inode,它只是新建一个文件名连接到该inode号码的关联记录而已。
这样做的好处是安全,如果误删了其中一个文件名,inode和block还是存在的,还有另一个文件名连接数据,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。但硬连接是有限制的:
-
- 与Windows的快捷方式是一样的
- 会占用一个inode结点和block块,但block中保存的只是原文件的文件名和inode结点号
- 软连接的文件权限都为lrwxrwxrwx
- 当源文件删除时,软连接的文件会打开不了
由下图蓝框可以看出,f2是f1的硬连接,所以它们指向同一个inode号,黄框表示连接数,表示有多少个文件名连接到该inode号码;而f3是f1的软连接,会创建一个新文件,保存目标文件的路径,红框表示文件大小为7bytes,因为f1的路径为7个英文。
当创建一个新目录时,目录的默认连接数是2,而上层目录的连接数则会加1。
3、磁盘的分区、格式化、检测与挂载
(1)磁盘分区——
fdisk
先使用df或fdisk -l命令找到可用磁盘文件名,然后用fdisk来查阅。
只要离开fdisk时按下“q”,那么所有的操作都不会生效!相反,按下“w”就是操作生效的意思。
如下图,/boot和/home都属于/目录,但在硬盘空间上看,/boot、/home和/分别放在不同的分区,各不影响。
(2)磁盘格式化——
mkfs、
mke2fs
Linux格式化不是为了清除数据,而是为了写入文件系统,主要做了以下两件事:
- 把分区分割成等大小的block,每个block默认大小为1K/2K或4k
- 建立inode分区表,用来记录文件属性,同时记录文件数据所在的block号码
(3)磁盘检测——
fsck、
badblocks
(4)磁盘挂载与卸载——
mount,umount
挂载是将目录与分区连接起来,把子目录称为挂载点。
注意点:
- 使用mount为手动挂载的分区,不是永久的,在系统启动后需要再次挂载
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
- 单一的目录不应该重复挂载多个文件系统
- 挂载点理论上应该为空,如果不为空,则挂载后原目录下的内容会暂时消失,当新分区被卸载后原目录下的内容会再次显示
系统默认的过载目录是/mnt,但并非必须在这里,则需要创建目录成为挂载点,下图是分区/dev/sdb1的挂载与卸载
虚拟机下模拟安装了CD光盘,如下,现要对其进行挂载
mknod 设备文件名 [bcp] [Major] [Minor]
b:设置设备名称成为一个外部存储设备文件,例如硬盘
c:设置设备名称成为一个外部输入设备文件,例如鼠标、键盘
p:设置设备名称成为一个FIFO文件
Linux下设备都是用文件来代表的,
利用的是major和minor数据来代表设备,如下面8为主设备代码,而0~2为次设备代码,这些号码都是有意义的。
- e2label:用来设置文件系统卷标(label)的方法
- tune2fs
4、设置开机挂载
系统安装所必须的分区,这些分区会在系统启动时会自动挂载:
- /(根分区)
- swap分区(虚拟内存)
- /boot(启动分区):用于系统启动
(1)开机挂载/etc/fstab
mount手动加载不是很人性化,可直接到/etc/fstab里面修改实现开机挂载,如下,把分区/dev/sdb1挂载到目录/mnt/test,系统重启时会自动挂载。
(2)特殊设备loop挂载
5、内存交换空间(swap,虚拟内存)
swap只会在物理内存不足时会用到,CPU所读取的数据来自于内存,那当内存不足时,为了让后续程序顺利执行,会将内存中暂不使用的数据挪到swap中。由于目前主机内存都比较大,swap存在意义不大,但针对服务器,swap还是要存在的,至少达到备而不用。
第五章 文件与文件系统的压缩与打包
1、压缩命令
压缩命令 |
压缩格式 |
zip |
.zip |
gzip |
.gz |
bzip2 |
.bz2 |
- zip——需要定义压缩名,压缩后原文件还在,压缩文件可以在windows下解压
- 压缩文件:对原文件进行压缩得到压缩文件,删除原文件,解压后可恢复原文件
-
- 压缩目录:对原目录进行压缩得到压缩目录,删除原目录,解压后可恢复原目录
- gzip:不需定义压缩名,压缩后原文件消失,压缩文件可以在windows下解压
压缩文件如下,如需压缩目录,可参考上面加上参数“-r”,
但压缩目录时,只压缩目录下的子文件,不会压缩目录本身
- bzip2:不需定义压缩名,压缩后原文件消失,但可通过参数“-k”保留原文件,该命令不能压缩目录
2、打包命令
由于gzip、bzip2压缩目录较麻烦,甚至不支持,所以需要打包目录后压缩。
若目录aa下有文件test.conf和test1.conf
参数:
z:通过gzip进行压缩/解压缩
j:通过bzip2进行压缩/解压缩
x:解打包或解压缩的功能
p:保留备份数据的原权限属性
c:新建打包文件
v:显示压缩/解压缩过程
f:接被处理的文件名
C:指定解压目录,避免覆盖原目录
第六章 vim程序编辑器
1、VI的使用
(1)VI的三种模式
- 命令模式:可移动光标,删除,复制操作
- 输入模式:按i键进入输入模式,按Esc键退出
- 底行模式:输入“:wq”保存退出
第七章 认识shell与学习bash
1、认识shell
shell是一个命令解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,Linux默认使用的shell就是bash。
- 接受用户输入命令
- shell把命令翻译成二进制数据后传递给内核
- 由内核来调用计算机硬件来处理
2、shell的变量功能
(1)变量的显示与设置——
echo、
unset
格式:echo $xx 或 echo ${xx}
变量设置规则:
- “=”两边不能直接接空格,如name = "hjy"
- 变量名只能是字母、数字和下划线,且开头不能是数字
- 变量值有空格时可使用双引号“ " ”或单引号“ ' ”
- 使用转义符“\”将特殊符号(如$、\)变成一般符号
- 若变量需要在子进程中使用,需要以export来使变量变成环境变量
- 在一串命令中,在反单引号“ ` ”内的命令会被先执行
(2)环境变量的功能
(3)变量键盘读取、数组与声明:read、array、declare
参数:-a——定义数组类型;-i——定义数字类型;-x——定义环境变量;-r——定义readonly类型,不可更改重设;
若+a、+i、+x、+r表示取消声明
同样能实现运算的还有如下方法:
(4)变量内容的删除、替代与替换
- 变量内容的删除、替代
- #:从头开始,将符合的“最短”数据删除
- ##:从头开始,将符合的“最长”数据删除
- %:从尾开始,将符合的“最短”数据删除
- %%:从尾开始,将符合的“最长”数据删除
知识点 1、env或export命令可查看环境变量,而set命令可查看所有变量 2、set -u可判断变量是不存在还是为空 |
3、命令别名与历史命令
(1)命令别名设置——alias、unalias
设置的命令只是临时生效,当系统重启时就会失效,所以
要达到永久生效,可修改文件.bashrc(每个用户都有自己的.bashrc文件,A用户生效的命令别名,B用户不一定适用)
命令生效执行的优先级顺序
用绝对路径会相对路径执行的命令 >
执行别名 >
执行Bash内部命令 >
执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
(2)历史命令
!n:执行第n条命令
!!:执行上一条命令
!xx:执行最近以xx开头的命令
(3)通配符
4、数据流重定向
(1)数据流重定向
将某个命令执行完后应该要出现在屏幕上的数据传输到其他的地方。
范例1:列出/tmp/vitest下的文件,将正确输出追加到/tmp/log,错误输出追加到/tmp/logerror(对于第一条),后来将正确错误的输出都追加到/tmp/log
范例2:将文件/tmp/log内容输入到文件/tmp/catfile;通过键盘输入到文件/tmp/catfile1,当输入“hjy”时停止
- /dev/null垃圾桶黑洞设备:可将错误输出忽略掉,不显示也不储存,一般使用“2> /dev/null”
- 使用数据流重定向的情况有如下:
- 输出的信息较重要,而且我们需要将它存下来
- 后台程序,不希望干扰屏幕正常输出
- 一些已知错误信息,想以“2> /dev/null”将它丢掉
- 正确和错误信息需要分开输出
(2)命令执行的判断依据
若前一个命令执行的结果为正确,则会回传一个$?=0的值,那么我们可以根据该回传码判断后续的命令是否要执行。
- &&:查阅目录/tmp/abc是否存在,若存在则新建/tmp/abc/hehe
- ||:查阅目录/tmp/abc是否存在,若不存在则创建,否则不做任何事
5、管道命令(pipe)
command1 | command2 | command3
注:
管道命令必须能够接受来自前一个命令的数据成为standard input继续处理
(1)选取命令——cut,grep
- cut——将一段信息的某一段切出来,处理的信息是以行为单位。
参数:-d——接分隔字符;-f——取出分隔后的第几段;-c——以字符的单位取出固定字符区间
- grep——分析一行信息,如果有匹配的,就将该行拿出来。
grep在数据中查找一个字符串时,是以行为单位来进行数据的选取的!
(2)排序命令——sort,wc,uniq
- sort——依据不同的数据类型进行排序
- wc——输出信息的整体数据(行,字数,字符数)
(3)双向重定向
- tee——可将数据流存到文件/设备的同时,输出到屏幕以便继续处理
(4)字符转换命令
- tr——删除一段信息中的文字,或者进行文字信息的转换
参数:-d——删除字符串;-s——替换字符串
- col——过滤控制字符
- join——将两个文件当中有相同数据的那一行加在一起
在join之前,文件内容要事先经过sort处理
- paste——将两个文件贴在一起,中间以[tab]键隔开
(5)切割命令
- split——将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件
(6)参数代换
- xargs——读入stdin的数据,并且以空格符或断行符进行分辨,将stdin的数据分隔为arguments
1、正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
- 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用通配符。
2、基础正则表达式
在字符的含义上,正则表达式与通配符也是很不同的。
grep在数据中查找一个字符串时,是以行为单位来进行数据的选取的!
常用参数:
-
- -c:统计找到“查找字符串”的次数
- -i:忽略大小写
- -n:顺便输出行号
- -v:反向选择,显示没有“查找字符串”的行
- -A:后加数字n,除列出该行外,后续n行也列出来
- -B:后加数字n,除列出该行外,前面n行也列出来
范例1:统计/etc下连接文件的数量
范例2:列出文件中以“.”结尾,并含有2个“o”或以上的行 文件链接: http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt
- cut命令——将一段信息的某一段切出来,处理的信息是以行为单位。
参数:-d——接分隔字符;-f——取出分隔后的第几段;-c——以字符的单位取出固定字符区间
- sed命令——用来将数据进行替换、删除、新增、选取
格式:sed [参数] ‘[动作]’ 文件名
参数:
-
- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
- -e:允许对输入数据应用多条sed命令
- -i:会直接修改读取的文件,而不是由屏幕输出,不加时只是临时修改,对原文件没有作用
动作:[n1 [,n2] ] 动作参数
-
- a:新增,在当前行后添加一行或多行
- c:行替换,用c后的字符串替换n1,n2之间的行
- d:删除,删除指定行
- i:插入,在当前行前插入一行或多行
- p:打印,输出指定行
- s:字符串替换,用一个字符串替换另一个字符串,格式:s/old/new/g
范例一:将/tmp/regular文件内容列出,并删除2-19行
范例二:由范例一后,在第二行后新增两行(
使用$可代表最后一行,如‘2,$d’)
范例三:将/tmp/regular文件内容列出,并替换2-20行
范例四:仅列出/tmp/regular文件的第5-7行
范例五:仅列出/tmp/regular文件的第5-7行后,将数字用--代替
范例六:利用sed直接在/tmp/regular文件最后一行添加“# This is a test”
3、文件格式化与相关处理
(1)printf——格式化打印
格式样式
- \b:退格键
- \f:清除屏幕
- \n:输出新的一行
- \r:即Enter键
- \t:水平的[tab]键
- \v:垂直的[tab]键
- \xNN:NN为两位数数字,可转换数字成为字符
|
变量格式
- %ns:输出字符串,n是数字指代输出几个字符
- %ni:输出整数,n是数字指代输出几个数字
- %m.nf:输出浮点数,m,n是数字,指代输出的整数位数和小数位
|
知识点 1、printf与print区别
- print 必须要在awk内使用,而printf不需要
- print 自动换行,printf 没有自动换行
|
(2)awk——好用的数据处理工具
awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或[tab]键。
格式:awk '条件1{动作1} 条件2{动作2}...' filename
awk的处理流程:
-
- 读入第一行$0,并将字段填入$1,$2,$3等变量
- 根据条件,判断是否需要进行后面的动作
- 做完所有的动作与条件类型
- 若后续还有行,则重复前3个步骤
范例一:变量NR、NF的使用
范例二:在/etc/passwd以“:”作为分隔,把第3字段小于5以下的数据列出,并且只列出第一列和第3列
上图第一行没有正确输出,因为读入第一行时,默认还是以空格符间隔,可利用BEGIN关键字
(3)文件比较工具
- diff命令——通常用于同一文件的新旧版本区别,以行为单位比较
与diff命令密切相关,使用patch命令更新新版本。
参数:-pN——后面N表示取消N层目录的意思;-R——代表还原,将新文件还原成原来旧的版本
范例一:先制作补丁文件,然后由补丁文件更新旧文件,然后恢复出旧文件
第九章 学习shell script
1、script的编写与执行
(1)script的执行有以下方式
- 直接命令执行:shell.sh文件必须要具备r、x的权限
- 绝对路径:如使用/bin/ls来执行命令
- 相对路径:如目前工作目录在/bin,则使用./ls来执行
- 变量PATH功能:将shell.sh放入PATH指定的目录内
- 以bash进程来执行:通过“bash shell.sh”或者“sh shell.sh”来执行,只需要r权限即可执行
参数:-n——仅查询语法问题;-v——在执行script之前,将script的内容输出屏幕;-x——将script执行过程显示在屏幕上
交互式脚本:变量内容有用户决定
2、script的执行方法区别
- 利用直接执行的方法来执行script——在新开辟的子bash(子进程)中执行
前面提到的方法(如绝对、相对和PATH),script是在子进程的bash内执行的,而
子进程执行完后,子进程内的各个变量值不会转回到父进程中。
- 利用source来执行脚本——在原bash(父进程)中执行
用source执行完后,script中的变量都会在原bash中生效,如前面新建别名后,需要执行“source .bashrc”即可生效。
3、判断式——test命令,[]判断符
中括号[]的使用方法与test几乎一样,使用[]作为shell的判断式时,有以下注意:
- []内的每个组件都需要有空格符来分隔
- []内的变量最好以双引号括起来
- []内的常量最好以单/双引号括起来
script的默认变量($0,$1...)
script特殊变量有:
- $0:表示脚本文件名
- $1:表示第一个参数
- $#:表示后接的参数个数
- $@:表示"$1"、"$2"、"$3"...,每个变量是独立的
- $*:表示“"$1c$2c$3c$4"”,其中c为分隔符,默认是空格符,所以本例代表“"$1 $2 $3 $4"”
4、条件判断式
(1)利用if...then
script的执行方式是由上而下,由左而右,因此在script当中的function的设置一定要在程序的最前面。另外,function也是拥有内置变量的,它的内置变量与script类似,后接的变量为$1,$2,但$0仍表示文件名。
(1)while do done, until do done(不定循环)
do
执行程序
done
当condition成立时就进行循环,直到condition的条件不成立才停止。
until [ condition ]
do
执行程序
done
当condition成立时就终止循环,否则就继续进行循环。
(2)for...do...done(固定循环)
第十章 Linux账号管理与ACL权限设置
1、Linux的账号与用户组
(1)用户标识符:UID与GID
每个登录的用户至少会取得两个ID,一个是用户ID(UID),一个是用户组ID(GID)。
跟用户账号有关的两个重要文件:
- /etc/passwd:管理用户UID/GID的重要参数
每一行代表一个账号,但里面大部分系统账号是系统正常运行所必须要的。每一行用“:”分隔成7个字段,如下,其中GID
(2)有效与初始用户组:groups,newgrp
跟用户组有关的两个重要文件:
- /etc/group:记录GID与用户组名的对应关系
一个用户可以加入多个用户组,那么到底以哪个用户组为准?——这里需要涉及到初始用户组和有效用户组了。
在/etc/passwd的第4列GID就是所谓的初始用户组,当用户登录系统后就立刻拥有该用户组的相关权限。
使用命令groups查看当前用户的所有用户组,输出的第一个用户组即为有效用户组,有效用户组的作用是新建文件时,所建文件的用户组用有效用户组来表示。
-
- groups命令——有效与支持用户组的查看
- newgrp命令——有效用户组的切换
2、账号管理
(1)root用户账号管理命令
新建用户,默认做了以下这些事:
-
- 在/etc/passwd里创建一行与账号相关的数据,包括创建UID/GID主文件夹
- 在/etc/shadow里面将此账号的密码相关参数填入,但未设置密码
- 在/etc/group里面加入一个与账号名称一模一样的组名
- 在/home下创建一个与账号同名的目录作为用户主文件夹,且权限为700
- 修改密码——passwd
新增的用户由于没有设置密码,暂时不能登录;
帮别的账号设置密码需要使用“passwd 账号”的格式,使用“passwd”表示修改自己的密码;
一般用户更改密码时需要知道旧密码,而root不需要,并且一般用户只能修改自己的密码,不能修改别人的密码(需要在root登录的情况下修改)。
范例一:给haha用户设置密码
范例二:直接更改密码,不需要输入两次,仅用在script大量新建用户账号中,缺点是密码留在命令中,不安全。
范例三:让某个账号暂时无法使用密码登录
- 列出密码详细信息——chage
- 账号相关数据的微调——usermod
- 删除用户——userdel
用于删除用户的相关数据,主要删除:
-
- 用户数据:/etc/passwd、/etc/shadow
- 用户组数据:/etc/group、/etc/gshadow
- 用户文件数据:/home/username、/var/spool/mail/username(需要加入参数-r)
(2)一般用户账号管理命令
一般用户除了passwd命令外,useradd、usermod、userdel都不能使用,以下命令是一般用户可以使用的
- finger——将用户的属性列出来,几乎都是/etc/passwd中信息
- chfn——修改/etc/passwd中的第5个属性——用户注释信息
- chsh——修改/etc/passwd最后一个属性——shell环境
- id——查看用户的UID与GID
(3)新增和删除用户组
- groupadd——新增用户组
- groupmod——用户组相关数据的微调
- groupdel——删除用户组
注:当某个账号的初始用户组使用该用户组时,就不能删除该用户组。若必须要删除该用户组,可以
-
- 修改该账号在/etc/passwd的GID
- 删除该账号用户
- gpasswd——用户组管理员功能
参数:
-
- 若无任何参数,表示设置该用户组密码(/etc/gshadow)
- -A:使某个用户成为该用户组的管理员
- -r:将该用户组密码删除
- -a:将某位用户加入到该用户组
- -d:将某位用户从该用户组删除
3、主机的具体权限规划:ACL的使用
假设文件tmptf的权限如下:
如果我们希望用户haha也可以对文件tmptf进行读写操作,可有以下方法:
- 其他用户的权限设置为可读可写(则所有用户都可以操作该文件,不可取)
- 将haha添加进root用户组(赋予了过多的权限,所有属于用户组root的文件,haha都拥有其等同的权限)
- 设置sudo,,使haha能够以hjy的身份对文件进行读写操作(虽然可以达到只限定haha一人拥有对tmptf文件的读写权限,但是需要对sudoers文件进行严格的格式控制,而且当文件数量和用户很多的时候,这种方法就相当地不灵活了。)
那么ACL(Access Control List)可以解决该问题,
ACL可以设置特定用户或者用户组对于一个文件/目录的操作权限。
(1)如何启动ACL
目前大部分文件系统都支持ACL,xfs当然也支持!!!
(2)ACL的设置技巧:getfacl,setfacl
-
- -m:设置acl参数
- -x:删除acl参数
- -b:删除所有acl参数
给用户分配权限:u:用户:权限;给用户组分配权限:g:用户组:权限
其中
mask表示最大有效权限,用户或用户组所设置的权限必须存在于mask的权限范围内才能生效。如下把mask的权限范围改成r--
4、用户身份切换
用法如下:
-
- 若要完整切换到新用户的环境,必须要使用“su - username”,才会连同PATH/USER/MAIL等环境变量都转换成新用户的环境
- 若仅想执行一次root命令,可以利用“su - -c '命令串'”方式处理
- 使用root切换成为任何用户时,不需要密码
缺点:当主机是多人管理时,若大家都使用su切换成root用户身份,这样每个人都得需要知道root的密码,这样很不安全。
sudo可以把本来只能root执行的命令赋予普通用户执行,且sudo操作的对象是系统命令,仅有/etc/sudoers内的用户才能执行sudo这个命令。
sudo执行流程:
-
- 当用户执行sudo时,系统在/etc/sudoers文件中查找该用户是否有执行sudo的权限
- 若用户具有,便让用户输入用户自己的密码来确认
- 若密码输入成功,便开始进行sudo后续接的命令(root执行sudo时不需要输入密码)
- 若切换的身份与执行者身份相同,那也不需要输入密码
用visudo命令修改/etc/sudoers文件
/etc/sudoers是有语法的,需要使用visudo命令修改,而不是使用vim,离开修改界面,系统会检测语法错误。
范例一:赋予一般用户拥有root重启系统的执行权
执行visudo命令,在
/etc/sudoers文件中添加以下内容
切换到hjy的shell环境,查看该用户被root允许执行的命令,再使用sudo执行该命令
范例二:赋予一般用户拥有创建用户以及修改别人密码的执行权,但不能修改root的密码,也禁止设置root密码为空
切换到hjy的shell环境,查看该用户被root允许执行的命令,再使用sudo执行新增用户命令与修改密码
5、用户的特殊shell与PAM模块
PAM是一套应用程序编程接口,它提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM就能返回验证结果。
PAM通过一个与命令相同文件名的配置文件来进行一连串的认证分析需求。以passwd为例,
当执行passwd时,调用PAM的流程是:
- 用户执行passwd,并输入密码
- passwd调用PAM模块进行验证
- PAM模块会到/etc/pam.d中查找与passwd同名的配置文件
- 依据/etc/pam.d/passwd内的设置,引用相关的PAM模块逐步进行验证分析
- 将验证结果回传给passwd这个程序
- passwd会根据回传结果决定下一个操作(重新输入新密码或通过验证)
第十一章 磁盘配额(Quota)与高级文件系统管理
1、磁盘配额(Quota)的应用与实践
(1)Quota
- Quota一般用途
- 网络服务
- WWW Server,例如:每个人的网页空间的容量限制
- mail Server,例如:每个人的邮件空间限制
- file Server,例如:每个人最大的可用的网络硬盘空间
- Linux主机
- 限制用户组使用的最大磁盘配额
- 限制用户使用的最大磁盘配额
- Quota的使用限制
- 仅能针对整个文件系统:若/dev/sda1是挂载在/home下,那么/home下面所有目录都会受到限制
- 内核必须支持Quota
- 只对一般用户有效
- Quota的规范
- 文件数量限制与容量限制(inode与block)
- 限制inode用量:用户可以新建文件的数量
- 限制block用量:用户磁盘容量的限制
- soft/hard限制值
- hard限制值:表示用户的用量不能超过该值,若超过,系统会锁住该用户的磁盘使用权
- soft限制值:当低于该值,可正常使用该磁盘,若大于soft而小于hard,则系统会给予7天警告要求磁盘整理,若过了期限,则soft限制值将替代hard限制值作为Quota的限制,此时系统会锁住该用户的磁盘使用权
如:hard为500MB,soft为400MB,若使用容量高达450MB,系统会给予警告,7天后还没有整理磁盘,则hard限制值会变成400MB,此时系统会锁住该用户的磁盘使用权
(2)XFS文件系统Quota范例,步骤如下
- 先创建3个用户quota*,所属用户组为quotagrp
:
*列出文件系统的Quota挂载参数
*列出/home这个支持quato的载点使用情况
Quota是通过分析整个文件系统中每个用户拥有的文件总数与总容量,再将这些数据记录在该文件系统的最顶层目录,然后在该配置文件中再使用每个账号的限制值去规定磁盘的使用量。
quotacheck:扫描支持Quota参数(usrquota,grpquota)的文件系统,并创建Quota的配置文件
此时会自动在/mnt/music文件系统创建Quota的配置文件
参数:-u——启动aquota.user;-g——启动aquota.group;-v——显示启动过程;-a——根据/etc/mtab启动相关quota
一旦启动一次,下次系统启动就会自动执行该命令。
-
- quotaoff——关闭quota的服务
- edquota——编辑账号/用户组的限值与宽限时间
参数:-u——后接用户;-g——后接用户组;-t——修改宽限时间;-p——复制范本
编辑用户quotauser1设置限额
其余4个用户设置一样,可使用quota复制
blocks和inodes是系统自己算的,上面的80是我自己打上去的,保存退出时就出错,不知道为什么我的是0,到此弄不下去了
2、软件磁盘阵列(RAID)
磁盘阵列可将较小的磁盘整合成一个较大的磁盘设备,该大磁盘不仅具有存储功能,还具有数据保护功能。
使用同型号同容量的磁盘来组成,效果更佳,数据会交错存放到各磁盘中,如左下图有100MB数据需要写入,每个磁盘会分配到50MB。
缺点:只要RAID-0有任何一块磁盘损毁,在RAID上的所有数据都会丢失而无法读取。
使用同型号同容量的磁盘来组成,该模式主要是让同一份数据完整保存在两块磁盘上,用于数据的备份,当有一个磁盘损毁时,数据还是可以保留下来。
缺点:由于磁盘一半容量用于备份,则总容量只是全部磁盘容量的一半
由于具有RAID-0的优点,所以性能得以提升,由于具有RAID-1的优点,所以数据得以备份,但同时总容量会少一半用来作为备份。
第十二章 例行性工作(crontab)
1、仅执行一次的工作调度——at
在at工作调度的使用上,系统会将该项at工作独立出你的bash环境中,直接交给系统的atd程序来接管,因此当执行了at工作后就可以脱机,剩下的工作就完全交给Linux管理!
工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行。
要使用单一工作调度,Linux系统上必须要有负责这个调度的atd服务,默认是开启的。启动方法如下:
- at的访问控制——使用/etc/at.allow与/etc/at.deny
- 若系统中有/etc/at.allow文件,那么只有写入/etc/at.allow文件(白名单)中的用户可以使用at命令(/etc/at.deny文件会被忽略)
- 若系统中没有/etc/at.allow文件,而有/etc/at.deny文件(黑名单),那么除了黑名单上的用户外,其他用户都可以使用at命令(对root不起作用)
- 若两个文件都不存在,那么只有root用户可以使用at命令
- 范例一
2分钟后执行hello.sh这个脚本文件,
使用at时会进入一个at shell的环境来让用户执行工作命令(最好是使用绝对路径)
通过atq命令查看有多少at的工作调度,可用atrm命令删除指定工作调度
batch会在CPU的工作负载小于0.8时,才进行你所下达的工作任务!使用
uptime命令查看负载
2、循环执行的例行性工作调度——crontab
(1)用户定时任务
例行性工作调度是由crond这个系统服务来控制。当用户使用crontab这个命令来新建工作调度后,该项工作就会被记载到/var/spool/cron/里面,而且是以账号来作为判别。如hjy执行crontab后,工作会被记载到/var/spool/cron/hjy里。不要使用vim编辑该文件,因为可能由于语法错误而导致无法执行cron。
crond所执行的每一项工作都会被记录到登录文件/var/log/cron中,所以可查看该文件判断Linux是否植入木马。
crond服务是默认启动的,若没启动可执行以下命令
- crontab的访问控制——使用/etc/cron.allow与/etc/cron.deny
- 若系统中有/etc/cron.allow文件,那么只有写入/etc/cron.allow文件(白名单)中的用户可以使用crontab命令(/etc/cron.deny文件会被忽略)
- 若系统中没有/etc/cron.allow文件,而有/etc/cron.deny文件(黑名单),那么处了黑名单上的用户外,其他用户都可以使用crontab命令(对root不起作用)
- 若两个文件都不存在,那么只有root用户可以使用crontab命令
- crontab命令
参数:-e——编辑crontab工作任务(若只删除指定任务,重新编辑即可);-l——查阅crontab工作任务;-r——删除所有的crontab任务
编辑例行性命令的的格式如下,具有六个字段:
范例:没隔2分钟执行一次hello.sh文件
此时才/var/spool/cron/目录下会创建一个root文件,用来记录root用户的例行性任务
(2)系统定时任务:/etc/crontab,/etc/cron.d/*
crontab -e用来设置用户的定时任务,可有些定时任务需要系统执行,有两种方式:
- 把需要定时执行的脚本复制到/etc/cron.daily、/etc/cron.hourly、/etc/cron.weekly、/etc/cron.monthly目录中的任意一个
- 编辑/etc/crontab这个配置文件。
crond服务会每分钟去读取一次/etc/crontab、/var/spool/cron和/etc/cron.d/*里面的内容,并执行,当修改完/etc/crontab之后需要重启crond这个服务。
(3)可唤醒停机期间的工作任务
在Linux停机时,原本的crontab任务无法进行,而
anacron是用来保证在系统关机的时候错过的定时任务,可以在系统开机之后再执行。
anacron是一支程序并非服务,它会每小时被执行一次,所以anacron的配置文件应该放在/etc/cron.hourly里面,如下
nacron的配置文件/etc/anacrontab的内容如下:
anacron会使用一天,七天,一个月作为检测周期,当执行“anacron -s cron.daily”时,会是这样运行的:
- 由/etc/anacrontab分析到cron.daily这项工作名称的天数为1天
- 由/var/spool/anacron/cron.daily取出上一次执行anacron的时间
- 和当前时间做比较,若时间差超过1天,证明有cron任务漏执行,就执行cron.daily工作
- 执行这个工作只能在3:00-22:00之间
- 根据/etc/anacrontab的设置将延迟5分钟,再随机延迟0-45分钟后再执行
- 使用run-parts脚本执行/etc/cron.daily目录下所有可执行文件
第十三章 程序管理
1、什么是进程
- 进程与程序
- 程序:通常为二进制程序放置在存储媒介中,以物理文件的形式存在
- 进程:进程是一个正在运行的程序;程序被触发后,执行者的权限与属性、程序代码与所需数据等都会被加载到内存中,系统并给予这个内存内的单元一个标识符(PID)。
- 子进程与父进程间fork and exec
进程都会通过父进程以复制的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终就成为一个子进程的存在。
常驻在内存中的进程服务,主要负责系统所提供的功能以服务用户各项任务,如atd、crond,一般daemon类型的程序都会在文件名后加"d"。
2、工作管理
(1)什么是工作管理
工作管理指的是在单个登录终端中同时管理多个工作的行为。bash的job control必须要注意:
- 当前bash只能管理自己的工作,而不能管理其他bash的工作
- 前台:可控制与执行命令的环境称为前台工作
- 后台:可自行运行的工作,无法使用Ctrl+c终止它,可使用bg/fg调用该工作放入后台的工作不能够与用户互动
(2)job的控制命令
为了防止后台工作的信息输出到前台,应该设置数据流重定向,如下是将/etc打包的工作放入后台进行
存在以下情况:正在使用vim,需要寻找某个文件放哪,不需要结束vim,只要把vim丢到后台等待即可
+代表最后一个被放置后台的工作号码,-代表最后第二个被放置后台的工作号码,而超过最后第三个以后的工作就不会有+/-号存在
直接执行fg默认将+号的工作拿到前台;“fg -”则将将-号的工作拿到前台;“fg %4”则将工作号码为4的工作拿到前台
格式:kill -signal %jobnumber
使用kill -l查看能够使用的信号
部分重要signal:
-
- -1:让进程立即关闭,然后重新读取配置文件后重启
- -2:等同于Ctrl+c一样中断一个进程
- -9:强制删除一个工作(通常是不正常的工作)
- -15:以正常的方式结束一个工作(默认值)
- -17:等同于Ctrl+z来暂停一个进程的进行
工作管理当中的“后台”指的是在终端机下可避免Ctrl+c终止的情景,并不是放在系统的后台去。因此
工作管理的后台依旧与终端机有关。在远程连接到Linux主机下,若将工作以&的方式放在后台去,在脱机下,该工作是会被终止的。
则后台命令脱离登登陆终端执行的方法有:
- 把需要后台执行的命令加入/etc/rc.local文件(该文件会在系统启动的时候运行)
- 使用系统定时任务crontab,让系统在指定的时间执行某个后台命令
- 使用nohup命令
- 查看系统所有进程——ps aux(注意没有“-”)
top主要分为两个界面:上界面为整个系统的健康状态(主要由这个看系统目前性能,如下),下界面为每个进程的资源使用情况。
每2s更新一次
(2)进程的管理
程序间相互管理是通过给予进程一个信号去告知该进程想要它干什么。使用kill -l查看能够使用的信号,重要的如下
1 |
让进程立即关闭,然后重新读取配置文件后重启 |
2 |
等同于Ctrl+c一样中断一个进程 |
9 |
强制删除一个工作(通常是不正常的进程) |
15 |
以正常的方式结束一个工作(默认值) |
17 |
等同于Ctrl+z来暂停一个进程的进行 |
kill可以将信号传给某个工作(%jobnumber)或者某个PID(直接加数字与加上%number的情况是不同的)
- killall -signal 进程名——按进程名杀死一系列进程
killall可将以某个命令启动的所有进程同时杀死
(3)进程的优先级
PRI值越低代表越优先,不过PRI是由内核动态调整的,用户无法直接调整PRI值,但可通过修改NI值来修改PRI值。
PRI与NI相关性如下:PRI(new)=PRI(old)+NI
修改NI值有如下注意事项:
-
- NI值可调整范围:-20~19
- root可调整自己与他人进程的NI值,且范围为-20~19
- 一般用户仅可修改自己的NI值,且范围为0~19(避免一般用户抢占资源)
- nice命令——执行时立即给予新的NI值
- uptime——查看系统启动时间与工作负载(显示top界面第一行)
- dmesg——分析内核产生的信息
- vmstat——检测系统资源变化
注:缓存(cache)是用来加速数据从硬盘中读取的;而缓冲(buffer)是用来加速数据写入硬盘的
第十四章 系统服务
1、daemon(守护进程)与服务(Service)
Service是常驻在内存的进程,而实现这个Service的程序就是daemon。如实现例行性工作调度服务的程序是crond这个daemon。事实上可以将两者视为相同。
systemd将服务单位(unit)qu区分为service,socket,target,path,snapshot,timer等多种不同的类型。根据扩展名,常见的systemd的服务类型如下:
2、通过systemctl管理服务
(1)通过 systemctl 管理单一服务(service unit)的启动/开机启动与观察状态
如服务atd的操作:
(2)通过systemctl观察系统上所有的服务
范例一:列出系统上有启动的uint
范例二:列出所有已安装的uint
(3)通过systemctl管理不同的操作环境(target unit)
范例一:列出与操作界面有关的target项目
范例二:查看当前是否图形界面,然后转为文字界面
范例三:在重启下,将目前图形界面改为纯文本界面,关掉图形界面