一、进程概念

内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等

Process:  运行中的程序的一个副本,是被载入内存的一个指令集合

进程ID (Process ID ,PID )号码被用来标记各个进程

UID 、GID 、和SELinux 语境决定对文件系统的存取和访问权限,

通常从执行进程的用户来继承

存在生命周期

task struct :Linux 内核存储进程信息的数据结构格式

task list:多个任务的的task struct 组成的链表

进程创建:

init :第一个进程

父子关系

进程:都由其父进程创建,CoW   copy on write

fork(), clone()

二、进程的优先级(时间片)

1.进程优先级:

系统优先级: 数字越小,优先级越高

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)

实时优先级   动态优先级

2.进程内存:

Page Frame:  页框,用存储页面数据,存储Page 4k

LRU :Least Recently Used  近期最少使用算法, 释放内存物理地址空间和线性地址空间

MMU :Memory Management Unit 负责转换线性和物理地址

TLB:Translation Lookaside Buffer  翻译 后备 缓冲器, 用于保存虚拟地址和物理地址映射关系的缓存

3.IPC: Inter Process Communication

同一主机: signal: 信号,进程与进程之间不能直接访问内存空间,

shm: shared memory  找一块共享内存空间,共享

semaphore: 信号量,一种计数器,两个进程不能同时访问,一个访问后加上lock

不同主机:rpc: remote procedure call

socket: IP和端口号  套接字

三、进程状态

Linux 内核:抢占式多任务

进程类型:

守护进程: daemon, 在系统引导过程中启动的进程, 和终端无关进程

前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转化

进程状态:

运行态:running

就绪态:ready

睡眠态:

可中断:interruptable

不可中断:uninterruptable

停止态:stopped, 暂停于内存,但不会被调度,除非手动启动

僵死态:zombie,结束进程,父进程结束前,子进程不关闭

四、系统管理工具

进程的分类:

CPU-Bound :CPU 密集型,非交互

IO-Bound :IO 密集型,交互

Linux 系统状态的查看及管理工具:pstree, ps, pidof,pgreb, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup

(1)pstree 命令:树状结构

process  进程 重(耗资源)

thread    线程 轻(省内存)

(2)ps:显示当前进程的状态  

Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件中

1.支持三种选项:

UNIX 选项 如 如-A -e

BSD 选项 如 如a

GNU 选项 如 如--help

2.ps 当前终端打开的进程(所在终端编号)

a 所有终端中的进程

x 和终端无关(不链接)的进程,后台守护进程

u 显示进程所有者、PID、cpu、内存、VSZ、RSS 等信息

o 属性…  选项显示定制(u里的选项,所以不和u连用)的信息

pid 、comm 、%cpu 、%mem 、state 、tty 、[e]user(生效) 、ruser(发起)

f  显示进程的父进程

k [/--sort]  对所选属性排序(默认是PID排序)

-C f1.sh  查看脚本信息(需#!机制,执行./)

常用组合 aux  -ef

VSZ: Virtualmemory SiZe ,虚拟内存集,线性内存

RSS: ReSident Size, 常驻内存集,真实内存

3.STAT :进程状态

R :running

S: interruptable sleeping

D: uninterruptable sleeping

T: stopped

Z: zombie

+:  前台进程

l:  多线程进程

L :内存分页并带锁

N :低优先级进程

<: 高优先级进程

s: session leader  会话(子进程)发起

 

(3)几种优先级

ni: nice

pri: priority  优先级

psr: processor CPU 编号

rtprio:  实时优先级

例:ps axo pid,cmd,psr,ni,pri,rtprio

1.nice 值  -20—19     ps o ni[ce]可以查看

进程优先级调整:

静态优先级:100-139

进程默认启动时的nice 值为0 ,优先级为120

只有根用户才能降低nice 值(提高优先性)

nice直接指定优先级

nice -n 优先级 cmd  例:nice -n 10 ping 127.1

renice 调整优先级

renice 优先级 PID  例:renice -10 3213   超过-20—19,用-20或19

 

(5)pgrep按预定义的模式查询

-u : effective user ,生效者  例:pgrep -u root

-U : real user ,真正发起运行命令者   例:pgrep -U root

-t terminal:  与指定终端相关的进程    例:pgrep -t pts/0

-l:  显示进程名   例:pgrep -l ping

-a:  显示完整格式的进程名   例:pgrep -a ping

-P pid: 显示指定进程的子进程   例:pgrep-P 2314

支持正则表达式  例:pgrep -a"^pi.*"

按确切的程序名称:/sbin/pidof

pidof进程名   查询进程名对应的进程号,如果能查询出来echo $? 为0值,查不出值为1

常用在脚本,例:

pidof httpd &> /dev/null || systemctl restarthttpd

 

五、进程管理工具

(1)uptime 显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1 、5 、10 分钟的平均负载,一般不会超过1)值越大,负载越大

