程序和进程的关系

程序:保存在硬盘,光盘等介质中可执行代码和数据,文件中静态保存的代码。

进程

在cpu及内存中运行的程序代码,动态执行的代码。进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
父、子进程:每个程序可以创建一个或多个进程,


ps命令:查看进程信息

查看静态的进程统计信息
命令格式:ps aux
a: 显示终端上的所有进程,包括其他用户的进程
u: 表示列出进程的用户。
x: 显示所有终端的进程。
统计进程数量:ps aux | wc -l

psaux.jpg


wcl.jpg


各列的解释
user:进程的用户、PID:进程的ID、%CPU:进程占用的CPU百分比、%MEN:占用内存的百分比、VSZ:该进程使用的虚拟内存量(KB)、RSS:该进程占用的物理内存量(KB)。
TTY:启动进程的终端名,不是从终端启动的进程显示为“?”。CentOS中TTY1代表桌面终端,TTY2-6代表是文字界面的终端。用Ctrl+Alt+F(2-6)切换到字符界面的终端,桌面图形终端ctrl+alt+F1切换回来。用who命令来查看登录的用户信息(pts表示远程登录,tty表示服务器自带的终端)。
STAT:该进程的状态(D:不可中断的休眠状态;R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态。
Z :僵尸进程,进程已经中止,但是部分程序还在内存中)、START:该进程被触发启动时间、TIME:该进程实际使用CPU运行的时间、COMMAND:进程的启动命令

僵尸进程:

一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就有INIT来接管它,成为它的父进程,子进程退出后init会回收占用的相关资源。
但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时进程将会称为一个僵尸进程。

ps -elf:查看静态的进程统计信息

-e: 显示系统内所有进程信息
-l: 使用长格式显示进程信息
-f: 使用完整的格式显示进程信息
-a: 显示所有进程pid
-T: 查看线程信息
ps -aT: 显示所有线程

pself.jpg


elf的字段.jpg


字段各列的解释
F:内核分配给进程的系统标记、S:进程的状态、UID:启动这些进程的用户、PID:进程的进程ID、PPID:父进程的进程号(如果该进程是由另一个进程启动的)、C:进程生命周期中的CPU利用率、PRI:进程的优先级(越大的数字代表越低的优先级)、NI:谦让度值用来参与决定优先级、ADDR:进程的内存地址、SZ:假如进程被换出,所需交换空间的大致大小、WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名、STIME:进程启动时间的系统时间、TTY:进程启动的终端设备、TIME:运行进程需要的累计CPU时间、CMD:进程的启动命令

top命令

查看动态的进程排名信息
命令模式:top
Ctrl+c退出或者q键
第一行是任务队列信息
11:06:28 系统时间、up 1:22 系统已运行时长、1 user 当前登录用户数、load average:0.06,0.60,0.48 系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值
第二行为进程信息
Tasks:总进程数、running:正在运行的进程数、sleeping:休眠的进程数、stopped:中止的进程数、zombie:僵死的进程数
第三行 CPU的信息
us:用户占用、sy:内核占用、ni:优先级调度占用、id:空闲cpu,要了解空闲的cpu百分比,主要看%ID部分、wa:I/O等待占用、hi:硬件中断占用、si:软件中断占用、st:虚拟化占用
第四行为内存的信息
total:总内存空间、free:空闲内存、used:已用内存、buff/cache:物理内存和交换内存的缓冲区总和
第五行为交换空间的信息
total:总交换空间、free:空闲交换空间、used:已用交换空间、avail Mem:可用物理空间
进程信息区各列解释:
PID:进程ID、USER:进程所有的用户名、PR:优先级、NI:谦让度值,负值表示高优先级,正值表示低优先级、VIRT:进程使用的虚拟内存总量,单位KB、RES:进程使用的物理内存大小,单位KB、SHR:共享内存大小,单位KB、S:进程状态、%CPU:上次更新到现在的CPU时间占用百分比、%MEN:进程使用的物理内存百分比、TIME+:进程使用的CPU时间总计,单位1/100秒、COMMAND:命令名/命令行

