进程管理
进程的简单了解
进程和程序的区别
程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,是动态概念,有一定的生命期,是动态产生和消亡的。
程序和进程无一一对应关系,一个程序可以由多个时程公用;另一方面,一个进程在活动中有可顺序地执行若干程序。
父子进程的关系
子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程。
在linux系统中,使用系统调用fork创建进程。Fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
父进程终止,子进程自然终止。
前台进程和后台进程
前台进程
在shell提示处打入命令后,创建一个子进程,运行命令,shell等待命令退出,然后返回到对用户给出提示符。这条命令与shell异步运行,即在前台运行,用户在它完成之前不能执行另一个命令,就是说无法进行其他操作。
后台进程
在shell提示处打入命令,后面加上&
,shell创建的子进程运行此命令,但是不等待命令退出,而是直接返回到对用户给出提示。这条命令与shell同步运行,在这个进程进行的同时,我们还可以做其他操作。【后台进程必须是非交互式的】
进程的状态
进程的状态
- 就绪状态
- 运行状态
- 等待状态
进程的状态转换
进程是操作系统为了控制多个程序而创建的数据,操作系统是通过修改进程的状态来完成对相应程序的控制,用户程序的一些操作也可以修改一些进程的状态。
进程三态转换图解析

注意:创建和退出不是进程的状态。创建操作不做重点解释。阻塞也叫等待,和就绪的区别:等待是等待除CPU以外的资源,而就绪等待的是CPU资源。
(1) 创建—–就绪:用户发出命令,我要运行这个程序,然后,操作系统会就会创建进程,并为它分配资源(主要是内存空间),进程创建成功,此时把该进程插入到就绪队列中;
(2) 就绪——执行:对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态;
(进程的就绪状态的意思是,告诉操作系统我现在可以执行了,给我CPU让我运行吧; 操作系统的一个程序给就绪队列中的进程分配一定的时间让他们轮流占用CPU资源,一个就绪进程得到CPU资源后,就变成了运行状态)
(3) 执行——等待:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为等待状态,如进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;
(CPU执行某进程中的指令要求调用某一资源时,且该资源别的进程正在用,那么操作系统的这个程序会把该进程的状态变为阻塞状态,例如:指令要求用打印机,但是打印机正在打印东西,无法现在用,那么,操作系统会修改该进程的状态,并把他由就绪队列变为阻塞队列中)
(4)等待——就绪:处于等待状态的进程,在其等待的事件已经发生,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态;
(循环至正常运行结束,进程中有一些事后处理的指令,会把队列中的记录去掉)
(5)执行——就绪:正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。
进程的五态转换图
【注意】:在进程的五态图中引入了挂起和激活的操作,另外,进程创建时可以先到静止就绪(主要是内存资源不足),其他的和三态图的操作一样。
挂起:把该进程从内存中搬到外存上。
激活:又叫唤醒或恢复,操作是一样的,只是叫法不一样而已,该操作是把外存上的某个进程弄到内存上。
为什么要引入挂起和激活操作呢?
(1) 用户的需要。用户调试一个程序的时候,运行该程序一多半了,但是,忽然发现该程序此时有Bug,用户想停下来修改,但是修改后,用户又不想从头开始运行该程序,此为一因。这样用户就可以先挂起进程,再次运行时,再激活就好啦!
(2) 操作系统的需要。操作系统管理着资源的分配,它无法忍受那些占着资源而不运行的程序,另外,这些进程也会妨碍系统的运行速度,此为一因。
进程管理命令介绍
w查看当前系统信息
w命令,查看当前用户信息(即谁登陆过我的系统),当然也可以查看到系统相关的信息。
作用:查看当前系统活动摘要。
1 | [root@foundation187 ~]# w |
[root@localhost ~]# w root
23:32:01 up 52 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.203.1 22:53 0.00s 0.10s 0.01s w root
1 |
|
-a:显示所有用户的进程(all)
-u:显示用户名和启动时间(user)
-x:显示没有控制终端的进程
-e:显示所有进程,包括没有控制终端的进程
-l:长格式显示
-f 显示进程的子进程
-w:宽行显示,可以使用多个w进行加宽显示
1 | 应用实例: |
[root@foundation187 ~]# ps
PID TTY TIME CMD
1951 pts/0 00:00:00 su
1954 pts/0 00:00:00 bash
2287 pts/0 00:00:00 ps
1 | eg2. -l显示更多信息 |
[root@foundation187 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1951 1916 0 80 0 - 45691 wait pts/0 00:00:00 su
4 S 0 1954 1951 0 80 0 - 29165 wait pts/0 00:00:00 bash
0 R 0 2302 1954 0 80 0 - 30315 - pts/0 00:00:00 ps
1 | eg3. 常用的组合 |
[root@foundation187 ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 50544 4280 ? Ss 21:53 0:00 /usr/lib/systemd/systemd –swit
root 2 0.0 0.0 0 0 ? S 21:53 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 21:53 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 21:53 0:00 [kworker/0:0H]
1 | 看一下上面的选项都指的什么 |
[root@vm1 ~]# ps -o %cpu | sort -nr
1 | * 如果分隔符的空格数是不同的,则不能用`sort -t `分隔符来排序了。这时候可以用awk来辅助。 |
[root@vm1 ~]# ps aux | grep -v % | awk ‘{print $2”:”$3}’ | sort -t “:” -k 2 -rn
1 | * ps -u or -l 查看隶属于自己进程详细信息 |
[root@foundation187 ~]# ps -u
[root@foundation187 ~]# ps -l
1 | * ps -le or -aux 查看所有用户执行的进程的详细信息 |
[root@foundation187 ~]# ps -le
[root@foundation187 ~]# ps -aux
1 | * ps -aux --sort pid 可按进程执行的时间、PID、UID等对进程进行排序 |
[root@foundation187 ~]# ps -aux –sort pid
[root@foundation187 ~]# ps -aux –sort uid
1 | * ps -le | grep init 查看指定进程信息 |
[root@foundation187 ~]# ps -le | grep init
1 |
|
B 控制正在被执行的进程,是否被粗显。
b 控制正在被执行的程序,是否反白显示
P 按CPU的使用排序(默认情况下是这样子的)
M 按内存的使用排序
U u 都是按用户进行过滤
k 杀死一个进程 会提示你输入进程号
r 给进程重新指定优先级
W 保存对top命令显示的样式的设置,将当前设置写入~/.toprc文件中
s 改变刷新的时间间隔
q 退出top命令
h or ? 获得帮助
1 | ### htop(类似top) |
[root@vm1 ~]# ps -le | grep top #查看top的优先级NI为0
4 S 0 1175 1166 0 80 0 - 3753 poll_s pts/1 00:00:00 top
[root@vm1 ~]# renice -5 1175 #查看top的进程号为1175,在这里将它的优先级修改为-5
1175: old priority 0, new priority -5
[root@vm1 ~]# ps -le | grep top #再次查看,已经改为-5
4 S 0 1175 1166 0 75 -5 - 3753 poll_s pts/1 00:00:00 top
1 |
|
kill -1 进程pid ##进程重读配置
-2 进程pid ##撤销录入内存中的数据
-3 进程pid ##撤销内存中的鼠标显示
-9 进程pid ##强制关闭进程
-15 进程pid ##正常关闭进程
-18 进程pid ##激活休眠的进程
-19 进程pid ##使进程休眠
-20 进程pid ##使占用终端的进程进入后台休眠
1 | #### 其他 |
killall -1 进程名称
-2
-3
-9
-15
-18
-19
-20
1 |
|
pgrep [服务名称]
pgrep httpd
1 |
|
pkill [进程名称]
pkill httpd
1 | ### fg,bg(前后台运行,终止与挂起) |
[root@vm1 ~]# cat #ctrl + z 把进程打入后台运行,并停止或者说挂起。进程的状态是Stopped
^Z
[2]+ Stopped cat
[root@vm1 ~]# sleep 1000 & #&释放终端 让进程在后台运行,状态是Running(类似与bg
)
[1] 6344
[root@vm1 ~]# jobs #Jobs 查看当前终端的进程
[1]- Running sleep 1000 &
[2]+ Stopped cat
1 | `[ ]`里的号码就是进程在当前终端的序号 |
[root@vm1 ~]# fg 1 #使进程1在前台运行
sleep 1000
[root@vm1 ~]# bg 2 #使进程2在后台运行
[2]+ cat &
1 |
|
[root@vm1 mnt]# nohup find / -name init* > /mnt/file &
[1] 6377
1 | 如果我们没指定/mnt/file这个保存位置的话,系统默认会把查询的结果放到nohup.out的文件中。我们一般不会去使用默认方式保存。 |
at 安排作业在某一时刻执行一次
batch 安排作业在系统负载不重时执行一次
crontab 安排周期性运行的作业
1 | * 一次性计划at和batch |
midnight noon teatime
hh:mm [today]
hh:mm tomorrow
hh:mm 星期
hh:mm MM/DD/YY
1 | 相对计时方法: |
用法:
指定在今天下午17:30执行某命令(假设现在时间是下午14:30,2016年2月2日)
命令格式:
1 | at 5:30pm |
[root@vm1 ~]# at now+5 minutes
at>touch /mnt/file
at> #可以继续写其它的计划
at> <EOT> # ctrl+d保存计划并退出
job 2 at 2012-05-20 13:43
1 | 是否还担心我们的计划是否启动,通过下面两个命令查看at进程是否正常启动 |
[root@vm1 ~]# at -l
[root@vm1 ~]# atq
如果真的没有启动的话,可以通过手工方式重新启动一下
[root@vm1 ~]# /etc/init.d/atd start
1 | * 删除at计划任务 |
[root@vm1 ~]# at -d
1 | * 查看at计划任务 |
[root@vm1 ~]# ls /var/spool/at/
1 | batch命令 |
分钟 小时 天 月 星期 命令/脚本
1 | eg1.我们每天早上4点要做一下操作,以下面方式表示: |
[root@vm1 ~]# cd /var/spool/cron
[root@vm1 ~]# ls
root
[root@vm1 ~]# cat root
30 17 * * 1-5 /usr/bin/shudown -h now 计划任务
```