在工作中,uptime查询,显示系统已启动的时间太长,别乱碰,机器很老,很容易故障

系统平均负载:

指在特定时间间隔内运行队列中的平均进程数

通常每个CPU 内核的当前活动进程数不大于3,那么系统的性能良好。 如果每个CPU 内核的任务数大于5, 那么此主机的性能有严重问题

如果linux 主机是1个双核CPU,当Load Average,比内核大的超过3,不太好,为6的时候说明机器已经被充分

 

(2)top  默认按cpu占用率排序

1.第一行就是 uptime

第二行 tasks任务: 总数  在运行  睡眠的  stop  僵尸态

第三行栏位信息简介:cpu    dd if=/dev/zeroof=/dev/null 纯粹占用cpu,用于实验

us :用户空间

sy :内核空间

ni :调整nice 时间

id :空闲

wa :等待IO 时间

hi :硬中断

si :软中断(模式切换)

st:虚拟机偷走的时间

第四行内存信息:总数  空闲内存数  已经占用的  缓存buff 

第五行swap信息: 总数 空闲内存数  已经占用的  缓存buff 

dd if=/dev/zero of=/dev/null bs=3G count=1纯粹耗费swap,用于实验

 

2. top :有许多内置命令(认为干预):(打开后直接按下面的选项)

排序:

P :以占据的CPU 百分比,%CPU(默认)

M :占据内存百分比,%MEM

T :累积占据CPU 时长,TIME+

首部信息显示:

uptime 信息:l 命令  (是否显示)

tasks 及cpu 信息:t 命令

cpu 分别显示:1 ( 数字) (双核分开看)

memory 信息:m 命令 (3中类型显示)

 

修改刷新时间间隔:s(默认3秒一刷新)   s 10 10秒一刷新

终止指定进程:k     k 进程号  kill信号 例:k   4123 9

保存文件:W

退出命令:q

 

3.top 进去前选项

-d #:指定刷新时间间隔,默认为3秒 秒

-b:全部显示所有进程

-n #:刷新多少次后退出

例:top -d 1 -n 3 一秒刷新一次,3次后退出

 

4.htop 更花哨的top工具,默认没有安装,需从EPEL源中安装yum -y install htop

wKioL1m-AEaBy7oTAAAW0skKeP0149.png

F1 help  F2 选择格式(按空格) F3搜索  F4过滤  F5显示 F6 排序 F9kill

选项:

-d #: 指定延迟时间;

-u UserName:  仅显示指定用户的进程

-s COLUME: 以指定字段进行排序

子命令:

s:  跟踪选定进程的系统调用

l:  显示选定进程打开的文件列表(包含用到的库)

a :将选定的进程绑定至某指定CPU 核心

t: 显示进程树

 

六、内存工具

(1)vmstat命令:虚拟内存信息,默认显示一次就退出

wKiom1m-AMSyW1MpAAAiY4Dn6pU744.png

① procs:

r :可运行(正运行或等待运行)进程的个数,和核心数有关