top常用命令:
P键: 根据CPU使用百分比大小进行排序
M键: 根据驻留内存大小进行排序
N键: 根据启动时间进行排序
c键: 切换显示命令名称和完整命令
h键: 可以获得top程序的在线帮助信息
k键: 根据提示输入指定进程的PID号并按Enter键终止对应的进程
q键: 退出top程序
数字1键: 显示cpu个数和状态
top -H: 显示所有线程
top -H -p <pid>: 显示特定进程中的线程

查看CPU的负载情况load average的方法:uptime、w、top

top.jpg

查看进程信息pgrep

pgrep命令:根据特定条件查询进程PID信息
-l: 显示进程名,缺省时只输出PID号
-U: 指定特定用户
-t: 指定终端
pgrep.jpg


查看进程树pstree

pstree:以树形结构列出进程信息
patree -aup
-a: 显示完整信息
-u: 列出对应用户名
-p: 列出对应PID号
pstreep.jpg


进程的启动方式

手工启动:用户输入命令,直接执行程序
后台启动:在命令行尾加入“&”符号
进程的前后台调度
Ctrl+Z组合键:将当前进程挂起,即调入后台并停止执行

jobs命令

jobs[-l]
查看处于后台的任务列表

fg命令

将后台进程恢复到前台运行,可指定任务序号,终止进程的运行。
Ctrl+C组合键:中断正在执行的命令

kill、killall命令

kill用于终止指定PID号的进程;kill的信号是用-15表示的,是SIGTERM,是要告诉进程你需要被关闭,请自行停止运行并退出
killall用于终止指定名称相关的所有进程,使用这个命令时,输入跟关键字有关的所有进程都会被终止,所有这个命令慎用。
kill -9选项用于强制终止,代表的信号是SIGKILL,表示强制杀死该进程,这个信号不能被捕获也不能被忽略。

pkill命令

根据特定条件终止相应的进程
常用命令选项
-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应进程

调度启动

使用at命令,设置一次性计划任务
命令格式:at [HH:MM] [yyyy-mm-dd]
不指定年月日的时候,默认是设置值的是当天时间,用Ctrl+d键提交任务

at.jpg


使用crontab命令,设置周期性计划任务

按照预先设置的时间周期(分钟、小时、天、月、周)重复执行用户指定的命令操作。
属于周期性计划任务
主要设置文件:全局配置文件,位于文件/etc/crontab
系统默认的设置,位于目录:/etc/cron.*/
用户定义的设置,位于文件:/var/spool/cron/用户名

管理crontab计划任务

编辑计划任务:crontab -e [-u 用户名]
查看计划任务:crontab -l [-u 用户名]
删除计划任务:crontab -r [-u 用户名]
命令格式画图
字段 说明
分钟 取值为从0到59之间的任意整数
小时 取值为从0到23之间的任意整数
日期 取值为从1到31之间的任意整数
月份 取值为从1到12之间的任意整数
星期 取值为从0到7之间的任意整数0或7代表星期日
命令 要执行的命令或程序脚本

时间数值的特殊表示方法
*** 表示该范围内的任意时间
表示间隔的多个不连续时间点
- 表示一个连续的时间范围
/* 指定间隔的时间频率
示例:
(1) 3
: 每小时执行一次;每小时的第3分钟;
(2) 3 4
5:每周执行一次;每周5的4点3分;
(3) 5 6 7
:每月执行一次;每月的7号的6点5分;
(4) 7 8 9 10
:每年执行一次;每年的10月9号8点7分;
(5) 9 8 3,7:每周三和周日的8点9分;
(6) 0 8,20 3,7:每周三、日的8点和20点各执行一次。
(7) 0 9-18 1-5:周一至周五的9点至18点期间每小时执行一次
(8) /5 *:每5分钟执行一次某任务;

系统crond的配置文件:/etc/crontab文件

[root@CentOS6 ~]#cat /etc/crontab     ==# 系统cron的配置文件==
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# 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

注意:
(1) 每一行定义一个周期性任务,共7个字段;
    *  *  *  *  * : 定义周期性时间
    user-name : 运行任务的用户身份
    command to be executed:任务
(2) 此处的环境变量不同于用户登录后获得的环境,因此,建议命令使用绝对路径,或者自定义PATH环境变量;
(3) 执行结果邮件发送给MAILTO指定的用户

crontab.jpg