进程的概念
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等
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 (CenOS6)
实时优先级: 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
睡眠态:
可中断:interruptable
不可中断: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
ps: process state
ps – report a snapshot of the current processes
Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件
列举进程ps
ps [OPTION]…
支持三种选项:
UNIX选项如-A -e
BSD选项如a
GUN选项如–help
• 默认显示当前终端中的进程
• a 选项包括所有终端中的进程
• x 选项包括不链接终端的进程
• u 选项显示进程所有者的信息
• f 选项显示进程的父进程
选项可组合使用:
• o 属性… 选项显示定制的信息:
pid 、comm 、%cpu 、%mem 、state 、tty 、euser(执行命令生效的用户)、ruser(执行此命令的用户)
部分结果图:
进程管理工具
VSZ: Virtual memory SiZe ,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集
STAT:进程状态
R:running
S: interruptable sleeping(可中断的休眠)
D: uninterruptable 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:实时优先级
搜索进程
最灵活:ps 选项 | 其它命令
按预定义的模式:pgrep
pgrep [options] pattern
-u uid: effective user ,生效者
-U uid: real user ,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
按确切的程序名称:/sbin/pidof
$pidof bash
系统工具
uptime
显示当前时间,系统 已启动的时间、当前上线人数,系统平均负载(1 、5 、10 分钟的平均负载,一般不会超过1) )
系统平均负载:
指在特定时间间隔内运行队列中的平均进程数 。
如果每个CPU 内核的当前活动进程数不大于3 的话,那么系统的性能良好。 如果每个CPU 内核的任务数大于5 ,那么这台机器的性能有严重问题。
如果linux主机是1个双核CPU的话,当Load Average为6的时候说明机器已经被充分会用了
进程管理工具
top:有许多内置命令(先输入top进入界面):
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l 命令
tasks及cpu信息:t 命令
cpu分别显示:1 ( 数字)
memory信息:m 命令 切换数字、图形方式显示
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
选项:
-d #: 指定刷新时间间隔,默认为3秒 秒
-b: 以批次方式
-n #: 显示n批次 然后结束退出
栏位信息简介:可对应上图中的数据
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
内存工具
vmstat 命令:虚拟内存信息 可使用man帮助查看具体资料
vmstat [options] [delay [count]]
vmstat 2 5(表示两秒执行一次,执行五次后退出)
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.
选项:
-s: 显示内存的统计数据
pmap 命令 :进程对应的内存 映射
pmap [options] pid(进程编号) […]
-x: 显示详细格式的信息;
#pmap 1
另外一种实现:
# cat /proc/PID/maps
系统监控工具
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: 显示延迟最大的进程
进程管理工具
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
作业管理
Linux 的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
如何让作业运行于后台?
(1) 运行中的作业: Ctrl+z
(2) 尚未启动的作业:# COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系
# nohup COMMAND & #screen;COMMAND
查看所有作业:
# jobs
作业控制:
# fg [[%]JOB_NUM] :把指定的后台作业调回前台;
# bg [[%]JOB_NUM] :让送往后台的作业在后台继续运行;
# kill [%JOB_NUM] :终止指定的作业
jobs查询作业 然后fg 1返回操作界面
并行运行进程
同时运行多个进程,提高效率
1、编写脚本
vi all.sh
f1.sh&
f2.sh&
f3.sh&
2、(f1.sh&);(f2.sh&);(f3.sh&)
3、{ f1.sh& f2.sh& f3.sh& }
Linux 任务计划、周期性任务执行
at:未来的某时间点执行一次 任务
batch:系统 自行选择空闲时间去执行此处指定的任务
cron:周期性运行某任务
at任务
at命令:at [option] TIME 适合一次性 临时性的任务
创建的at任务会存到/var/spool/at/目录下 cat可直接查看
常用选项:
-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile :从指定的文件中读取任务
-m: 当任务 被完成之后,将给用户发送邮件,即使没有标准输出
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
TIME: 定义出什么时候进行 at 这项任务的时间
HH:MM [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
执行方式:
1)交互式 2)输入重定向 3)at –f 文件
依赖与atd服务, 需要启动才能实现at任务
at 队列存放在/var/spool/at 目录中
通过/etc/at.{allow,deny} 控制用户是否能执行at 任务
先寻找/etc/at.allow 文件,文件用中的使用者才能使用 at,没有在这个文件中的使用者则不能使用 at(即使没有写在at.deny当中)
如果/etc/at.allow 找 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 用 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用用 者则可使用 at 命令。
如果两个文件都不存在有,只有 root用可以使用at 这个命令
周期性计划任务cron
周期性任务计划: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
注释行以 # 开头
详情参见 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分运行echo 命令;
10 21 * * * centos /bin/echo "Howdy!"
时间表示法:
(1) 特定值;
给定时间点有效取值范围内的值(10 21 1-10,20,30 一月的10,20,30号21点10分执行)
(2) *
给定时间点上有效取值范围内的所有值
表示“每…”(*10 每十分钟)
(3) 离散取值:
#,#,#
(4) 连续取值:-
#-#
(5) 在指定时间范围上,定义步长:
/#: # 即为步长(/#10 每十分钟)
例如:每3小时echo 命令;
0 */3 * * * centos /bin/echo "howdy!"
时间格式 系统自定义
@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 * * * *
系统的计划任务
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/脚本
每隔一分钟执行一次目录/etc/cron.hourly里的脚本
anacron系统
运行计算机关机时cron 不运行的任务,CentOS6.0以后版本取消anacron 服务,由crond 服务管理。
假设计算机没有一直开机
对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要
对偶尔要关机的服务器很有用
配置文件:/etc/anacrontab ,负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly 中系统任务。/etc/cron.hourly/ 由/cron.d/0hourly 执行
• 字段1:如果在这些日子里没有运行这些任务……
• 字段2:在重新引导后等待这么多分钟后运行它
• 字段3:任务识别器,在日志文件中标识
• 字段4:要执行的任务
管理临时文件
rhel6.0 使用/etc/cron.daily/tmpwatch 定时清除临时文件。
rhel7.0 使用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
计划任务
用户cron:
crontab命令定义,每个用户都有专用的cron任务文件:
/var/spool/cron/USERNAME
crontab 命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i :同-r 一同使用,以交互式模式移除指定任务
-u user: 仅root 可运行,指定用户管理cron 任务
控制用户执行计划任务 :
/etc/cron.{allow,deny}
一次性作业只用at命令(/var/spool/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 |
没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业
创建一个计划任务:
crontab -e命令会打开一个vim界面,然后按照格式创建计划任务就好
计划任务执行 touch了file文件
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron 任务来讲,% 有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把% 放置于单引号中,也可以不用转义
sleep 命令:
sleep NUMBER[SUFFIX]… 休眠n时间再执行计划任务
SUFFIX:
s: 秒, 默认
m: 分
h: 小时
d: 天
原创文章,作者:旧城以西,如若转载,请注明出处:http://www.178linux.com/48902