如何产生一个进程:
- 执行程序或者是命令
- 计划任务
如何终止一个进程:
- 程序或者是命令执行完毕,自动终止
- 强制终止进程
进程管理
一.程序和进程的关系
程序:通常为二进制文件,存放在硬盘介质中,是可执行的代码和数据
进程:程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符(PID),进程就是正在运行中的程序。
父子进程:进程创建的进程为子进程
fork and exec 进程呼叫的流程:
1、系统先以fork的方式复制一个与父进程相同的暂存进程,这个进程与父进程唯一的区别就是PID不同,并增加一个PPID(父进程ID)
2、暂存进程以exec的方式加载实际要执行的程序,变成新进程。
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户的各项任务,被称为服务(daemon)。
大致分为两类:
- 系统本身所需要的服务:crond、atd、rsyslogd等
- 负责网络的服务:named、postfix等,会启动一个端口,供外部客户端连接
1.静态查看进程的统计信息;
(1)ps:
-a:显示终端下所有进程信息,包括其他用户的进程
-u:显示进程的拥有者
-x:显示当前用户所在终端下的进程信息,和a一起用,显示所有进程
-e:显示系统内所有进程信息
-l:长格式显示
-f:完整的格式显示
其中
UID:进程的拥有者
PID:进程号
PPID:父进程号
C:cpu使用的资源百分比
STIME: 开始时间
TTY: 运行进程的终端名字
TIME:进程运行的时间
CMD:命令
其中
USER:拥有者
PID:进程号
%CPU:占用cpu百分比
%MEM:占用内存百分比
VSZ:占用的虚拟内存的大小
RSS:驻留内存大小
TTY:终端
STAT:进程状态
R:该进程正在运行
S:休眠进程sleep,可以被唤醒
D:不可被唤醒的睡眠状态
Z:僵尸进程,实际上该进程已经终止,但是却无法移除到内存之外
T:该进程正在跟踪或者已经停止
START:开始时间
TIME:运行时间
COMMAND:命令
(2)pstree:树形结构查看进程信息
-a:显示完整信息
-u:列出名字
-p:列出PID号
二、动态查看进程
top
:实时查看系统运行状态 h
帮助 M
按照内存使用排序 P
按照CPU排序 N
按照PID来排序 q
退出
top - 21:58:51 up 40 min, 1 user, load average: 0.22, 0.20, 0.27
系统时间 运行时长 当前1个用户登录系统 系统在1分钟、5分钟、15分钟的平均负载情况
Tasks: 276 total, 3 running, 273 sleeping, 0 stopped, 0 zombie
总共276个进程 3个正在运行 273个休眠 0个停止的 0个僵尸进程
%Cpu(s): 5.3 us, 1.3 sy, 0.0 ni, 93.0 id, 0.0 wa, 0.4 hi, 0.1 si, 0.0 st
us 用户空间占用CPU百分比
sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比 ,要特别注意,代表的是I/O情况
hi 硬中断(Hardware IRQ)占用CPU的百分比
si 软中断(Software Interrupts)占用CPU的百分比
st (Steal time) 是当 hypervisor 服务另一个虚拟处理器的时候,虚拟 CPU 等待实
际 CPU 的时间的百分比
多核CPU的话,按数字1,可以展开其他CPU情况
MiB Mem : 3752.0 total, 142.5 free, 2845.8 used, 763.7 buff/cache
total 物理内存总量
used 使用的物理内存总量
free 空闲内存总量
buffers 用作内核缓存的内存量
MiB Swap: 4044.0 total, 4031.4 free, 12.6 used. 649.4 avail Mem
total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
cached 缓冲的交换区总量。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2339 git 20 0 1385468 759240 22808 S 4.9 19.8 2:23.10 bundle
2246 git 20 0 374192 73276 9300 S 2.1 1.9 0:36.68 gitlab-exporter
2453 gitlab-+ 20 0 1069208 32076 26068 S 1.8 0.8 0:20.10 postgres
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
PRI 进程优先权,代表这个进程可被执行的优先级,其值越小,优先级就越高,越早被执行
NI 进程Nice值,代表这个进程的优先值
%nice 改变过优先级的进程的占用CPU的百分比
按f
键可以编辑显示的列
1.仅动态查看某个进程的状态:top -p 2253 #其中2253是进程号
2.top动态查看进程:
-P:顺序查看
3.pgrep:查看进程pid
-l:显示进程名
-U:指定用户
-t:指定终端
三、进程的调度
1、前台运行:
直接在终端运行命令,会发现该程序一直占用终端,其他命令不能够再在这个终端运行
2、后台运行
1)命令执行的时候,直接将其放置与后台运行
2)对于一个已经运行的命令,ctrl+z
将前台进程放置于后台,但是该进程在后台是停止的状态
jobs
:查看后台进程运行状态
fg 1:激活后台进程
bg 任务编号 :指定任务在后台运行
fg 任务编号 : 将后台运行的命令变成前台运行
注意:不管你是前台运行,还是后台运行,只要终端一关闭,进程就停止了。
使用nohup
命令可以让命令或者程序脱离终端
中断进程
IPC:Interconnect Process Communication 进程间通信
进程间通信的四种方式:
1、管道 pipe
2、信号 signal
3、消息 message
4、共享内存 shared memor
信号是类unix系统中的一种通信机制,它用来中断运行的进程执行某些操作
常用的信号:
查看信号的列表:kill -l
1) SIGHUP:重置进程的配置,即不停止服务的情况下,重新读取配置文件
kill -1 PID 或者kill -HUP PID
2) SIGINT:中断(interrupt),相当于执行了ctrl+c
kill -2 PID
9) SIGKILL:强制杀死进程、无条件杀死
kill -9 PID
15) SIGTERM:终止进程,进程不一定会死
kill -15 PID
20) SIGTSTP:相当于按下ctrl+z的时候发送的信号
kill -20 PID
pkill:按照进程的属性结束进程
按照进程名字杀死进程
killall:
killall 命令名字 #杀死全部的同名进程
xkill:杀死图形化资源
当执行了xkill之后,鼠标会变成“x”形,点到任何图形资源,就会终止该资源的运行
谦让值:nice
作用:
指定或者调整用户进程的nice值
nice值越高,该进程抢占资源的能力越弱
nice值越低,该进程抢占资源的能力越强
范围:-20~19
nice:运行时直接设置nice值
格式:nice -n 数字 command
renice:对于已经运行的,调整nice值
格式:renice 数字 PID
nice越大,获得的资源越少,反之则反。
例:
在程序执行时,直接指定nice值:nice -n 7 ./loop.sh &
使用renice调整运行中的进程的nice值:renice 19 8890
进程的调度:
ctrl+Z:转入后台并且停止
jobs:查看处于后台的任务
fg:将后台的进程恢复前台运行,可指定任务号
ctrl+c:中断正在执行的命令
kill:终止PID -9 强制终止
pkill:根据 特定条件终止进程
-t:停止终端进程
-U:按用户名终止进程
计划任务
at: 一次性计划任务
at: 一次性计划任务
at [HH:MM] [yy-mm-dd]
>command
>(ctrl+d)
atq:查看任务
atrm:删除任务 后边指定要删除的任务号 atrm 1
时间格式也可以:now + count time-units(minutes,hours,days,weeks)
crontab 周期性计划任务
crontab命令----crond服务
全局设定的配置文件:/etc/crontab
系统默认的设置:/etc/cron.*
用户自定义的配置文件:/var/spool/cron/user_name
编辑任务:crontab -e [-u user_name]
查看任务:crontab -l [-u user_name]
删除任务:crontab -r [-u user_name]
注:省略用户表表示操作当前用户的crontab
编辑任务时可以使用的操作符:
* 取值范围内的所有数字
/ 每过多少个数字
- 从X到Z
,散列数字
例:
* * * * * echo "test is a test" > testfile
分 时 月 日 周 命令/脚本