b:处于不可中断睡眠态的进程个数( 被阻塞的队列的长度)

② memory: :

swpd: 交换内存的使用总量

free :空闲物理内存总量

buffer :用于buffer 的内存总量

cache :用于cache 的内存总量

③ swap:

si :从磁盘交换进内存的数据速率(kb/s)

so:从内存交换至磁盘的数据速率(kb/s)  测试dd if=/dev/zero of=/dev/null bs=3G count=1

④ io

bi :从块设备读入数据到系统的速率(kb/s)  测试dd if=/dev/sda of=/dev/null

bo:  保存数据至块设备的 速率   测试dd if=/dev/zeroof=/app/f1

⑤ 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-waittime.

wa: Time spent waiting for IO. 2.5.41 前,包括in idle.

st: Time stolen from a virtual machine.2.6.11 前, unknown.

选项:

-s:  显示内存的统计数据

#:指定刷新时间间隔,并不退出   例:vmstat1  一秒刷新一次

# #:指定刷新时间间隔和刷新几次  例:vmstat1  10 一秒刷新一次,刷10次退出

 

(2) iostat: 统计CPU 和设备IO 信息

wKiom1m-AP2zphwoAABBSs_w8HY391.png

每秒钟读取多少K的数据量   每秒钟写多少K的数据量  总的读的数据量   总的写

#:指定刷新时间间隔,并不退出   例:iostat1  一秒刷新一次

# #:指定刷新时间间隔和刷新几次  例:iostat1  10 一秒刷新一次,刷10次退出

(3)pmap命令:进程对应的内存映射,占用哪部分真正的内存空间

pmap [options] pid [...]  查看是否有内存泄漏问题,只存不释放,发现内存不断的增大,有问题

-x:  显示详细格式的信息

例:pmap 1

另外一种实现:(显示的差不多)

cat /proc/PID/maps 内核空间用户空间

 

(4)glances命令:系统监控工具

glances [-bdehmnrsvyz1] [-B bind] [-c server] [-Cconffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-ooutput]

1.内建命令:

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

2.常用选项:

-b:  以Byte 为单位显示网卡数据速率

-d:  关闭磁盘I/O 模块

-f /path/to/somefile: 设定输入文件位置

-o {HTML|CSV} :输出格式

-m:  禁用mount 模块

-n:  禁用网络模块

-t #:  延迟时间间隔

-1 :每个CPU的相关数据单独显示

3. C/S 模式下运行glances 命令

服务器模式:

glances -s -B IPADDR

IPADDR:指明监听的本机哪个地址

客户端模式:

glances -c IPADDR

IPADDR:要连入的服务器端地址

 

(5)dstat命令:系统资源统计, 相对较新的命令,代替vmstat,iostat

yum install dstat -y

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: 显示延迟最大的进程

 

 

 

七、kill命令:

1.向进程发送控制信号,以实现对进程管理, 每个信号对应一个数字,信号名称以SIG 开头(可省略 ), 不区分大小写

显示当前系统可用信号: kill –l  或  trap -l

常用信号:man 7 signal

1) SIGHUP无须关闭进程而让其重读配置文件

2) SIGINT中止正在运行的进程;相当于Ctrl+c

3) SIGQUIT: 相当于ctrl+\

9) SIGKILL:  强制杀死正在运行的进程

15) SIGTERM 终止正在运行的进程(默认为15)

18) SIGCONT 继续运行

19) SIGSTOP 后台休眠

指定信号的方法:

(1)  信号的数字标识:1, 2, 9  例:kill -1 PID

(2)  信号完整名称:SIGHUP  例:kill -SIGHUP PID

(3)  信号的简写名称:HUP   例:kill -HUP PID

 

2. 按进程号:

按名称:killall [-SIGNAL] com…  killall -9 bash (全杀)  killall httpd

按模式:pkill [options] pattern    pkill -9 "bash"支持正则 

-SIGNAL

-u uid: effective user     生效者  suid特殊权限

