第二章 Linux 实操(二)
3、crond 任务调度
crontab 进行定时任务的设置
概述
任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:
- 系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等。
- 个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。
基本语法
crontab [选项]
常用选项:
快速入门
- 设置任务调度文件:
/etc/crontab
- 设置个人任务调度。执行
crontab -e
命令 - 接着输入任务到调度文件
- 如:
*/1 * * * * ls -l /etc/ > /tmp/to.txt
意思是说每小时的每分钟执行 ls -l /etc/ > /tmp/to.txt 命令
参数细节说明
- 5个占位符的说明:
- 特殊符号的说明:
- 特定时间执行任务案例:
应用实例:
写入:
*/1 * * * * ls -l /etc/ > /tmp/to.txt
- 每隔1分钟,就将当前的日期信息,追加到
/tmp/mydate
文件中
*/1 * * * * date >> /tmp/mydate
- 每隔1分钟,将当前日期和日历都追加到
/home/mycal
文件中
第一步,编辑一个脚本文件:
vim /home/my.sh
第二步,给root用户增加对my.sh文件的执行权限:
chmod u+x /home/my.sh
第三步,设置定时执行脚本:
crontab -e
- 每天凌晨 2:00 将mysql数据库 testdb,备份到文件中,提示:备份指令为
mysqldump -u root -p 密码 数据库 > /home/bd.bak
第一步:crontab -e
第二步:0 2 * * * mysqldump -u root -palliance testdb > /home/db.bak
crond 相关指令
crontab -r (功能描述:删除当前用户的任务调度)
crontab -l (功能描述:列出当前有哪些任务调度)
service crond restart (功能描述:重启任务调度)
at定时任务
基本介绍
- at命令是一次性定时执行任务,at的守护进程atd会以
后台模式
运行,检查作业队列来运行。 - 默认情况下,atd守护进程每隔60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
- at命令是一次性定时执行任务,执行完一个任务后就不再执行此任务了。
- 在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看。
ps -ef | grep atd // 可以检测atd进程是否在运行
atd原理图:
at 命令格式
at [选项] [时间]
ctrl + D 结束at命令的输入(输入两次)
at命令选项:
at指定时间的方法:
应用实例
- 2天后的下午5点执行
/bin/ls /home
- atq 命令可以查看系统中没有执行的工作任务
- 明天17点钟,输出时间到指定文件内,比如
/root/date100.log
- 2分钟后,输出时间到指定文件内,比如 /root/date200.log
- 删除已经设置的任务
atrm 编号
- 2分钟后执行 /root/my.sh 脚本
4、Linux 磁盘分区、挂载
Linux 分区
原理介绍
- 对于 Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。
- Linux采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
硬盘说明:
- Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘。
- 对于IDE硬盘,驱动器标识符为 “hdx~” ,其中“hd”表明分区所在设备的类型,这里是指IDE硬盘了。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),“~”代表分区,前四个分区用数字1到4表示,它们是主分区或拓展分区,从5开始就是逻辑分区。例,hda3表示为第一个IDE硬盘上的第三个主分区或拓展分区,hdb2表示为第二个IDE硬盘上的第二个主分区或拓展分区。
- 对于SCSI硬盘则标识为“sdx~”,SCSI硬盘是用“sd”来表示分区所在设备的类型的,其余则和IDE硬盘的表示方法一样。
查看所有设备的挂载情况
命令:lsblk 或者 lsblk -f
针对于第二张图:
- sda 指的是每个分区的情况
- FSTYPE 指的是每个分区的文件系统类型
- UUID 指的是每个分区的唯一标识符(40位)
- MOUNTPOIN 指的是每个分区的挂载点
挂载的经典案例
下面以增加一块硬盘为例来熟悉磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念。
如何为 Linux 系统增加一块硬盘呢?
- 给虚拟机添加硬盘(1G)
重启后的分区情况:
- 分区
分区命令:fdisk /dev/sdb
说明:dev(device)这个目录中包含了所有 Linux 系统中使用的外部设备。它实际上是一个访问这些外部设备的端口。我们可以很方便地去访问这些外部设备,和访问一个文件,一个目录是没有任何区别的。
开始对 /sdb分区:
m 显示命令列表
n 新增分区
p 显示磁盘分区 同 fdisk -l
d 删除分区
w 写入并退出
说明:开始分区后输入n,新增分区,然后选者p,分区类型为主分区。两次回车默认剩余全部空间。最后输入w写入分区并退出,若不想保存退出则输入q
- 格式化
格式化磁盘
分区命令:mkfs -t ext4 /dev/sdb1
,其中 ext4 是分区类型
- 挂载(将一个分区和一个目录联系起来)
挂载命令:mount 设备名称 挂载目录
例如: mount /dev/sdb1 /newdisk
卸载命令:umount 设备名称 或者 挂载目录
例如: umount /dev/sdb1 或者 umount /newdisk
注意:用命令行挂载的方式,重启以后会失效!!!
- 设置可以自动挂载
- 永久挂载:通过修改
/etc/fstab
实现挂载 - 添加完成后,执行
mount -a
立即生效
第一个0表示不做dump备份,第二个0表示不检查硬盘扇区。
- 完成啦!!!
磁盘情况查询
查询系统整体磁盘使用情况
基本语法:
df -h
应用实例:
- 查询系统整体磁盘使用情况
Filesystem:文件系统
Size:容量
Used:已用
Avail:可用
Use%:已用%
Mounted on:挂载点
注意:如果已用率达到80%以上就不正常了,提醒需要清理下磁盘空间了!
查询指定目录的磁盘占用情况
基本语法:
du -h /目录
查询指定目录的磁盘占用情况,如果没有指定则默认为当前目录
- 选项:
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth=1 子目录深度
-c 列出明细的同时,增加汇总值
应用实例:
- 查询 /opt 目录的磁盘占用情况,深度为 1
工作实用指令
统计 /opt 文件夹下文件的个数
统计 /opt 文件夹下目录的个数
统计 /opt 文件夹下文件的个数,包括子文件夹里的
统计 /opt 文件夹下目录的个数,包括子文件夹里的
以树状显示目录结构
如果没有tree指令,则使用 yum install tree 安装
tree /opt
5、进程管理(重点)
基本介绍
- 在Linux中,每一个执行的程序都被称为一个进程。每一个进程都会分配一个ID号(
pid
,进程号) - 每个进程都可能以两种方式存在。前台与后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作,但在屏幕上无法看到的进程,通常使用后台方式运行。
- 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才会结束。
windows下的pid
linux:top指令
注意:输入q可以退出当前状态!!!
显示系统执行的进程
基本介绍
ps 命令是用来查看当前系统中,有哪些正在执行的进程 ,以及它们的执行状况。也可以不加任何参数
ps显示的信息选项:
字段 | 说明 |
---|---|
PID | 进程识别号 |
TTY | 终端机号 |
TIME | 此进程所消耗CPU时间 |
CMD | 正在执行的命令或进程名 |
ps -a:显示当前终端的所有进程信息
ps -u:以用户的格式显示进程信息
ps -x:显示后台进程运行的参数
一般我们将这三个参数进行组合使用,例如:执行 ps -aux
命令
参数解释:
- USER:执行当前进程的用户
- PID:进程号
- %CPU:当前进程占用cpu的百分比
- %MEM:当前进程占用物理内存的百分比
- VSZ:当前进程占用虚拟内存的大小(单位:KB)
- RSS:当前进程占用物理内存的大小(单位:KB)
- TTY:终端名称,一般都是缩写
- STAT:当前进程的运行状态
- S 表示sleep休眠
- s 表示该进程是会话的先导进程
- N 表示进程拥有比普通优先级更低的优先级
- R 表示正在运行
- D 表示短期等待
- Z 表示僵尸进程(进程已经死掉了,但是内存并没有释放)
- T 表示被跟踪或者被停止等等
- START:当前进程执行的开始时间
- TIME:当前进程占用的CPU时间
- COMMAND:启动该进程所用的命令和参数,如果过长会被截断显示
应用实例
要求:以全格式显示当前所有的进程,并查看当前进程的父进程
ps -ef 是以全格式显示当前所有的进程
-e 显示所有的进程
-f 全格式
ps -ef | grep xxx
是BSD风格
参数解释:
- UID:用户ID
- PID:进程ID
- PPID:父进程ID
- C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
- STIME:进程启动的时间
- TTY:完整的终端名称
- TIME:占用的CPU时间
- CMD:启动进程所用的命令和参数
ps -ef|grep sshd
sshd进程是1号进程的子进程
终止进程 kill 和 killall
介绍
如果某个进程执行一半需要停止时,或者是已经消耗了大量的系统资源时,此时可以考虑停止该进程。使用kill
命令来完成此项任务。
基本语法
kill [选项] 进程号 (功能描述:通过进程号来终止进程)
killall 进程名称 (功能描述:通过进程名称来终止进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
- 常用选项:
-9 表示强迫进程立即停止
应用实践:
- 踢掉某个非法登录的用户(tom)
- 终止远程登录服务sshd,在适当的时候再次重启sshd服务
恢复 sshd 服务:
- 终止多个 gedit
- 强制杀掉一个终端
查看进程树 pstree
基本语法
pstree [选项] (功能描述:可以更加直观的查看进程信息)
常用选项
-p:树状形式显示进程的PID
-u:树状形式显示进程的所属用户
应用实例
- 以树状形式显示进程的PID
- 以树状形式显示进程的所属用户
6、服务(service)管理
介绍
服务(service)本质上就是进程,但是是运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如(mysqld,sshd、防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。
原理图
service 管理命令
service 服务名 [start| stop| restart| reload | status]
注意:在 CentOS7.0 之后很多服务不再使用service,而是systemctl
service指令管理的服务在 /etc/init.d
查看
service管理指令案例:
使用servce指令,查看,关闭,启动 network【注意:不要在xshell中执行,关闭网络后,连接sshd服务会断开连接】
查看服务名
- 方式1:使用 setup —> 系统服务,就可以看到全部
- 带*号的服务都是随着linux的启动而自动启动的,没有带 *号的服务都是需要手动启动的
- 退出按Tab
- 方式2:/etc/init.d 可以看到 service 指令管理的服务
ls -l /etc/init.d
服务的运行级别(runlevel)
Linux系统有七种运行级别(
runlevel
):常用的是级别3和5
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
- 运行级别2:多用户状态(没有NFS),不支持网络
- 运行级别
3
:完全的多用户状态(有NFS),无界面,登录后进入控制台命令行模式 - 运行级别4:系统未使用,保留
- 运行级别
5
:X11控制台,登陆后进入图形 GUI 模式 - 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
开机的流程说明:
CentOS7 运行级别说明:
- 获取当前系统的运行级别:
systemctl get-default
- 设置为运行级别3:
systemctl set-default multi-user.target
- 设置为运行级别5:
systemctl set-default graphical.target
chkconfig 指令
基本介绍
- 通过 chkconfig 命令可以给服务的各个运行级别设置自启动/关闭
- 通过 chkconfig 指令管理的服务可以在
/etc/init.d
查看 - 注意:CentOS7.0后,很多服务都是使用
systemctl
来管理的
基本语法
chkconfig --list [| grep xxx] (功能描述:查看服务)
chkconfig 服务名 --list (功能描述:查看服务)
chkconfig --level 5 服务名 on/off (功能描述:设置当前服务在某个级别下是否自启动/关闭)
应用实例:
对 network 服务进行操作,设置 network 在运行级别3关闭自启动
chkconfig --level 3 network off // 关闭
chkconfig --level 3 network on // 开启
特别注意:chkconfig
重新设置服务自启动或关闭后,需要重启机器(reboot)才能生效
systemctl 指令
基本语法
systemctl [start | stop |restart |status ] 服务名
systemctl
指令管理的服务可以在 /usr/lib/systemd/system
中查看
systemctl 设置服务的自启动状态
1. systemctl list-unit-files [|grep 服务名] (功能描述:查看服务开机启动状态,grep可以进行过滤)
2. systemctl enable 服务名 (功能描述:设置服务开机启动)
3. systemctl disable 服务名 (功能描述:关闭服务开机启动)
4. systemctl is-enabled 服务名 (功能描述:查询某个服务是否是自启动的)
应用实例:
- 查看当前防火墙的状况,关闭防火墙和重启防火墙。
- 查看当前系统防火墙服务的名称
ls -l /usr/lib/systemd/system | grep fire
- 查看当前系统防火墙服务的状态(可以看到当前防火墙已关闭自启动)
systemctl list-unit-files | grep firewalld.service
systemctl status firewalld
- 查看当前防火墙服务是否是自启动的
systemctl is-enabled firewalld
- 开启防火墙
systemctl start firewalld
- 关闭防护墙
systemctl stop firewalld
- 防火墙原理图
细节点:
- 关闭或者启动防火墙后,立即生效。【可以用
telnet
测试某个端口】 - 这种方式只是临时生效,当系统重启后,还是会回归到之前对服务的设置。
- 如果希望设置某个服务自启动或关闭
永久生效
,需要使用systemctl [enable|disable] 服务名
- 通过 systemctl start firewalld 或者 systemctl stop firewalld 命令进行开启/关闭防火墙
- 如果你用 systemctl is-enabled firewalld 命令还是可以看到之前防火墙服务的真正状态,所以你重启系统后会还原到之前的状态
- 只有通过 systemctl enable firewalld 或者 systemctl disable firewalld 命令进行开启/关闭防火墙,才能真正永久生效
查看当前有哪些端口正在处于监听状态?
netstat -anp | more
打开或者关闭指定端口
在真正的生产环境中,往往需要将防火墙打开,那么问题来了,如果我们把防火墙打开了,那么外部请求数据包就不能跟服务器的监听端口进行通讯了。这时,需要打开指定的端口。比如 80,22,8080 等,这个该怎么做呢?
注意一个点:协议指的是下面这些:
firewall 指令
- 打开端口:
firewall-cmd --permanent --add-port=端口号/协议
- 关闭端口:
firewall-cmd --permanent --remove-port=端口号/协议
- 注意:无论是关闭还是开启端口,都需要重新载入防火墙才能生效
firewall-cmd --reload
- 查询端口是否开放:
firewall-cmd --query-port=端口/协议
应用案例:
- 启用防火墙,测试111端口是否能telnet
- 开放 111 端口
- 再次关闭 111 端口
7、动态监控进程
介绍
top 和 ps 命令很相似。它们都是用来显示正在执行的进程。 top 和 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的进程。
基本语法
top [选项]
选项说明:
top 命令参数详解
第一行:
top - 16:27:13 up 45 days, 6:36, 1 user, load average: 0.14, 0.05, 0.06
- top:当前时间
- up:机器运行了多长时间
- users:当前登录用户数
- load average:系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
这里需要具体关注的还是 load average
三个数值。
先来说说定义吧:在一段时间内,CPU正在处理以及等待CPU处理的进程数之和。三个数字分别代表了1分钟,5分钟,15分钟的统计值,这个数值的确能反应服务器的负载情况。
但是,这个数值高了也并不能直接代表这台机器的性能有问题,可能是因为正在进行CPU密集型的计算,也有可能是因为I/O问题导致运行队列堵了。所以,当我们看到这个数值飙升的时候,还得具体问题具体分析。大家都知道,一个CPU在一个时间片里面只能运行一个进程,CPU核数的多少直接影响到这台机器在同一时间能运行的进程数。所以一般来说 load average
的数值别超过这台机器的总核数,就基本没啥问题。
第二行:
Tasks: 92 total, 1 running, 91 sleeping, 0 stopped, 0 zombie
- Tasks:当前有多少进程
- running:正在运行的进程数
- sleeping:正在休眠的进程数
- stopped:停止的进程数
- zombie:僵尸进程数
这里 running 越多,服务器的压力自然就越大。
第三行:
%Cpu(s): 0.5 us, 0.5 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- us:用户空间占CPU的百分比(像shell程序、各种语言的编译器、各种应用、web服务器和各种桌面应用都算是运行在用户地址空间的进程,这些程序如果不是处于idle 状态,那么绝大多数的CPU时间都是运行在用户态)
- sy: 内核空间占CPU的百分比(所有进程要使用的系统资源都是由 Linux 内核处理的,对于操作系统的设计来说,消耗在内核态的时间应该是越少越好,在实践中有一类典型的情况会使 sy 变大,那就是大量的IO操作,因此在调查 IO 相关的问题时需要着重关注它)
- ni:用户进程空间改变过优先级(ni是nice的缩写,可以通过 nice 值调整进程用户态的优先级,这里显示的 ni 表示调整过 nice 值的进程消耗掉的CPU时间,如果系统中没有进程被调整过nice值,那么ni就显示为0)
- id: 空闲CPU占用率
- wa: 等待输入输出的CPU时间百分比(和CPU的处理速度相比,磁盘IO操作是非常慢的,有很多这样的操作,比如:CPU在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会把CPU等待IO操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作造成的)
- hi: 硬中断占用百分比(硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理(消耗CPU时间)。)
- si:软中断占用百分比(软中断是由程序发出的中断,最终也会执行相应的处理程序,消耗CPU时间)
- st:steal time
第四行:
KiB Mem : 3782992 total, 191216 free, 753068 used, 2838708 buff/cache
- total:物理内存总量
- free:空闲内存量
- used:使用的内存量
- buffer/cache:用作内核缓存的内存量
第五行:
KiB Swap: 0 total, 0 free, 0 used. 2730936 avail Mem
- total:交换区内存总量
- free:空闲交换区总量
- used:使用的交换区总量
- buffer/cache:缓冲的交换区总量
第四第五行分别是内存信息和swap信息,所有程序的运行都是在内存中进行的,所以内存的性能对于服务器来说非常重要。不过当内存的free变少时,其实我们并不需要太紧张。
注意:真正需要看的是Swap中的used信息。Swap分区是由硬盘提供的交换区,当物理内存不够用时,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存是真的不够用了。
交互操作
交互操作说明:按下下列按键
应用实例:
- 监视特定用户,比如监控 tom 用户
top:输入此命令,按回车键,查看执行的进程
然后输入“u”,回车,再输入用户名即可
- 终止指定的进程,比如结束tom登录
先输入top指令后,再输入“k”,再输入想要终止的进程号(PID)
- 指定系统状态更新的时间(每隔10秒自动更新)(默认是3秒)
top -d 10
监控网络状态
查看系统网络情况 netstat
原理图
基本语法
netstat [选项]
选项说明:
-an 按一定顺序排列输出
-p 显示哪个进程在调用
应用案例:
- 查看服务名为 sshd 的服务信息
检测主机连接命令 ping
是一种网络检测工具,它主要是用来检测远程主机是否正常,或是两部主机间的网线或网卡是否有故障。
基本语法
ping 对方ip地址
8、RPM 与 YUM
rpm 包的管理
基本介绍
- rpm用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版本中。它生成具有
.RPM
拓展名的文件。RPM是 RedHat Package Manager (RedHat软件包管理工具)的缩写,类似于 windows 的setup.exe,这一文件格式名称虽然打上了 RedHat 的标志,但理念是通用的。 - Linux的分发版都有采用(suse,redhat,centos 等等),可以说是公认的行业标准了。
rpm包的简单查询指令
- 查询已安装的 rpm 列表:
rpm -qa | grep xxx
举例:查看当前系统是否安装了 firefox
rpm -qa | grep firefox
rpm包名基本格式:
一个rpm包名:firefox-60.2.2-1.el7.centos.x86_64
名称:firefox
版本号:60.2.2-1
使用的操作系统:el7.centos.x86_64,表示centos7.x的64位系统
如果是i686、i386,则表示32位的操作系统,如果是noarch则表示通用
rpm包的其它查询指令
rpm -qa
:查询所安装的所有rpm软件包
rpm -qa | more
rpm -qa | grep xxx(例如:rpm -qa | grep firefox)
rpm -q 软件包名
:查询软件包是否安装
案例:rpm -q firefox
rpm -qi 软件包名
:查询软件包信息
案例:rpm -qi firefox
rpm -ql 软件包名
:查询软件包中的文件
比如:rpm -ql firefox
rpm -qf 文件全路径名
:查询文件所属的软件包
比如:rpm -qf /etc/passwd
安装 rpm 包
基本语法
rpm -ivh RPM包全路径名称
参数说明
i=install (安装)
v=verbose (提示)
h=hash (进度条)
应用实例
- 演示安装和卸载 firefox 浏览器
卸载 rpm 包
基本语法
rpm -e RPM包的名称
应用实例:
- 删除 firefox 的软件包
rpm -e firefox
细节:
如果其它软件包依赖于将要卸载的软件包,卸载时则会产生错误的信息。
如果我们就是要删除这个 rpm 包,可以增加参数 —-nodeps
,就可以强制删除,但是一般不推荐这样做,因为依赖于该软件包的程序可能无法运行。
rpm -e --nodeps 软件包
yum
基本介绍
Yum 是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载 RPM 包并安装,可以自动处理依赖关系,并且一次性安装所有依赖的软件包。
yum的基本指令
查询yum服务器是否有需要安装的软件(软件列表)
yum list | grep xx
安装指定的yum包(下载安装)
yum install xxx
应用实例
- 使用 yum 的方式来安装 firefox