一、进程概念
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等
v Process: 运行中的程序的一个副本(文件),是被载入内存的一个指令集合,在内存中运行,系统指定一个内存空间和PID编号;进程ID(Process ID ,PID )号码被用来标记各个进程;存在生命周期
UID 、GID 、和SELinux 语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承
task struct :Linux 内核存储进程信息的数据结构格式(开发相关)
v task list :多个任务的的task struct 组成的链表,单个链表相当于指针从一个任务传到下一个任务
v 进程创建:init(CentOS6)systemd(CentOS7) :第一个进程 ;克隆出子进程 ;
进程:都由其父进程创建 ,CoW 写(修改)时复制;
父进程通过fork()fock函数生成子进程 , clone()克隆 生成一个新的内存空间,子进程就在新的空间修改
1.1 进程优先级
(CPU设定时间片),把进程分运行等级
系统优先级: 数字越小,优先级越高
0-139 (CentOS4,5) 各有140 个运行队列和等待过期队列
0-98 ,99 (CentOS6)
实时优先级: 99-0 :值最大优先级最高
nice 值:-20 到19 ,对应系统优先级100-139 或99
v Big O :时间复杂度 ,用时和规模的线性关系 ;通过算法控制
O(1), O(logn), O(n) 线性, O(n^2) 抛物线, O(2^n)
1.2进程内存及相互通讯
Page Frame: 页框,用于存储页面数据,存储Page 4k
LRU:Least Recently Used 近期最少使用算法, 释放内存(把进程代码调到swap,交换分区;这样内存空间腾出来)
物理地址空间和线性地址(虚拟3G)空间(32位4G内存,1G给系统内核,3G给内存)
MMU :Memory Management Unit(cpu里的硬件,进程管理单元) 负责转换线性(虚拟内存)和物理地址
v IPC: Inter Process Communication 进程间通讯
同一主机上1、signal(信号)2、shm: shared memory(共享内存)3、semophore 信号量,一种计数器(加锁,不让其他进程访问)
不同主机上:1、rpc: remote procedure call(远程过程调用)2、socket: IP 和端口号
1.3 进程状态
v Linux 内核:抢占式多任务
进程类型:
守护进程(windows服务): daemon, 在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化,可把前台进程放到后台,也能相反。
v 进程状态:
运行态:running (操作系统上同时运行不会太多) ; 就绪态:ready(进程大部分都是在就绪)
睡眠态:(sleep)可中断:interruptable(Ctrl +c);(某些下载的时候)不可中断:uninterruptable
停止态:(vim)stopped, 暂停于内存中,但不会被调度,除非手动启动
僵死态:zombie ,结束进程,父进程结束前,子进程不关闭
二、进程管理工具
v 进程的分类:
CPU-Bound :CPU 密集型(CPU运算),非交互 ;
IO-Bound :IO 密集型(dd读写;ftp下载),交互
v Linux 系统状态的查看及管理工具:pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,
pkill, job, bg, fg, nohup
v pstree 命令:pstree – display a tree of processes显示进程树 父子关系
-p:显示进程PID ; -n:按进程大小排序
2.1 ps: process statu 进程状态
列举进程ps – report a snapshot of the current processes 报告简短的当前进程
Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件中
v 适用ps 来查看进程信息
v ps [OPTION]… 默认显示当前终端中的进程 ;支持三种选项:
UNIX 选项 如-A -e ; BSD 选项 如a ; GUN 选项 如——help
a 选项包括所有终端中的进程 ; x 选项包括不链接终端的进程
f 选项显示进程的父进程 ; u 选项显示进程所有者的信息 (显示真正生效user的进程root) ;
o 属性… 选项显示定制的信息:pid 、comm 、%cpu 、%mem 、state 、tty 、euser 、ruser(生效的使用者)
一般组合使用ps axu
2.1.1 ps axu进程管理工具
v VSZ: Virtual memory SiZe ,虚拟内存集(承诺的内存),线性内存 ;
RSS: ReSident Size, 常驻内存集(真正分配的内存)
STAT :进程状态
R :running运行的 ; S: interruptable sleeping可中断的 ;D: uninterruptable sleeping不可中断的
T: stopped 停止的 ; Z: zombie僵死的 ; s: session leader ,会话(子进程)发起者
+: 前台进程 ; l: 多线程进程 ; N :低优先级进程 ; <: 高优先级进程
2.1.2 ps -axo仅显示指定的进程信息
-e: 显示所有进程 ; -f: 显示完整格式程序信息
-F: 显示更完整格式的进程信息 ; -H: 以进程层级格式显示进程相关信息
v 常用组合:-ef:显示所有进程玩着呢改革是程序信息
常用组合:-eFH:以进程层级格式显示所有进程完整格式进程信息。
常用组合:自定义
-eo pid,tid,class,rtprio,ni,pri,(显示优先级)psr,pcpu,stat,comm(显示命令)
axo stat,euid(运行的ID),ruid(真正的ID),tty,tpgid,sess,pgrp,ppid(父进程的进程编号),pid,pcpu,comm
ni: nice值 ; pri: priority优先级 ; psr: processor CPU编号 ; rtprio:实时优先级
搜索进程 :最灵活:ps 选项(aux) | 其它命令(grep) 随后用kill杀掉进程
2.2 pgrep按预定义的模式
pgrep [options] pattern
-u uid: effective user ,生效者 ;-U uid: real user ,真正发起运行命令者 ; -t terminal: 与指定终端相关的进程
-l: 显示进程名(centos7) ;-a: 显示完整格式的进程名 ; -P pid: 显示指定进程的子进程
v显示命令的PID:pgrep —a http 或者 pstree -p 在进程树下寻找
按确切的程序名称:/sbin/pidof :pidof bash:查看进程的编号
三、系统观察工具
3.1 uptime 查看系统启动负载
显示当前时间,系统已启动的时间和当前上线人数,系统平均负载(1,5,10 分钟的平均负载,一般不会超过1)
v 系统平均负载:指在特定时间间隔内运行队列中的平均进程数
v 如果 每个CPU内核的当前活动进程数不大于3的话,那么系统的性能良好。 如果每个CPU 内核的任务数大于5 ,那么这台机器的性能有严重问题。
v 如果linux 主机是1 个双核CPU 的话,当Load Average为6 的时候说明机器已经被充分使用了。
3.2 top动态观察
top – d #: 指定刷新时间间隔,默认为3秒 ; -b: 以批次方式(支持翻页显示 ;-n #: 显示多少批次
top显示分为:首部信息显示、命令行、栏位信息显示
3.2.1首部信息显示
uptime 信息:l 命令
tasks 及cpu 信息:t 命令
running sleeping stopped zombie
cpu 分别显示:1 ( 数字)
us :用户空间 ; sy :内核空间 ; ni :调整nice 时间 ; id :空闲
wa :等待IO 时间 ; hi :硬中断 ; si :软中断(模式切换) ; st :虚拟机偷走的时间
memory 信息:m 命令
3.2.2 命令行
top的内置命令:
排序:P :以占据的CPU 百分比,%CPU ; M :占据内存百分比,%MEM ; T :累积占据CPU 时长,TIME+
其它:退出命令:q ; 修改刷新时间间隔:s ; 终止指定进程:k 杀进程 ; 保存文件:W
3.2.3栏位信息简介
PID (Process Id): 任务的进程ID ;USER (User Name): 任务所有者名称
PR (Priority): 优先级 ;NI(nice)优先级 ;VIRT(虚拟内存) ; RES(实际使用内存) ;
SHR(进程与其他进程共享内存大小,可以通过RES – SHR来计算所占用内存大小)
%CPU (CPU usage):CPU 使用率 ; %MEM (Memory usage (RES)): 内存使用率
S (Process Status): 进程状态 ; TIME+ (CPU Time, hundredths):CPU 时间,精确到秒
COMMAND:使用的命令。
其他命令行(不在top里的,可以通过ps命令查看)
RUSER (Real User Name): 任务的所有者真实名称 ;PPID (Parent Process Pid): 父任务的进程ID
UID (User Id): 任务所有者ID ;GROUP (Group Name): 任务所有者群组名 ;TTY (Controlling Tty): 终端
3.3 htop 命令top增强版
需从Fedora-EPEL 源安装:wget http://172.16.0.1/fedora-epel/7/x86_64
选项:
-d #: 指定延迟时间; -u UserName: 仅显示指定用户的进程; -s COLUME: 以指定字段进行排序;
子命令:
s: 跟踪选定进程的系统调用; l: 显示选定进程打开的文件列表; a :将选定的进程绑定至某指定CPU 核心;
t: 显示进程树
3.4 vmstat显示虚拟内存
v vmstat 命令:虚拟内存信息
vmstat [options] [delay [count]] vmstat 1 10:1s监控一次,扫10次结束 ; –s: 显示内存的统计数据
v procs: ls /proc 出现的都是进程编号
r :等待运行的进程的个数,和核心数有关 ;b :处于不可中断睡眠态的进程个数( 被阻塞的队列的长度)
v memory:
swpd: 交换内存的使用总量 ; free :空闲物理内存总量
buffer :用于buffer 的内存总量 ; cache :用于cache 的内存总量
v swap交换:
si :从磁盘交换进内存的数据速率(kb/s) ;so :从内存交换至磁盘的数据速率(kb/s)
v io读写:
bi :从块设备读入数据到系统的速率(kb/s) dd if=/dev/sda of=/dev/dull :读入内存
bo: 保存数据至块设备 的 速率 dd if=/dev/zero of=f1 :从内存写出
v system:
in: interrupts, 中断速率,包括时钟 ; cs: context switch, 进程切换速率
v cpu:
us:Time spent running non-kernel code用户运行程序占用的百分比
sy: Time spent running kernel code 用于运行内核占用的cpu百分比
id: Time spent idle. Linux 2.5.41 前, 包括IO-wait time. idle空闲占cpu的百分比
wa: Time spent waiting for IO. 2.5.41 前,包括in idle. 等待io花费的时间
st: Time stolen from a virtual machine. 2.6.11 前, unknown. 被虚拟机偷走的时间
3.5 pmap 命令
进程对应的内存映射 如pmap 1 显示第1个进程(init)与内存的映射关系
v pmap [options] pid […] -x: 显示详细格式的信息;
另外 一种实现: cat /proc/PID/maps 查看内存映射关系
3.6 glances远程系统监控工具
v glances 命令:EPEL源 wget http://172.16.0.1/fedora-epel/7/x86_64
监控时注意防火墙的问题
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port]
[-P password] [–password] [-t refresh] [-f file] [-o output]
3.6.1常用选项
-b: 以Byte 为单位显示网卡数据速率 ; -d: 关闭磁盘I/O 模块 ; -f /path/to/somefile: 设定输入文件位置
-o {HTML|CSV} :输出格式 ; -m: 禁用mount 模块 ; -n: 禁用网络功能模块
-t #: 延迟时间间 ;-1 :每个CPU 的相关数据单独显示
3.6.2排序和显示内建命令
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 hddtemp stats
3.6.3 C/S 模式下运行glances 命令
v 服务模式:glances -s -B IPADDR ( IPADDR: 指明监听的本机哪个地址)
v 客户端模式:glances -c IPADDR (IPADDR :要连入的服务器端地址)
3.7 dstat 系统资源统计
v dstat [-afv] [options..] [delay [count]]
-c: 显示cpu 相关信息 ; -C #,#,…,total 显示所有cpu信息(多个cpu)
-d: 显示disk 相关信息 ;-D total,sda,sdb,…
-g :显示page 相关统计数据 ;-m: 显示memory 相关统计数据
-n: 显示network 相关统计数据 ;-p: 显示process 相关统计数据
-r: 显示io 请求相关的统计数据 ;-s: 显示swapped 相关的统计数据
-r:io请求速率 -y:系统相关数据,包括中断和进程切换
v –tcp ; –udp ; –unix ; –raw(raw套接字) ; –socket ; –ipc:进程通信相关速率
v –top-cpu :显示最占用CPU 的进程
v –top-io: 显示最占用io 的进程
v –top-mem: 显示最占用内存的进程
v –top-latency: 显示延迟最大的进程
四、进程管理
4.1 kill 命令
向进程发送控制信号,以实现对进程管理(适用于所有终端)
显示当前系统可用信号: kill -l
常用信号:man 7 signal
1) SIGHUP: 无须关闭进程而让其重读配置文件 如:service http restart、systemctl reload(restart)http
也可以用pgrep -a http或者pidof http 或者ps aux|grep http查出http的PID ,再用kill -1 PID重读。
2) SIGINT: 中止正在运行的进程;相当于Ctrl+c ; 3)SIGQUIT:相当于quit 和ctrl+\
9) SIGKILL: 杀死正在运行的进程 ; 15) SIGTERM :终止正在运行的进程 ,kill命令默认为15,可以不写
18) SIGCONT :继续运行 ;19) SIGSTOP :后台休眠
指定信号的方法:
(1) 信号的数字标识;1, 2, 9 ,15,18,19,22
(2) 信号完整名称;SIGHUP ; (3) 信号的简写名称;HUP
ps aux | grep ming 查找有关ming程序的PID
4.1.1结束进程
可以结束后台运行程序
按PID :kill [-SIGNAL] pid … 需要配合ps ,pidof ,pgrep搜索进程号
按名称:killall [-SIGNAL] comm… killall bash 只会杀死后台使用bash的程序无效 ;killall -9 bash生效
按模式:pkill [options] pattern 有些有pgrep通用的如:-l ,-a
-SIGNAL ; -u uid: effective user ,生效者 ; -U uid: real user ,真正发起运行命令者
如: pkill -9 -u wang 踢出指定的登录用户 也能pkill -9 -u root 不过之后必须重启
-t terminal: 与指定终端相关的进程 ; -l: 显示进程名
-a: 显示完整格式的进程名 ; -P pid: 显示当前进程的子进程的信息
4.2 作业管理
v Linux 的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
v 如何让作业运行于后台?
(1) 运行中的作业: Ctrl+z 后台休眠
(2) 后台进程(尚未启动的作业):# COMMAND & 用ctrl c不能打断 ;需要用fg调至前台,才能结束。
v 后台作业 虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。
如果希望送往后台后,剥离与终端的关系(防止断网、断电) :
# nohup COMMAND &,但是会把命令执行后的文件重定向到/root/nohup.out 中,因此 &> /dev/zero`
#screen;COMMAND
4.2.1 jobs 查看本终端的作业信息
v 作业控制:
# fg [[%]JOB_NUM] :把指定的后台作业调回前台;
# bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行;
# kill [%JOB_NUM] :终止指定的作业;
并行运行:同时运行多个进程,提高效率运行vim脚本
如:vi all.sh
f1.sh&
f2.sh&
f3.sh&
v如:(f1.sh&);(f2.sh&);(f3.sh&) ; { f1.sh& f2.sh& f3.sh& }
4.2.2进程优先级
进程优先级调整: 静态优先级:100-139
进程默认启动时的nice 值为0 ,优先级为120
只有根用户才能降低nice 值(提高优先性)
v nice 命令:nice [OPTION] [COMMAND [ARG]…] 也可以nice ——10 优先级为—5
v renice 命令: renice [-n] priority pid… ;查看:renice -n -23 PID
ps axo pid,comm,ni
五、任务计划
v Linux 任务计划、周期性任务执行
未来的某时间点执行一次 任务:at
batch 系统 自行选择空闲时间去执行此处指定的任务
周期性 运行某任务: cron
5.1 at 任务
CentOS7 :systemctl is-enabled atd查看开机是否自启 ;systemctl enable atd 开机启动 ;
systemctl disable atd开机禁用 ; systmctl status atd 查看当前状态 systemctl start atd systemctl stop atd
CentOS6: runlevel 查看开机是否自启 chkconfig –list atd 开机启动 ntsysv 开机禁用
service atd status |start |stop |restart
包:at /var/spool/at 文件的任务存储目录 可以在里面修改任务。
v at 命令:at [option] TIME
5.1.1常用选项
-V 显示版本信息 ; -l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm ; -c: 查看具体作业任务
-f /path/from/somefile :从指定的文件中读取任务
-m: 当任务被完成之后,将给用户发送邮件,即使没有标准输出,有标准输出也不在屏幕上显示
v 注意:作业执行命令的结果中的标准输出和错误以邮件通知给关用户
计划任务at的脚本可以送至/dev/dull ,没有邮件能减少mail信息产生垃圾邮件。
v TIME: 定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd] ;noon, midnight, teatime (4pm) ;tomorrow
now+#{minutes,hours,days, OR weeks}
5.1.2 at 时间格式
v HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务 (重启不丢)
v HH:MM YYYY-MM-DD 04:00 2016-09-20 at 12:00 > wall class is over >ctrl d
规定在某年某月的某一天的特殊时刻进行该项任务
v HH:MM[am|pm] [Month] [Date]
04pm March 17 ; 17:20 tomorrow
v HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes ; 04pm + 3 days
5.1.3 at任务配置文件
v 执行方式:
1、交互式 2、输入重定向 3 、at –f 文件
v 依赖与atd 服务, 需要启动才能实现at 任务
v at 队列存放在/var/spool/at 目录中
v /etc/at.{allow,deny} 控制用户是否能执行at 任务
白名单:/etc/at.allow 默认不存在,只有该文件中的用户和root才能执行at 命令,其他用户都不行
黑名单:/etc/at.deny行拒绝该文件中用户执行at 命令,而没有在at.deny文件中的使用者则可执行
如果两个文件都不存在有,只有 root 行可以执行at 命令
5.2 cron周期性任务计划
centos6中查看cron是否为开机启动的服务:chkconfig –list crond
5.2.1相关的程序包
cronie: 主程序包,提供crond 守护进程及相关辅助工具 rpm -ql cronie
cronie-anacron :cronie 的补充程序;用于监控cronie任务执行状况;如cronie 中的任务在过去该运行的时间点未
能正常运行,则anacron 会随后启动一次此任务 rpm -ql cronie-anacron
crontabs :包含CentOS 提供系统维护任务 rpm -ql crontabs
v 确保crond 守护处于运行状态:
CentOS 7:systemctl status crond
CentOS 6:service crond status
v 计划周期性执行的任务提交给crond ,到指定时间会自动运行
系统cron 任务:系统维护作业 vim /etc/crontab
用户cron 任务: crontab 命令 -e:创建计划任务
v 日志:vim /var/log/cron/user
5.2.2 时间表示法
v 系统cron 任务:/etc/crontab
v 注释行以 # 开头
v 详情参见 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
v 例如:晚上9 点10 分运行echo 命令:10 21 * * * centos /bin/echo "Howdy!"
v (1) 特定值;给定时间点有效取值范围内的值
v (2) * 给定时间点上有效取值范围内的所有值 :表示“每…”
v (3) 离散取值:#,#,# ; (4) 连续取值:– #-#
v (5) 在指定时间范围上,定义步长: /#: # 即为步长
v 例如:每3 小时echo 命令:0 */3 * * * centos /bin/echo "howdy!"(脚本路径)
时间格式
v @reboot Run once after reboot.
v @yearly 0 0 1 1 *
v @annually 0 0 1 1 *
v @monthly 0 0 1 * *
v @weekly 0 0 * * 0
v @daily 0 0 * * *
v @hourly 0 * * * *
5.2.3配置计划任务文件
系统的计划任务:
/etc/crontab (centos6) ; /etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本 ; /etc/cron.daily/ 脚本 ;/etc/cron.weekly/ 脚本 ; /etc/cron.monthly/ 脚本
anacron 系统:运行计算机关机时cron 不运行的任务,CentOS6 以后版本取消
anacron 服务,由crond 服务管理。
v 假设计算机没有一直开机
v 对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要
v 对偶尔要关机的服务器很有用
v 配置文件:/etc/anacrontab ,负责执行/etc/ cron.daily
/etc/cron.weekly /etc/cron.monthly 中系统任务。
/etc/cron.hourly/ 由/cron.d/0hourly 执行
• 字段1 :如果在这些日子里没有运行这些任务……
• 字段2 :在重新引导后等待这么多分钟后运行它
• 字段3 :任务识别器,在日志文件中标识
• 字段4 :要执行的任务
• 当执行任务时,更新/var/spool/anacron/ 中文件的时间戳
v CentOS6 使用/etc/cron.daily/tmpwatch 定时清除临时文件
v CentOS7 使用systemd-tmpfiles-setup 服务实现
v 配置文件:
Ø /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
v 命令:systemd-tmpfiles –clean|remove|create configfile管理临时文件
v 用户cron:crontab 命令定义,每个用户都有专用的cron 任务文件:/var/spool/cron/USERNAME
5.2.4 crontab 命令
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任务; -e: 编辑任务; -r: 移除所有任务; -i :同-r 一同使用,以交互式模式移除指定任务
-u user: 仅root 可运行,指定用户管理cron 任务
v 控制用户执行计划任务 :/etc/cron.{allow,deny}
5.3 对比at 和crontab
v 用 一次性作业使用 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)没有被重定向的输出会被邮寄给用户,因而记住 &> /dev/zero
v (2)根用户能够修改其它用户的作业
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null 计划任务不要用echo
(2) COMMAND &> /dev/null
注意:对于cron 任务来讲,% 有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把% 放置于单引中,
也可以不用转义
例如:(1)如何在秒级别运行任务?
* * * * * for min in 0 1 2 ; do echo "hi" ; sleep 20; done
v (2)如何实现每7 分钟运行一次任务? */7 * * * *
v sleep 命令:sleep NUMBER[SUFFIX]…
us:微秒 ; s: 秒, 默认 ;m: 分 ; h: 小时 ; d: 天
原创文章,作者:lyx,如若转载,请注明出处:http://www.178linux.com/61077