-U uid: real user ,真正发起运行命令者

-t terminal:  与指定终端相关的进程

-l:  显示进程名(pgrep 可用)

-a:  显示完整格式的进程名(pgrep 可用)

-P pid: 显示指定进程的子进程

 

八、作业管理

(1)Linux 的作业控制:

前台作业:通过终端启动,且启动后一直占据终端;

后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系

(2)查看当前终端所有作业: jobs

wKioL1m-AQ6wRCveAAA1JG3kWzo271.png

(3)并行运行

同时运行多个进程,提高效率

1.方法1,写进脚本

vi all.sh

f1.sh &

f2.sh &

cmd &

2.方法2

(f1.sh&);(f2.sh&);(f3.sh&)

方法3

{ f1.sh& f2.sh& f3.sh& }

{ ping -c 3 127.1 ; ping 127.2 ;  }&  { ping -c 3 127.3 ; ping 127.4 ;  }&

 

九、任务计划

Linux 任务计划、周期性任务执行

  未来的某时间点执行一次任务

at

batch :系统 自行选择空闲时间去执行此处指定的任务

  周期性运行某任务  周期性的备份,清理

cron

(1)at

1.安装确保服务启动

rpm -ql at  看到有servie,就想到查询服务是否开启

wKioL1m-AUryiJCXAAAu22MV404389.png

centos 7 

systemctl status atd[.service]  查询服务状态

systemctl start atd 开启服务

 

centos 6

wKiom1m-AbLgYjLmAAAkvUfnALk291.png

service atdstatus  

service atd start

 

2.at 命令:at [option] TIME

wKiom1m-AeTCQ9zCAAAhaQ3LQTI981.png

常用选项: 队列信息的配置文件在  /var/spool/at目录下

-V  显示版本信息:

-l:列出指定队列中等待运行的作业;相当于atq  例:at -l

-d #:删除指定的作业;相当于atrm

-c #:查看具体作业任务                                     例:at -c 1

-f路径 :从指定的文件中读取任务                      例:at -f at.txt 12:12

-m: 当任务完成后,即使没有标准输出也强制发邮件

因为是交互式的,所以可以事先把计划任务写到脚本里,再用管道实现非交互,<,-f

cat at.log |at 12:12

at 写完任务 按Ctrl +d 退出

 注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户,为了减少生成垃圾邮件,可以加上 &> /dev/null

② TIME: 定义出什么时候进行 at  这项任务的时间

HH:MM [YYYY-mm-dd]

noon(12:00), midnight(00:00), teatime (4pm)

tomorrow

now+#{minutes,hours,days,OR weeks}

at 时间格式

HH:MM   在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务

HH:MM YYYY-MM-DD 02:00 2016-09-20  规定在某年某月的某一天的特殊时刻进行该项任务

HH:MM[am|pm] [Month] [Date]   例:04pm March   例:17:20 tomorrow

HH:MM[am|pm] + number [minutes|hours|days|weeks]  在某个时间点再加几个时间后才进行该项任务

例:now + 5 minutes

02pm + 3 days

执行方式:

1)交互式    2)输入重定向  例:at12:12: 2017-12-12 < at.txt    3)at –f  文件

  • 依赖与atd 服务, 需要启动才能实现at 任务

  • at 队列存放在/var/spool/at目录中,所以重启仍在

  • /etc/at.{allow,deny} 控制用户是否能执行at 任务

    白名单:/etc/at.allow  默认不存在

    黑名单:/etc/at.deny  默认存在,拒绝该文件中用户执行at 命令

    如果两个文件都不存在有,只有 root 行 可以执行 at

    有allow > deny,allow优先级最大

    没at.allow,at.deny只有root才有权限执行at

    没allow有deny  deny中用户不能执行,其他用户默认允许

    有allow有deny  只有allow中用户才能执行

     

    (2)cron

    1.相关的程序包:(默认都安装了)

    cronie:  主程序包,提供crond 守护进程及相关辅助工具

    cronie-anacron :cronie 的补充 程序,用于 监控cronie任务执行 状况,如cronie 中的任务在过去该运行的时间点未能正常运行,则anacron 会随后启动一次此任务

    crontabs :包含CentOS 提供系统维护任务

    rpm -ql cronie  和 at 一样

    CentOS 7:

    systemctl status crond

    CentOS 6:

    service crond status

     

    2.系统cron 任务:系统维护作业    /etc/crontab(只有root才有权限)

    用户cron 任务: crontab 命令

    日志:/var/log/cron

    系统cron 任务:/etc/crontab

    详情参见 man 5 crontab

