进程管理篇
进程概念
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合
进程ID(Process ID,PID)号码被用来标记各个进程
UID、GID、和SELinux语境决定对文件系统的存取和访问权限,
通常从执行进程的用户来继承
存在生命周期
task struct:Linux内核存储进程信息的数据结构格式
task list:多个任务的的task struct组成的链表
进程创建:
init:第一个进程
父子关系
进程:都由其父进程创建,CoW
fork(), clone()
进程优先级
系统优先级:数字越小,优先级越高
0-139(CentOS4,5)
各有140个运行队列和过期队列
0-98,99(CentOS6)
实时优先级:99-0:值最大优先级最高
nice值:-20到19,对应系统优先级100-139或99
Big O:时间复杂度,用时和规模的关系
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
进程相关概念
进程内存:
Page Frame: 页框,用存储页面数据,存储Page 4k
LRU:Least Recently Used 近期最少使用算法,释放内存
物理地址空间和线性地址空间
MMU:Memory Management Unit负责转换线性和物理地址
IPC: Inter Process Communication
同一主机上
signal
shm: shared memory
semophore信号量,一种计数器
不同主机上:
rpc: remote procedure call
socket: IP和端口号
进程状态
Linux内核:抢占式多任务
进程类型:
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interrup table
不可中断:uninterruptable
停止态:stopped,暂停于内存中,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
系统管理工具
进程的分类:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
pstree命令:以树状的方式显示进程
pstree-display a tree of processes
-p 显示进程编号
示例:
以树状可以很清晰看见进程跟进程之间的关系
连进程编号一起显示
ps命令: process state 显示进程状态
ps-report a snapshot of the current processes
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
列举进程ps
适用ps来查看进程信息
ps [OPTION]…
支持三种选项:
UNIX选项如-A -e
BSD选项如a
GUN选项如–help
默认显示当前终端中的进程
a 选项包括所有终端中的进程
x 选项包括不链接终端的进程
u 选项显示进程所有者的信息
f 选项显示进程的父进程
o 属性… 选项显示定制的信息:
pid、comm、%cpu、%mem、state、tty、euser(EffectiveUser)、ruser(RealUser)
示例1:ps的常用选项使用
VSZ:许诺使用内存
RSS:实际使用内存
示例2:指定查看相关的进程信息
假设wan用户在修改密码,此时passwd会用到SUID的权限
此时用root账号查看账号可以看见,此处可以看euser是root,ruser是wan,此处体现了SUID的作用了
假如只通过ps直接查看该进程的时候,只会显示euser的用户,但是该进去实际用户是wan
进程管理工具
VSZ: Virtual memory SiZe,虚拟内存集,线性内存,许诺使用内存,
RSS: ReSidentSize, 常驻内存集,实际使用内存
STAT:进程状态
R:running 正在运行
S: interrup table sleeping
D: uninterrup table sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
常用组合:-ef
-e: 显示所有进程
-f: 显示完整格式程序信息
常用组合:-eFH
-F: 显示更完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
常用组合:自定义
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
进程优先级分类
ni: nice 值,普通优先级,值越低优先级越高
pri: priority 优先级,进程优先级,数值越大优先级越高
psr: processor CPU编号
rtprio: 实时优先级
CentOS 6优先级关系对应表,越左边的优先级越高,越右边的优先级越低
CentOS 4和5优先级关系对应表,越左边的优先级越高,越右边的优先级越低
搜索进程
最灵活:ps 选项 | 其它命令
按预定义的模式:pgrep
pgrep [options] pattern
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
示例:搜索指定进程
按确切的程序名称:/sbin/pidof
pidof bash
示例:搜索指定进程的pid
uptime命令
显示当前时间,系统已启动的时间、当前上线人数,系统平均负载
系统平均负载:(1、5、10分钟的平均负载,一般不会超过1)
指在特定时间间隔内运行队列中的平均进程数。
如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
如果linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
top命令:
选项:
-d #: 指定刷新时间间隔,默认为3秒
-b: 以批次方式
-n #: 显示多少批次
有许多内置命令:
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
栏位信息简介
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间
栏位信息简介
PID (Process Id):任务的进程ID
PPID (Parent Process Pid):父任务的进程ID
RUSER (Real User Name):任务的所有者真实名称
UID (User Id):任务所有者ID
USER (User Name):任务所有者名称
GROUP (Group Name):任务所有者群组名
TTY (Controlling Tty):终端
PR (Priority):优先级
%CPU (CPU usage):CPU使用率
%MEM (Memory usage (RES)):内存使用率
S (Process Status):进程状态
TIME+ (CPU Time, hundredths):CPU时间,精确到秒
htop命令:需从Fedora-EPEL源安装
选项:
-d #: 指定延迟时间;
-u UserName: 仅显示指定用户的进程;
-s COLUME: 以指定字段进行排序;
子命令:
s: 跟踪选定进程的系统调用;
l: 显示选定进程打开的文件列表;
a:将选定的进程绑定至某指定CPU核心;
t: 显示进程树
F1-F10选项
F3直接搜索进程
F9发送kill命令,默认级别是15
vmstat命令:查看虚拟内存信息
vmstat [options] [delay [count]]
-s 内存信息汇总
procs:
r:等待运行的进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd: 交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率
system:
in: interrupts, 中断速率,包括时钟
cs: context switch, 进程切换速率
cpu:
us: Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11前, unknown.
示例1:vmstat 2 5 两秒一次,显示5次
示例2:查看内存汇总信息
示例3:dd if=/dev/sda of=/dev/null 测试硬盘读数据,并且监控
可以看见io bi暴增,假如系统的io值过高,这个时候就需要查看是系统哪个进程占用大量的io了
示例4:dd if=/dev/zero of=f1 测试硬盘写数据,并且监控
可以看见io bo暴增,假如系统的io值过高,这个时候就需要查看是系统哪个进程占用大量的io了
注意:示例3和示例4都是测试磁盘吞吐量
如果io比较大,可以看看是哪个程序产生那么大的io,磁盘io太大的话会带来系统的负载偏大
pmap命令:进程对应的内存映射
pmap [options] pid […]
-x: 显示详细格式的信息;
示例:pmap 1
另外一种实现:
cat /proc/PID/maps
glances命令:glances – A cross-platform curses-based monitoring tool (EPEL源安装)
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [–password] [-t refresh] [-f file] [-o output]
常用选项:
-b: 以Byte为单位显示网卡数据速率
-d: 关闭磁盘I/O模块
-f /path/to/somefile: 设定输入文件位置
-o {HTML|CSV}:输出格式
-m: 禁用mount模块
-n: 禁用网络模块
-t #: 延迟时间间隔
-1:每个CPU的相关数据单独显示
内建命令:
a Sort processes automatically
l Show/hide logs
c Sort processes by CPU%
b Bytes or bits for network I/O
m Sort processes by MEM%
w Delete warning logs
p Sort processes by name
x Delete warning and critical logs
i Sort processes by I/O rate
1 Global CPU or per-CPU stats
d Show/hide disk I/O stats
h Show/hide this help screen
f Show/hide file system stats
t View network I/O as combination
n Show/hide network stats
u View cumulative network I/O
s Show/hide sensors stats
q Quit (Esc and Ctrl-C also work)
y Show/hide hddtempstats
C/S模式下运行glances命令
服务模式:
glances -s -B IPADDR
IPADDR: 指明监听的本机哪个地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
示例1:通过glances观察网络流量
此刻向10.1.156.68的主机发送大量的ping包
可以看见eth0的接口的流量飙升
示例2:通过c/s模式监控网络流量
首先服务端开启glances服务
从客服端开启监控服务
已经链接上了
这个时候从一个端口向服务端发送大流量包,然后再观察流量,可以看见网络流量有明显的变化
dstat命令:系统资源统计
dstat [-afv] [options..] [delay [count]]
-c: 显示cpu相关信息
-C #,#,…,total
-d: 显示disk相关信息
-D total,sda,sdb,…
-g:显示page相关统计数据
-m: 显示memory相关统计数据
-n: 显示network相关统计数据
-p: 显示process相关统计数据
-r: 显示io请求相关的统计数据
-s: 显示swapped相关的统计数据
–tcp
–udp
–unix
–raw
–socket
–ipc
–top-cpu:显示最占用CPU的进程
–top-io: 显示最占用io的进程
–top-mem: 显示最占用内存的进程
–top-latency: 显示延迟最大的进程
示例:用dstat监控网络流量
当网络端口接收到流量的时候,net的监控端的流量会发生明显的变化
kill命令:
向进程发送控制信号,以实现对进程管理
显示当前系统可用信号:kill -l
常用信号:man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c
9) SIGKILL: 杀死正在运行的进程
15) SIGTERM:终止正在运行的进程
18) SIGCONT:继续运行
19) SIGSTOP:后台休眠
指定信号的方法:
(1) 信号的数字标识;1, 2, 9
(2) 信号完整名称;SIGHUP
(3) 信号的简写名称;HUP
按PID:kill [-SIGNAL] pid…
按名称:killall[-SIGNAL] comm…
按模式:pkill[options] pattern
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示父进程为此处指定的进程的进程列表
示例1:正常关闭掉进程
kill命令指定进程号杀掉进程,默认的级别是15
此时此进程已经被杀掉
示例2:强制杀掉某进程(进程可以使用pkill -9 -t pts/1 等直接杀掉哦)
现在要杀掉此进程
查看此进程的pid号码
正常的15信号会发现是杀不死此进程
发送强制信号9杀死进程,发现此进程已经被杀死
示例3:杀死所有的指定进程
示例4:杀死指定匹配的进程
Linux作业管理篇
Linux的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1) 运行中的作业:Ctrl+z
(2) 尚未启动的作业:COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
nohup COMMAND & screen;COMMAND (此处可以查看Linux入门帮助篇screen的用法)
查看所有作业:
jobs
作业控制:
fg[[%]JOB_NUM]:把指定的后台作业调回前台;
bg[[%]JOB_NUM]:让送往后台的作业在后台继续运行;
kill [%JOB_NUM]:终止指定的作业;
前台运行、后台运行、后台休眠关系图
示例1:把前台进程转到后台运行,并且把它关闭
在命令后面加上&符号,把进程转到后台运行,下图可以看见,开始会提示[1] 3193表示他的pid号和jobs的编号,
然后在中间输入了ctrl+c的信号,但是程序并没有停止下来
如果上面的jobs号被刷掉的话,此时可以快速输入jobs命令,会显示jobs 1正在运行,然后再执行fg加指定jobs编号把命令调回来前台执行,然后按ctrl+c终止掉命令
示例2:把程序调到后台休眠状态,然后再把程序调回去后台运行
如果向程序继续在调后台执行,则输入bg加jobs num
示例3:通过kill命令对后台命令进程操作
kill第18级命令,唤醒后台的休眠的做工,让其继续在后台运行
kill第19号命令,让程序进入后台休眠状态
并行同时运行多个进程,提高效率
正常来说,同时执行几个命令,他们应该是按照顺序执行,一个完成后再执行另外以一个
同时运行多个程序的方法:
(f1.sh&);(f2.sh&);(f3.sh&)
{ f1.sh& f2.sh& f3.sh& }
示例:同时运行多个程序
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有根用户才能降低nice值(提高优先性)
普通用户能把自己运行的程序的优先级调低,但是不能调高
nice命令:只能够指定未开始执行的程序
nice [OPTION] [COMMAND [ARG]…]
renice命令:对已经正在进行的程序重新分配其优先级
renice [-n] priority pid…
查看:
ps axo pid,comm,ni
示例1:调高某程序的优先级
ping程序的默认ni优先级只有0
nice -10 指定该命令优先级为10
ps axo指定查看其优先级,可以看见优先级已经改变
如果需要改其优先级为负数的话,则输入–
可以看见此时已经是负数的优先级
示例2:重新修改某程序优先级
任务计划
Linux任务计划、周期性任务执行
未来的某时间点执行一次任务:
at
batch:系统自行选择空闲时间去执行此处指定的任务
周期性运行某任务:
cron
at任务
包:at
at命令:at [option] TIME
常用选项:
-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
TIME:定义出什么时候进行at 这项任务的时间
[YYYY-mm-dd]
noon, midnight, teatime(4pm)
tomorrow
now+#{minutes,hours,days, OR weeks}
示例:
HH:MM 02:00
在今日的HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 04:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
04pm + 3 days
at任务执行方式:
1)交互式 2)输入重定向 3)at –f 文件
依赖与atd服务,需要启动才能实现at任务
at队列存放在/var/spool/at目录中
/etc/at.{allow,deny}控制用户是否能执行at任务
白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
黑名单:/etc/at.deny 拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
如果两个文件都不存在,只有root 可以执行at 命令
示例1:新建一个计划任务
在17:52分,执行命令echo hello world,但是我们并没有看见有任务,原来是因为echo hello world是标准输出,有标准输出的计划任务,都会以发邮件显示,所以这一点需要注意。
示例2:添加白名单控制,指定某用户才能执行at任务
可以看见,在白名单里面添加了wan的用户,此用户可以执行at计划任务,但是wan2用户不在白名单里面,所以执行at命令的时候就会提示权限不够。
示例3:重定向脚本到at任务里面
周期性任务计划cron
相关的程序包:
cronie: 主程序包,提供crond守护进程及相关辅助工具
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
crontabs:包含CentOS提供系统维护任务
计划任务
确保crond守护处于运行状态:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
计划周期性执行的任务提交给crond,到指定时间会自动运行
系统cron任务:系统维护作业
/etc/crontab
用户cron任务:
crontab命令
日志:/var/log/cron
系统cron任务的/etc/crontab文件格式
系统cron任务:/etc/crontab
注释行以# 开头
详情参见man 5 crontab
# Example of job definition:
# .—————-minute (0 -59)
# | .————-hour (0 -23)
# | | .———-day of month (1 -31)
# | | | .——-month (1 -12) OR jan,feb,mar,apr…
# | | | | .—-day of week (0 -6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例如:晚上9点10分以centos身份运行echo命令;
10 21 * * * centos /bin/echo "Howdy!"
时间表示法:
(1) 特定值;
给定时间点有效取值范围内的值
(2) *
给定时间点上有效取值范围内的所有值
表示“每…”
(3) 离散取值:
#,#,#
(4) 连续取值:-
#-#
(5) 在指定时间范围上,定义步长:
/# : #即为步长
例如:每3小时echo命令;
0 */3 * * * centos /bin/echo "howdy!"
一些特殊的时间表示格式
@reboot 表示每次重启以后执行 Run once after reboot.
@yearly 表示每年1月1日执行 0 0 1 1 *
@annually 同上 0 0 1 1 *
@monthly 每个月1号执行 0 0 1 * *
@weekly 每周日执行 0 0 * * 0
@daily 每天执行 0 0 * * *
@hourly 每小时执行 0 * * * *
示例1:新增系统计划任务
示例2:让系统计划任务执行指定脚本
执行脚本的时候,如果是非root用户,需要注意用户执行脚本的权限
新增一个任务:工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
anacron系统
运行计算机关机时cron不运行的任务,CentOS6以后版本取消anacron服务,由crond服务管理。
假设计算机没有一直开机
对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要
对偶尔要关机的服务器很有用
配置文件:/etc/anacrontab
负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。
/etc/cron.hourly/由/cron.d/0hourly执行
字段1:如果在这些日子里没有运行这些任务……
字段2:在重新引导后等待这么多分钟后运行它
字段3:任务识别器,在日志文件中标识
字段4:要执行的任务
当执行任务时,更新/var/spool/anacron/中文件的时间戳
系统的计划任务:
/etc/crontab
/etc/cron.d/ 配置文件
定义一些系统的配置文件,例如0hourly,表示每小时执行run-parts对/etc/cron.hourly里面的任务
/etc/cron.hourly/ 每小时执行的脚本
/etc/cron.daily/ 脚本
系统为什么刚安装完以后,一部分命令的帮助手册没有的原因。然后过一段时间会自动生成帮助手册,原因就在这里了,因为系统每天定义会自动执行mandb的命令(centos7)
/etc/cron.weekly/ 每周脚本,默认为空
/etc/cron.monthly/ 每月脚本,默认为空
管理临时文件
CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
CentOS7使用systemd-tmpfiles-setup服务实现
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令:
systemd-tmpfiles –clean|remove|create configfile
示例:系统自定义的定义清理临时文件的脚本,每10天清理/tmp目录,没30天清理/var/tmp目录
用户计划任务cron:
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务
控制用户执行计划任务:(此处用法原理跟at的allow和deny是一样的)
/etc/cron.{allow,deny}
示例1:创建wan用户的任务
创建任务1:每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
创建任务2:每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
示例2:添加计划任务的权限
当白名单存在的时候,仅允许白名单的用户执行计划任务,其他用户不予执行。
假如白名单不存在的时候,仅有黑名单文件,那么,仅黑名单的用户不能执行计划任务,其他用户都可以执行计划任务。
示例3:删除计划任务
示例4:编辑指定用户的计划任务
at任务和crontab任务的区别
一次性作业使用at
重复性作业使用crontab
Create创建任务 at time crontab -e
List列表任务 at -l crontab -l
Details查看细节 at -c jobnum N/A
Remove删除任务 at -d jobnum crontab -r
Edit N/A crontab -e
没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义
思考:参考sleep命令~
(1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何实现每7分钟运行一次任务?
sleep命令:
sleep NUMBER[SUFFIX]…
SUFFIX:
s: 秒, 默认
m: 分
h: 小时
d: 天
原创文章,作者:~微风~,如若转载,请注明出处:http://www.178linux.com/47225