进程管理
简介:
Linux是一个多用户多任务的操作系统,系统上可以同时运行多个进程。
程序:程序是静态的,是完成某些功能的代码的集合
进程:进程是动态的,是程序运行之后,在内存中的状态,运行的程序会产生一个或多个进程
如何产生一个进程?
- 运行程序或者执行命令
- 计划任务
归根结底,运行程序就会产生进程
如何终止一个进程?
- 程序或命令执行完成,自动终止
- 强制终止进程(杀进程)
查看进程号
cd /proc/
在该目录下蓝色数字的目录,都是进程号(PID)
一.进程查看
- 进程的查看:
process
- 静态查看:
ps **** 、pstree
- 动态查看:
top ****
-
列出PID:
ls /proc/
init
进程号为1
(一)、静态查看进程
1、ps 是监视系统进程的主要工具,显示的是瞬时的进程状况
ps 显示当前被运行的进程
第一组:
ps -elf
-e:显示所有进程
-f:全格式显示
-l:长格式显示
-
例1:
-
ps -e PID TTY TIME CMD 1 ? 00:00:02 init PID:process id ,进程的id号 TTY:由哪个终端产生的进程 TIME:运行的时间
-
-
例2:
-
ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:43 ? 00:00:02 /sbin/init UID:进程所有者的ID号 PPID: 父进程号
-
-
例3:
-
ps -el PRI:优先级 NI:进程的nice值 优先级是内核的功能,用户没有权力修改;用只能通过nice去影响优先级
第二组:
ps aux 更多是想看优先级 a:显示所有进程(包含其他用户进程),默认只显示当前终端下进程 u:显示进程的所有者 x:一般和a一起使用,显示所有进程(包含无控制终端的进程) ps aux 更多的是想查看cpu、mem(内存)使用率 TTY为?的进程
例如:
/etc/init.d/httpd start Starting httpd: [ OK ] ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 06:45 ? 00:00:02 /sbin/init 进程号 父进程号
更多用法:
ps -ef | grep httpd //查看httpd服务是否在运行 ps -ef | grep httpd | grep -v grep //-v:取反,打印不包含某个关键字的行 ps aux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ps aux | grep httpd STAT:进程状态 R:正在运行的进程 S:休眠进程 Z:僵尸进程 zombie 实际上该进程已经终止,但是它的父进程却无法正常终止它,造成僵尸进程的状态 D:不可中断的睡眠 T:停止 VSZ:虚拟内存集 RSS:常驻内存集
2、pstree:以树型显示正在运行的进程 不常用
好处:个进程间的关系一目了然
pstree #init进程是所有进程的父进程。 -a:显示完整信息 -u:列出名字 -p:列出PID号
(二)、动态查看进程
top 实时查看系统运行状态
top
-
top - 15:05:06 up 8:19, 4 users, load average: 0.00, 0.00, 0.00
系统时间 运行时长 几个登录用户 系统在1分钟、5分钟、15分钟的平均负载情况
Tasks: 160 total, 2 running, 158 sleeping, 0 stopped, 0 zombie //对进程的概括
总进程数 正在运行的 休眠的进程 停止的进程 僵尸进程
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.3%si,
按数字1,展开CPU,可以用于查看有几个CPU。
Mem: 1016516k total, 903140k used, 113376k free, 83324k buffer
Swap: 4181384k total, 8k used, 4181376k free, 419480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
top:
交互式命令
l: 是否显示平均负载和启动时间
t: 是否显示进程和CPU状态相关信息
m: 是否显示内存相关信息
M: 根据驻留内存大小进行排序
P:根据CPU使用百分比进行排序
T: 根据累计时间进行排序
c: 是否显示完整的命令行信息
q: 退出top
k: 终止某个进程
top:选项
-d: 指定延迟时长,单位是秒,默认是3秒
-b: 批模式,基本不会用
-n 数字:在批模式下,共显示多少批
**仅动态查看某个进程的状态(必须记住的): **
top -p 2597 //-p 进程号,动态查看某一个进程
# 二.进程的管理
**进程间通信的方式三种:**
1. 信号 signal
2. 消息 message
3. 共享内存 shared memory
信号是类Unix系统中的一种通信机制,它用来中断运行的进程执行某些操作。
## (一)、kill
### 1、查看信号列表
kill -l (字母l)
### 2、常用的信号
* 1) SIGHUP :重读进程的配置,即不停止服务的情况下,重新读取配置文件
* `kill -1 PID 或 kill -SIGHUP PID`
* 2) SIGINT:中断(interrupt),相当于ctrl + c
* 第一个标签:`firefox 172.16.254.210`
* 另一个标签:
* ```bash
ps -ef | grep fire
root 7839 4203 2 15:56 pts/3 00:00:01 /usr/lib64/firefox/firefox 172.16.254.210
root 7858 7839 0 15:56 pts/3 00:00:00 [firefox] <defunct>
root 7899 3222 0 15:57 pts/1 00:00:00 grep fire
kill -2 7839
* 第一个标签:
发现该标签中的命令被终止了
-
3) SIGKILL:强制杀死进程,必死
-
firefox 172.16.254.210 ps -ef | grep firefox root 7952 4203 4 16:01 pts/3 00:00:01 /usr/lib64/firefox/firefox 172.16.254.210 root 7995 3188 0 16:01 pts/0 00:00:00 grep firefox
-
-
4) SIGTERM:终止进程,进程不一定会死
- 18)启动进程
- 19)停止进程
-
5) SIGTSTP:相当于ctrl + z,切换到后台停止进程
- 第一个标签:
firefox 172.16.254.210
-
第二个标签:
-
ps -ef | grep firefox root 8027 4203 4 16:05 pts/3 00:00:01 /usr/lib64/firefox/firefox 172.16.254.210 root 8073 3222 0 16:06 pts/1 00:00:00 grep firefox kill -20 8027
- 第一个标签:
-
firefox 172.16.254.210 [1]+ Stopped firefox 172.16.254.210
- 执行top时侯,可以看到一个stopped的进程。
-
(二)、pkill 按照进程的属性结束进程
pkill -kill -t tty2
1、按照进程名字杀死进程
ps -ef | grep httpd pkill httpd 会杀死所有该进程名的进程
2、按照用户名杀死进程 -U(杀死前台的)
例:
pkill -U apache 杀掉所有者为apache的进程
第一个标签
su - quota1 vim /etc/passwd
第二个标签
pkill -U quota1
第一个标签
vim /etc/passwd Vim: Caught deadly signal TERM Vim: Finished. pgrep:可以获取包含某个关键字的进程的pid # /etc/init.d/httpd start # kill -9 `pgrep httpd`
killall: killall 命令名 //杀死全部的同名进程 # /etc/init.d/httpd start # killall httpd
xkill:杀死图形化资源 # xkill 点哪哪死
三.进程的后台运行
1、前台运行
直接在终端运行命令
firefox 172.16.254.210
会发现该程序一直占用着终端,其他命令不能够使用该终端运行
2、后台运行
1)命令执行的时候,直接将其放置于后台
firefox 172.16.254.210 &
会发现后台运行的程序不会占用执行命令的终端,用户仍然可以使用该终端执行命令
2)对于一个已经运行的进程,如何将其放置于后台? (可能出面试,分两步走)
kill -9 10104 firefox 172.16.254.210 #按下ctrl + z,将进程放置于后台,但是进程是停止的状态 ^Z [2]+ Stopped firefox 172.16.254.210 bg 2 #激活后台进程 background:后台 [2]+ firefox 172.16.254.210 & jobs #查看后台进程的 [2]+ Running firefox 172.16.254.210 & # ==================================== # bg 任务编号:激活后台进程 # fg 任务编号:将后台运行的进程调到前台来运行 foreground:前台 # fg 2 # firefox 172.16.254.210
注意:不管你是前台运行,还是后台运行,只要终端一关闭,进程就停止了。
那么如何让一个命令或者程序执行脱离终端? (面试题)
使用nohup。
nohup firefox 172.16.254.210 & nohup: ignoring input and appending output to `nohup.out` #正常现象,按回车。 ls nohup.out nohup.out
四.进程优先级
- 第一个标签:
-
-40-----99 数字越小,优先级越高
- 60----99:用户控制
- -40----59:内核控制
进程的nice值 PRI-NI(nice)=值是一定的
-
nice:谦让值
- 作用:指定或调整用户进程的nice值
- nice值越高,该进程抢占资源的能力越弱
-
nice值越低,该进程抢占资源的能力越强
1、相关命令
-
nice:运行时直接设置nice值
- 格式:
nice -n 数字 command
- 格式:
-
renice: 对于已经运行的,调整nice值
- 格式:
renice 数字 PID
- 格式:
-
nice值的范围:-20 ~ 19
2、例子
vim loop.sh #添加如下内容: #!/bin/bash while true do echo hello > /dev/null done chmod +x loop.sh cp -p loop.sh loop1.sh #-p:带属性拷贝(比如:权限、所有者、所属组等等) ll loop* -rwxr-xr-x 1 root root 52 Aug 12 10:40 loop1.sh -rwxr-xr-x 1 root root 52 Aug 12 10:40 loop.sh
1)在运行程序时,直接指定nice值
nice -n 7 ./loop.sh & [1] 10818 nice -n 14 ./loop1.sh & [2] 10822 top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 10818 root 27 7 103m 1192 1028 R 80.0 0.1 1:10.38 loop.sh 10822 root 34 14 103m 1192 1028 R 16.6 0.1 0:12.99 loop1.sh
从上述实验看出,nice越大,抢占资源越少。
2)使用renice调整运行中的进程的nice值
说普通用户调整进程的nice值,只能往高调,抢占资源能力变弱。
renice 19 10818 10818: old priority 7, new priority 19 top killall loop.sh
### 3)进程调度
* ctrl+Z:转入后台并且停止
* jobs:查看处于后台的任务离别
* fg:将后台的进程恢复前台运行,可指定任务号
* ctrl+c:中断正在执行的命令
* kill:终止PID -9 强制终止
* pkill:根据 特定条件终止进程
* -t:停止终端进程
* -U:按用户名终止进程
----
> **如果你发现一个进程占用资源非常多,怎么办?**
>
> * 1)如果进程是你的,将其nice值调高,让其他进程优先运行。
> * 2)如果进程不是你的,可以将其杀死。
----
Comments NOTHING