linux 进程管理
一、简述
进程是加载到内存中的指令集,进程有进程ID加以标示。在Linux内核中,进程是由task_struct结构表示和管理的。每执行一个程序都会调用父进程init的fork系统调用创建一个子进程。
1,进程分类:
(1)不同模式运行
内核模式 (ring0)
用户模式 (ring 3)
进程有时会访问外部的硬件资源或者特权资源,此时就会产生系统调用(system call)
转入内核模式来完成,完成后返回到用户模式
(2) 以占用资源的多少
CPU-Bound: CPU密集型,这种进程更多的消耗CPU,对I/O占用量不是太大
I/O-Bound: I/O密集型,这种进程占用I/O很多,对CPU消耗不大
(3) 进程处理方式
批处理进程:主要工作于后台,比较占用CPU
交互式进程: 占用I/O比较多
实时进程: 内核进程或内核线程,通常优先非常高,需要被立即执行或分配
2, 进程优先级
(1) 实时优先级 :0 至 99,数字越大,优先级越高
(2) 静态优先级 :100 至 139, 数字越小,优先级越高
可以使用nice值来调整静态优先级,nice值的取值范围是-20至19,分别对应是100至139,nice默认值为0。
(3) 动态优先级:由内核动态维护,动态调整
3,进程状态
动行态:runing
睡眠态:sleeping
可中断睡眠:interruptable
不中断睡眠:uninterruptable
停止态:stopped ,不会再被内核调度并运行
僵死态:zombie
4,进程间通信:IPC ( InterProcess Communication )
同一主机:
signal : 信号
shm : 共享内存
semerphor : 旗语
不同主机:
RPC : Remot Procedure Calling (远程过程调用)
socket : 套接字 (IP :port)
5,线程
比进程更小的可以被单独调度的单位
thread : 轻量级进程 (LWP, light weight process)
二、Linux进程管理工具
1,pstree命令 查看进程数
2,ps命令 :显示进程状态的命令,快照式一次性
支持两种风格: Sysv, BSD
常用选项:
a: 与终端相关的进程
x: 与终端无关的进程
u: 显示动行进程的用户
常用组合(1): ps aux
注意:不要加 -
# 说明上图中各个字段的含义 # USER 运行此进程的用户名 # PID 该process的号码 # %CPU 进程运行时所占的cpu百分比 # %MEM 该process所占用的物理内存百分比 # VSZ 显示占用的线性地址空间的大小(包含其它共享的共享库所占据的空间) # RSS 常驻内存集,不可以被交换出去的空间 # TTY 用来表示终端 显示为“?”的说明是与终端无关的进程 # STAT 该进程目前的状态 # START 该 process 被触发启动的时间; # TIME 该 process 实际使用 CPU 运作的时间。 # COMMAND 包含在中括号中的进程表示为内核进程
STAT常用的状态有: R (正在运行或在运行队列中等待) S 该程序目前正在睡眠当中 ,但可被某些讯号 (signal) 唤醒。 T 该程序目前暂停了 Z 该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态 D 不可中断状态. < 高优先级的 N 低优先级的 s 包含子进程 l 多线程 + 前台程序
常用组合(2): ps -ef
-e : 显示所有进程
-f : 显示完整格式的信息
# PPID 父进程的PID
常用组合(3) : ps -eFH
-F : 显示额外信息
-H : 显示进程的层次结构
PSR: 表示进程运行在哪颗CPU上
自定义要显示的信息 : -o
# ps axo pid,ppid,ni,pri,cmd
3,pgrep 按预定义模式查找进程
-U UID : 仅显示由指定用户启动的进程
-G GID : 仅显示与指定组相关的进程
-t term... : 仅显示与指定终端相关的进程
-l :同时显示进程号和程序名
例如:
# pgrep -U root -G root -l
搜索全部属于root用户也要属于root组的进程,打印进PID和程序名
4,pidof 按确切的进程名查找
# pidof httpd 1954 1953 1952 1951 1950 1949 1948 1947 1944
5,top 动态查看进程
# top
快捷键:
l : 显示或不显示负载信息 (同uptime命令)
02:08:17 up 8:20, 2 users, load average: 0.00, 0.00, 0.00
2:08:17 : 当前时间 up 8 min : 系统运行时间,格式为时:分 2 users : 当前登录用户数 load average: 0.00, 0.00, 0.00 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
t : 显示或不显示进程及CPU相关的信息
Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Tasks: 107 total 进程总数 running 正在运行的进程数 sleeping 睡眠的进程数 stopped 停止的进程数 zombie 僵尸进程数
Cpu(s): 0.0% us : 系统用户进程使用CPU百分比。 不包括调高优先级的进程。 CPU%是由每个核的CPU占用律之和算出来的。如果你是4核CPU,核1,CPU使用率为100%,核2,CPU使用率为100%。 则会出会CPU 高于100%的现象,最终为200% sy : 内核中的进程占用CPU百分比 ni : 用户进程空间内改变过优先级的进程占用CPU百分比 id : 空闲CPU百分比 wa:用于等待I/O所占的cpu百分比 hi:硬中断所占cpu百分比 si:软中断所占cpu百分比 st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu
1: 数字,分别显示各CPU的相关信息
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
m : 显示不显示物理内存和交换分区的相庆信息 (同 free 命令)
Mem: 1012352k total, 419900k used, 592452k free, 47116k buffers Swap: 1023992k total, 0k used, 1023992k free, 277116k cached
Mem : total 物理内存总量 used 使用的物理内存总量 free 空闲内存总量 Swap : total 交换分区总大小 used 使用的交换的大小 free 未使用的交换的大小 buffers 缓冲 (加速写) cached 缓存(加速读)
q : 退出
k : 终止指定进程
s : 修改刷新新时间间隔
常用选项
-d # : 指定刷新时间间隔 -b : 以批次的方式显示top的刷新 -n # : 显示的批次
6, htop
htop是top的升级版,在EPEP源来安装,无论是在功能上还是在界面显示上,都比top命令更胜一筹
# htop [options]
常用选项:
u : 交互式选择显示指定用户的进程 l : 显示光标所在进程所打开的文件列表 s : 显示光标所在进程执行的系统调用 a : 绑定进程到指定的CPU # : 快速定位光标PID为#的进程上 F1: 获取帮助
7,vmstat 报告虚拟内存统计信息。
常用用法:
# vmstat 默认以1秒刷新一次,一直显示
# vmstat -n 3 以3秒钟刷新一次,一直显示
# vmstat -n 2 5 以2秒钟刷新一次,刷新5次
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 590080 47652 277284 0 0 4 2 9 8 0 0 100 0 0 0 0 0 589948 47652 277312 0 0 0 0 42 30 0 1 100 0 0
看看每个字段的意思:
procs :
r : 运行队列的长度
b : 被阻塞(等待IO完成)队列的长度
memory:
swpd : 从物理内存交换至swap中的数据量
free : 空闲物理内存
buff : 缓冲 (加速写)
cache : 缓存(加速读)
swap:
si : swap in 数据进入 swap中的数据速率 ,kb/s
so : swap out 数据离开swap中的数据速率 , kb/s
io:
bi : block in , 从块设备读入的数据速率 ,kb/s
bo : block out, 保存至块设备的数据速率 , kb/s
system:
in : interrupt , 中断速率
cs : context switch ,上下文(进程)切换速率
cpu: us, sy, id, wa, st (同上面)
选项:
vmstat -s : 显示内存统计数据
7,kill,killall
进程间通信的方式之一就是通过发送信号(signal),那么就可以使用kill,killall来发送信号
显示常用信号:
# kill -l
# man 7 signal
[root@www ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1 11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM 16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP 21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR 31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8 43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12 53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2 63) SIGRTMAX-164) SIGRTMAX
每个信号都可以使用三种方式之一在kill进行调用
数字代称:1,2,9,15
信号完整名称:SIGHUP,SIGINT,SIGKILL,SIGTERM
信号简称:HUP,INT,KILL,TERM
1) SIGHUP : 让程序重读配置文件而无须重起启动;
2) SIGINT : interrupt, 相当于 Ctrl + c 打断正在运行中的程序
9) SIGKILL : 直接终止进程
15) SIGTERM : 优雅的关闭默认是这种情况
kill ,killall 语法
# kill [-SIGNAL] PID
kill默认发的信号是15
# killall [-SIGNAL] COMMAND
终止所有一类进程
例如:# killall httpd
8,nice , renice 调整进程的优先级
nice值 -20 ~ 19 越小优先级越高 普通用户0-19
(1) 直接启动一个进程,并指定其Nice值:
语法 :nice -n # COMMAND
例如:
[root@www ~]# nice -n -5 vim /etc/issue [root@www ~]# ps axo pid,pri,ni,command | grep vim 3249 19 0 vim /etc/yum.repos.d/Base.repo 3741 24 -5 vim /etc/issue
(2) 修改正在运行的进程的优先级
语法: renice -n # -p PID
例如:# renice -n 3 3772
[root@www ~]# ps axo pid,pri,ni,command | grep vim 3249 19 0 vim /etc/yum.repos.d/Base.repo 3772 24 -5 vim /etc/issue 3774 19 0 grep vim [root@www ~]# renice -n 3 3772 3772: old priority -5, new priority 3 [root@www ~]# ps axo pid,pri,ni,command | grep vim 3249 19 0 vim /etc/yum.repos.d/Base.repo 3772 16 3 vim /etc/issue
9,jobs bg fg - Linux作业控制
前台作业:通过终端启动,并在终止之前一直占据着终端
后台作业:作业启动之后即运行于后台,释放前台
交互式模式:手动启动的非守护进程类的程序, 一般都运行于前台
如何将作业运行于后台:
(1) 运行中的作业:
Ctrl + z : 送往后台后,作业将会被停止(STOPPED 状态)
例如:
[root@www ~]# vim /etc/inittab [1]+ Stopped vim /etc/inittab [root@www ~]# ps axu | grep "vim /etc/inittab" root 3809 0.0 0.3 143696 3836 pts/2 T 04:03 0:00 vim /etc/inittab
(2) 尚未启动作业:
COMMAND &
此类由手动方式控制的作业,与终端相关作业会被终止:如果把作业送往后台, 且与终端无关:
# nohup COMMAND &
查看作业号:
# jobs
[root@www ~]# jobs [1]+ Stopped vim /etc/fstab
作业控制命令:
# fg [[%]JOBNUM] : 将指定的作业调回前台
# bg [[%]JOBNUM] : 让送往后台的作业在后台继续运行
# kill %JOBNUM : 终止指定的作业
例如:
# 将指定的作业调回前台: [root@www ~]# jobs [1]+ Stopped vim /etc/inittab [root@www ~]# fg 1
# 让送往后台的作业在后台继续运行 [root@www ~]# tar jcf /tmp/etc.tar.gz /etc tar: Removing leading `/‘ from member names ^Z [1]+ Stopped tar jcf /tmp/etc.tar.gz /etc [root@www ~]# jobs [1]+ Stopped tar jcf /tmp/etc.tar.gz /etc [root@www ~]# bg 1 [1]+ tar jcf /tmp/etc.tar.gz /etc & [1]+ Done tar jcf /tmp/etc.tar.gz /etc
三、实战:screen后台实时执行命令备份命令
1 安装screen包 [root@xuegod63 ~]# rpm -ivh /mnt/Packages/screen-4.0.3-16.el6.x86_64.rpm 2 直接在命令行键入screen命令 3 [root@xuegod63 tmp]# vim 1.sh 命令模式按ctrl+a+d,出现[detached] 即可,再关闭pst 4 重新打开一个pst窗口执行 [root@xuegod63 ~]# screen -ls There is a screen on: 2330.pts-0.xuegod63 (Detached) 1 Socket in /var/run/screen/S-root. 5 [root@xuegod63 ~]# screen -r 2330 #就可以继续进行原来的进程
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。