Linux系统管理课程包含进程管理、后台管理、系统资源查看、系统定时任务(后面还有专门的章节介绍),该课程是整个Linux课程中的一环,也是很重要的课程之一。本课程同样来源于Tony老师2017年视频笔记。
一、进程管理
一、进程管理
⑴、进程管理简介
①、进程:是正在执行的程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
注释:部分进程运行时间很短,进程运行都在内存中,部分服务常驻在内存,阿帕奇程序在内存中最基本服务有6个,每有一个客户端访问就产生一个新进程,阿帕奇默认同时产生的进程为400个,最大为2048个,即一个程序可能产生多个进程。
②、进程管理的作用:
判断服务器健康状态(最重要)
查看系统中所有的进程
杀死进程
⑵、进程的查看-ps命令和pstree命令
①、查看所有进程
ps aux #查看系统中所有进程,使用BSD操作系统格式
ps -le #查看系统中所有进程,使用Linux标准命令格式
选项
a #显示一个终端的所有进程,除了会话引线
u #显示进程的归属用户及内存的使用情况
x #显示没有控制终端的进程
-l #长格式显示。显示详细信息
-e #显示所有进程,和-A作用一致
②、ps命令的输出结果解释
USER: 该进程是由哪个用户产生的
PID: 进程的ID号
%CPU: 该进程占用CPU的百分比
%MEM: 该进程占用物理内存的百分比
VSZ: 该进程占用虚拟内存的大小,单位KB
RSS: 该进程占用实际物理内存的大小,单位KB
TTY: 该进程是在那个终端运行的。其中tty1-tty7代表本地控制台终端(本地终端),tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端(远程终端,Linux更新的2.6内核以后可以达到65535个远程终端)。
STAT:进程状态。常见的状态有:
R: 运行
S: 睡眠(可中断的睡眠状态)
T: 停止状态
s: 包含子进程
+: 位于后台
Z:退出状态,僵尸进程
X:退出状态,进程即将被销毁(永远看不见)
D: 不可中断的睡眠状态
N:低优先权
START: 该进程的启动时间
TIME: 该进程占用CPU的运算时间,就是过程占用时间
COMMAND:产生此进程的命令名(这个是最重要的查看点)
注释:/sbin/init 的PID永远为 1,是所有进程的父进程;TTY 位置为?号证明不是终端启动的,而是系统的内核直接启动的,是系统进程。
③、查看进程树
pstree [选项]
-p #显示进程的PID
-u #显示进程的所属用户
查看起来更直观,重复进程会数字*进程表示
⑶、进程的查看-top命令(执行了top命令,是可以再输入交互命令的)
查看系统健康状态:top [选项] #注意下面标准的(重要查看点)
-d #指定top命令每隔几秒更新,默认是3秒
-b #使用批处理模式输出。一般和"-n"合用
-n #指定top命令执行的次数,一般和"-b"合用
-n 后面加次数(-b后面也是加秒数?待确认)
在top命令的交互模式中可执行的命令:
?或h: #显示交互模式的帮助
P: #以CPU的使用率排序,该项默认
M: #以内存的使用频率排序
N: #以PID排序
任意键: #按任意键继续
q: #退出top
注释:top命令是比较耗费资源的命令,默认3秒刷新是比较合理的,不需要更改,Windows中的进程管理界面也是比较耗费资源的;top -b -n 1 > /root/top.log 将3秒刷新1次的top结果重定向写入top.log日志,打开日志可以看到详细情况。
top命令执行后显示结果解释(主要是前面5行,第6行是交互输入框)
第一行:为任务队列信息
内容 说明:
12:26:45 系统当前时间
up 1 day, 13:32 系统的运行时间,本机已经运行1天13小时32分
2 users 当前登陆了2个用户
load average:0.00 系统在1分钟,5分钟,15分钟的平均负载
, 0.00, 0.00 一般认为小于1时,负载较小,大于1超出负荷
,双核不大于2;4核不大于4;以此类推,当然这
和服务器运行经验有关,假如4核大于4但其他指标均
正常,就证明大于4也可以,平常注意下积累经验数值
(比较重要,是查看点)
注释:系统运行时间虽然越长越好,代表服务器稳定没有故障,但是不能舍本求末,因为时间越长,服务器系统的缓存、临时文件会越多,会导致服务器卡顿。讲师建议:游戏、电影、下载服务器一周定时重启一次;网站等低压力的服务器一般一个月重启一次
第二行:为进程信息
内容 说明
Tasks:95 total 系统中的进程总数
1 running 正在运行的进程数
94 sleeping 休眠的进程
0 stopped 正在停止的进程
0 zombie 僵尸进程,如果不是0,需要手工检查
注释:僵尸进程:上下进程之一的进程出现异常停止,上下进程均不能正确停止,卡在那里。当发现有僵尸进程时,等1分钟左右再查看是否存在,如果还存在百度一下该进程重要程度,不重要的话结束该进程,重要的话没解答。。。
第三行:CPU信息
内容 说明
Cpu(s): 0.1%us 用户模式占用的CPU百分比
0.1%sy 系统模式占用的CPU百分比
0.0%ni 改变过优先级的用户进程占用的CPU百分比
99.7%id 空闲CPU的百分比(重要查看点)
0.1%wa 等待输入/输出的进程 占用的CPU 百分比
0.0%hi 硬中断请求服务占用的CPU百分比
0.1%si 软中断请求服务占用的CPU百分比
0.0%st st(Steal time)虚拟时间百分比。就是当有虚拟机
时,虚拟CUP等待实际CPU的时间百分比
注释:空闲CPU的百分比不能低于20%,否则证明系统非常卡,服务器压力非常大
第四行:内存信息(分别为整体内存大小、多少已用、多少空闲、多少缓冲)
第五行:交换分区(分别为交换分区大小、多少已用、多少空闲、多少缓存已用)
注释:buffers(缓冲)作用:加速的数据写入
cached(缓存)作用:加速的数据读取
内存空闲(重要查看点),如果交换分区空闲低,可以手动添加
⑷、杀死进程(在正常关闭不起作用后才考虑使用)
①、kill命令: kill -l #查看可用的进程信号,共有64个信号
kill [信号] [进程ID] #语法
信号代号 信号名称 说明
1 SIGHUP 该信号让进程立即关闭,然后重新读取配置文件后重启
2 SIGINT 程序终止信号,用于终止前台进程。相当于ctrl+c
8 SIGFPE 在发生致命的算术运算错误时发出,不仅包括浮点运算
错误,还包括溢出及除数为0等其他所有算术的错误
9 SIGKILL 用来立即结束程序的运行,信号不能被阻塞、处理和忽略
一般用于强制性终止进程
14 SIGALRM 时钟定时信号,计算的是实际的实际或时钟时间,alarm
函数使用该信号
15 SIGTERM 正常结束进程的信号,kill命令的默认信号。有时如果进
程已经发生问题,这个信号是无法正常终止进程的,我们
才会尝试SIGKILL信号,也就上信号9
18 SIGCONT 该信号可以让暂停的进程恢复执行,本信号不能被阻断
19 SIGSTOP 暂停前台进程,相当于ctrl+z ,信号不能被阻断。
例如:kill -1 2235 #重启进程,
kill -9 2236 #强制杀死进程
注释:信号1相当于平滑重启,重新加载配置文件,不会影响用户体验
②、killall命令:killall [选项] [信号] 进程名 #按照进程名杀死进程
-i #交互式,询问是否要杀死某个进程
-I #忽略进程名的大小写
例如:killall -9 httpd #杀死阿帕奇进程
③、pkill 命令:pkill [选项] [信号] 进程名 #按照进程名终止进程
-t 终端号:按照终端号踢出用户
查看当前登陆用户的命令:w
可以看出当前登陆的用户、IP、依靠最后执行的命令w可判断哪个root是自己
按照终端号来踢出用户:pkill -9 -t tty1
pkill -9 -t pts/1
注释:只有root用户可以踢出其他用户,如果两个都是root,先下手为强
⑸、修改进程优先级(CPU速度太快,一般不需要改,应用于内核裁剪和嵌入式开发)
①、简介:Linux是多用户、多任务的系统,运行着非常多的进程,然而每个CPU在同一个时钟周期內只能运算一个指令,进程优先级决定了每个进程处理的先后顺序。
ps -le | more 分屏查看进程可以看到PRI NI
PRI代表Priority(初始值为80),NI代表Nice (初始值为0),这俩个值都是优先级,数字越小代表该进程优先级越高
②、修改NI值的注意事项
root用户NI的范围是-20至19 且能设定所有用户的NI值
普通用户调整NI值的范围是0至19,只能调整自己的进程,且只能调高
PRI(最终值)=PRI(原始值)+NI 用户只能修改NI,不能直接修改PRI
③、nice命令: nice [选项] 命令
-n NI值 #给命令赋予NI值
#只能给新执行的命令直接赋予NI值,不能修改已经存在的进程的NI值
例如: nice -n -5 service httpd start
④、renice命令:renice [优先级] PID
#修改已经存在进程的NI值命令,而且是某一个
例如:renice -10 2125
二、工作管理(也称后台管理;Windows最小化程序就是放入后台,方便操作其他程序)
⑴、工作管理简介:指在单个登陆终端中(也就是登陆shell界面中)同时管理多个工作的行为。Linux中将程序放入后台也是为了方便操作其他程序,不放入后台无法操作别的。
注意事项:
当前登陆的终端只能管理当前的工作,而不能管理他处登陆的终端
放入后台的命令是可以持续运行的命令,否则无意义
放入后台执行的命令如果和前台用户有交互(包括给用户查看的)或者需要前
台输入,则只是暂停,而不能继续执行
⑵、工作管理方法
①、把进程放入后台
在命令后面加 & 符号;或者执行某个命令后,按ctrl+z 放在后台暂停
例如:tar -zcf etc.tar.gz /etc & top 然后按 ctrl+z
②、查看放入后台的进程
jobs [-l] -l #显示工作的PID
#+号代表最近放入后台的进程,也是恢复时默认恢复的进程;-号代表倒数第二个放入后台的工作,在③④命令后面默认不加工作号后放回后台,+ - 顺序会变。而且工作号也会有变动,具体的可以实际操作一下。
注释:进程放入后台状态有停止、运行、完成;完成后进程就会消失。
③、将后台进程恢复到前台(fg不加工作号默认将有+号的进程恢复到运行)
fg %工作号
%工作号:%号可以省略,但是注意与PID的区别
④、将恢复到前台的工作再放入后台(bg不加工作号默认将+号的进程恢复到运行)
bg %工作号
注意:后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台
⑶、后台命令脱离登陆终端执行
(除了MySQL程序自身优化过关闭终端会继续自动运行,其他程序关闭终端会停止)
简介:把命令放入后台,只能在当前登陆终端执行。一旦退出或关闭终端,后台程序会停止运行。(即无论是正确logout还是直接关掉,都会向系统发生1) SIGHUP信号)
方法:
把需要执行的命令加入/etc/rc.local文件(自定义启动配置文件,最简单)
使用系统定时任务,定时执行后台命令(会偶尔失效)
使用nohup命令(标准方法)
nohup [命令] &
例子:创建一个脚本程序放入后台执行(先创建文件,输入脚本,然后nohup)
vi for.sh
#!/bin/bash
for((i=0;i<=1000;i=i+i))
do
echo 11 >> /root/for.log
sleep 10s
done
nohup /root/for.sh &
三、系统资源查看(下面前三个命令需要背下来)
⑴、vmstat 命令监控系统资源
vmstat [刷新延时 刷新次数] 例如:vmstat 1 3
显示结果分析:
procs:进程信息字段
r:等待运行的进程数,数量越大,系统越繁忙
b:不可被唤醒的进程数量,数量越大,系统越繁忙
memory:内存信息字段(下面单位均为KB)
sapd:虚拟内存的使用情况
free:空闲的内存容量
buff:缓冲的内存容量
cache:缓存的内存容量
swap:交换分区的信息字段
si:从磁盘中交换到内存中数据的数量,单位KB
so:从内存中交换到磁盘的数据的数量,单位KB。
这两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差
io:磁盘读写信息字段
bi:从块设备读入数据的总量,单位是块。
bo:写到块设备的数据的总量,单位是块。
这两个数字越大,代表系统的I/O越繁忙。
system:系统信息字段
in:每秒被中断的进程次数
cs:每秒种进行的时间切换次数
这两个数字越大,代表系统与接口设备的通信非常繁忙
CPU:CPU信息字段
us:非内核进程消耗CPU运算的时间的百分比
sy:内核进程消耗CPU运算时间的百分比
id:空闲CPU的百分比
wa:等待I/O所消耗的CPU百分比
st:被虚拟机所盗用的CPU占比
注释:缓存和缓冲的区别:缓存是用来加速数据从硬盘中“读取”的,而缓冲是用来加速数据“写入”硬盘的。运行速度比较:CPU(100G/秒)、内存(1G/秒)、硬盘(50M/秒),因此需要缓存和缓冲(两者都是内存中运行)加速整体电脑的效率。
⑵、dmesg开机时内核自检信息(Linux自检2次:硬件BIOS自检和系统内核自检)
dmesg #内核所有的自检信息
dmesg | grep CPU #内核关于CPU的自检信息
⑶、free命令查看内存使用状态
free [-b|-k|-m|-g]
-b 以字节为单位显示
-k 以KB为单位显示,默认情况显示单位
-m 以MB为单位显示
-g 以GB为单位显示
结果显示分析:
第一行:total 内存总数、used 已使用内存数、free 空闲的内存数量
shared 多个进程共享的内存总数、 buffers 缓冲内存数量、cached
缓存内存数量 默认单位KB
第二行(下面的 + - 为符号加减,Mem为数字的意思):
-/buffers/cache 行used值,相当于第一行的used-buffers-cached
#这里得出的used值为系统已用的值
+/buffers/cache 行free值,相当于第一行的free+buffers+cached
#这里得出的free值为系统空闲的值
第三行(交换分区的使用情况,服务器系统中SWAP分配都比较大,主要是为了提高系统性能):
total是swap的总数;used是已经使用的swap数量,free是空闲的swap
数量。默认单位是KB
⑷、查看CPU信息: cat /proc/cupinfo
⑸、uptime命令
uptime #显示系统的启动时间和平均负载,也就是top命令的第一行
w命令也可以看到这个数据
⑹、查看系统与内核相关信息
uname [选项]
-a #查看系统所有相关信息(下面2个参数没什么意义)
-r #查看内核版本
-s #查看内核名称
判断当前系统的位数 file /bin/ls #随便找个命令查看
2.6.32-279.e16.i686 是内核版本 用命令uname -r查看
CentOS release 6.3 (Final) 是发行版本用lsb_release -a查看
注释:在64位的CPU里面是可以安装32位系统的
⑺、列出进程打开或使用的文件信息
lsof [选项] #列出进程调用或打开的文件信息
-c 字符串 #只列出字符串开头的进程打开的文件
-u 用户名 #只列出某个用户的进程打开的文件
-p pid #列出某个PID进程打开的文件
例如:
lsof | more #查询系统中所有进程调用的文件(分屏显示)
lsof /sbin/init #查询文件被哪个进程调用(被查询文件为系统文件)
lsof -c httpd #查看httpd进程调用了哪些文件
lsof -u root #按照用户名,查询某个用户的进程调用的文件名
四、系统定时任务
⑴、at一次性定时任务
①、查询确定at安装,而且是启动状态:
chkconfig --list | grep atd #查询at服务是否安装
service atd restrat #启动at服务
②、at的访问控制机制(默认只有黑名单,因为白名单人数实在太多。。。)
如果系统中有/etc/at.allow文件,那么只有写入/etc/at.allow(白名单)文件中的用户可以使用at命令(优先级低的写入同一用户的/etc/at.deny文件会被忽略)
如果系统中没有/etc/at.allow文件,只有/etc/at.deny文件,那么写入/etc/at.deny文件(黑名单)中的用户不能使用at命令。对root无效。
如果系统中以上两个文件都不存在,那么只有root用户可以使用at命令
③、at命令
at [选项] 时间 #最常用的是直接加时间,不加选项
-m #当at完成后无论是否命令有输出都通知执行at的用户
-c 工作号 #显示该at工作的实际内容
时间: 例如:
HH:MM 02:30
HH:MM YYYY-MM-DD 02:30 2017-1-05
HH:MM[am|pm] [month] [date] 02:30 July 25
HH:MM[am|pm] + [minutes|hours|days|weeks] now + 5 minutes
④、实验例子1:
at now + 2 minutes #在两分钟之后执行hello.sh脚本,后面有提示符
at> /root/hello.sh >> /root/hello.log #按照提示符输入执行内容
例子:完整的例子过程
vi hello.sh #创建文件
#!/bin/bash #shell编程
echo "hello" >> /root/hello.log
:wq
chmod 755 hello.sh #赋予执行权限
./hello.sh #执行一次
ls #查看文件列表
cat hello.log #打开文件
at now + 5 minutes #5分钟之后执行
at> /root/hello.sh #输入执行程序绝对路径
atq #查看定时执行的at任务
at -c 1 #查询工作号为1的定时任务详情
注释:如果退格键不能删除前面不需要的,使用ctrl+退格键删除,crtl+d保存退出
例子2(重启任务最好还是由人工执行):
at 02:00 2017-1-5 #在指定时间重启
at> /bin/sync #数据同步,将内存中的数据转移到硬盘
at> /sbin/shutdown -r now #执行重启
⑵、crontab循环定时任务(和用户身份绑定,所以执行定时任务需要注意是否有权限)
①、确定crond服务是否安装与启动
chkconfig crond on #确定服务是否安装???待确认
service crond restart #重启crond服务
chkconfig --list | grep cron #查询是否安装开启crond服务
②、crond访问控制机制(默认只有黑名单)
当系统中有/etc/cron.allow文件时,只有写入此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命令。同样如果由此文件,/etc/cron.deny文件会被忽略,/etc/cron.allow文件的优先级更高
当系统中只有/etc/cron.deny文件时,则写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用crontab命令
③、用户的crontab设置
crontab [选项]
-e #编辑当前用户的crontab定时任务
-l #查询crontab任务
-r #删除当前用户所有的crontab任务
例如:crontab -e #进入编辑界面,会打开VIM编辑你的工作
定时任务格式:* * * * * 执行的任务(命令/脚本)
crontab的配置文件格式
* * * * * [用户名] COMMAND
↓↓ ↓ ↓ ↓
↓↓ ↓ ↓→→→星期0-7(一周当中的星期几,0或7表示星期天)
↓↓ ↓→→→月份1-12(一年中的第几个月)
↓↓→→→日起1-31(一个月当中的第几天)
↓→→→小时0-23(一天当中的第几小时)
→→→分钟0-59(一小时中的第几分钟)
特殊符号 含义
* 代表任意时间
, 代表不连续的时间
- 代表连续的时间范围
*/n 代表每隔n执行一次
例如 0 0 1,15 * 1 每个月1号15号,每个月的礼拜一 都执行
5 5 * * 2 /sbin/shutdown -r now 每周二重启一下服务器
0 5 * * * 每天5点整(分位千万不要写错成*)
④、crontab注意事项
六个选项都不能为空,必须填写,如果不确定使用*代替任意时间
crontab定时任务最小有效时间是分钟,最大为月,特殊看后面一节课程
定有时间时,日期和星期最好不要一起写,容易混乱
定时任务中,不管是直接写命令,还是脚本中写命令,最好都用绝对路径
因为path路径会有些不同,可能会导致不执行的后果
⑶、系统的crontab设置
系统的定时任务(实际就是将定时任务写入配置文件)
crontab -e 是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务。可是有些定时任务需要系统执行,这时我们就需要编辑 /etc/crontab 这个配置文件
/etc/crontab 文件打开后显示解释
SHELL=/bin/bash #基于这个bash的命令执行脚本方式
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#定时任务的4个存放命令路径,每个用 :隔开,因为比系统定义的命令路径
要少,所以最好用绝对路径去写,才不会导致有些不在这些目录下的命令不能
定时执行 按这样的理解,这个PATH是否可以和系统命令一样定义,不
就避免了出现不执行的情况吗?待确认!!!
MAILTO=root #发送定时任务消息到root
HOME=/ #标识主目录在哪
再下面就是注释,*****定义和上面说的相同,唯一不同的是要加定义的用户
例如:5 5 * * * root /root/hello.sh
注释:还有一种方法,也是推荐方法,把需要执行的定时脚本复制到
/etc/cron.{daily,weekly,monthly}目录中的任意一个,下面会详细讲解
⑷、anacron配置
(服务器关机、断电、故障等情况下服务器恢复重启后会自动检测cron.daily cron.hourly cron.monthly cron.weekly 这4个目录里面的定时计划,而crontab -e 编辑的定时任务就不会执行)
①、定义:anacron 是用来保证系统因关机后重启错过的定时任务可以继续执行
②、anacron检测周期和工作原理
anacron会使用一天,七天,一个月作为检测周期
在系统的/var/spool/anacron/目录中存在cron.{daily,weekly,monthly}文件,用于记录上次执行cron的时间,用于后面的时间比较
和当前时间作比较,如果两个时间的差值超过了anacron的指定时间差值(daily时间差为1天,时间比较粗略,不会精确到小时,其他类推),证明有cron任务被错过执行
③、CentOS 6.x的区别
在老的CentOS中,/etc/cron.{daily,weekly,monthly}这些目录会被cron调用,也会被anacron调用,容易重复执行
在CentOS 6.x中则只会被anacron调用,避免了重复执行
在CentOS 6.x中,anacron不再是服务,而是系统命令
④、anacron配置文件
vi /etc/anacrontab
RANDOM_DELAY=45 #最大随机延迟
START_HOURS_RANGE=3-22 #anacron的执行时间范围是3:00-22:00
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#天数 强制延迟(分) 工作名称 实际执行的命令(可查看nice命令)
whereis run-parts 返回在 /usr/bin/run-parts
vi /usr/bin/run-parts
#shell的一个脚本,相当于命令,效率较低一点点,而C#写的命令效率更高
⑤、以cron.daily为例子说明执行过程(假设服务器故障后重启)
首先读取/var/spool/anacron/cron.daily中的上一次执行时间
和当前时间比较,如果差值超过1天,就执行cron.daily工作
执行这个工作只能在3:00-22:00之间(可根据上面内容进行更改)
执行工作时强制延迟5分钟,再随机延迟0-45分钟(避免大量任务同时执行)
使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily
目录中的所有可执行文件