wKioL1m-AfLTux8GAABe1hHGIqU829.png

时间表示法:

特定值     给定时间点有效取值范围内的值

    *       给定时间点上有效取值范围内的所有值,表示“每...”

离散取值  #,#,#

连续取值  #-#

在指定时间范围上,定义步长  /#: #

 

时间格式

@reboot Run once after reboot.

@yearly 0 0 1 1 *

@annually 0 0 1 1 *

@monthly 0 0 1 * *

@weekly 0 0 * * 0

@daily 0 0 * * *

@hourly 0 * * * *

wKioL1m-AifAlwUeAAA75uZzklk009.png

系统的计划任务:

/etc/cron.d 目录   vim /etc/cron.d/0hourly

wKiom1m-AoqR6tTUAAAga549DOA684.png

/etc/cron.d/ 配置文件

/etc/cron.hourly/ 脚本

/etc/cron.daily/ 脚本

/etc/cron.weekly/ 脚本

/etc/cron.monthly/ 脚本

date -d "yesterday" +%F 创建昨天的时间的文件

date -d "-2 day" +%F  创建前天的时间的文件     date -d "-/+#  day" +%F

 

3.用户cron

crontab 命令定义,每个用户都有专用的cron 任务文件:

/var/spool/cron/USERNAME

crontab命令:

相当于vi 打开的,没有颜色,export EDITOR=vim 用vim打开,写到配置文件/etc/profile.d/*.sh

crontab [-u user] [-l | -r | -e] [-i]

-l:  列出所有任务;

-e:  编辑任务;改任务     crontab -e 写自己的计划任务

-r:  移除所有任务;

-i :同-r 一同使用,以交互式模式移除指定任务

-u user: 仅root 可运行,指定用户管理cron 任务

例:su - wang  crontab -e

wKiom1m-As3jIQm8AAAFNaOpglQ386.png

控制用户执行计划任务 :

/etc/cron.{allow,deny}

有allow > deny,allow优先级最大

没at.allow,at.deny只有root才有权限执行at

没allow有deny  deny中用户不能执行,其他用户默认允许

有allow有deny  只有allow中用户才能执行

注意:对于cron 任务来讲,% 有特殊用途;如果在命令中要使用%, ,则需要转义,将%

 

4.秒级  sleep 0.5 支持小数点    usleep 以微秒为单位 10^6微秒 为 1秒

* * * * * root ls;sleep 20;pwd;sleep 20;...

 

 

 

4.anacron 系统 ,运行计算机关机时cron不运行的任务,因为企业不常关机,所有不常用

wKioL1m-As-iTNtXAAB8Z0U71Hg107.png

运行计算机关机时cron不运行的任务,CentOS6 以后版本取消anacron 服务,由crond 服务管理

对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统很重要对很有用

配置文件:/etc/anacrontab ,负责执行/etc/ cron.daily/etc/cron.weekly /etc/cron.monthly 中系统任务。

  字段1 :如果在这些日子里没有运行这些任务……

  字段2 :在重新引导后等待这么多分钟后运行它

  字段3 :任务识别器,在日志文件中标识

  字段4 :要执行的任务

由/etc/cron.hourly/0anacron 执行

当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳

 

5.定时清除临时文件

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|createconfigfile

wKioL1m-AwuAokhSAAFGwadmKOw371.png