• 1. Unix/Linux系统 主讲教师:王宇宾 学时:36
  • 2. 第5章 进程管理
  • 3. 5.1 进程概述程序是磁盘文件,进程则是内存中工作着的代码,或者说是“运行着的程序”。 Linux允许同时运行多个程序,每个程序都被分配了一个唯一的标号,称为“进程号(Process ID)”。 Linux中就靠进程号来唯一的区分一个进程。
  • 4. 5.1.2 进程间的关系Linux是通过复制机制来产生进程的。被复制的进程就是复制产生的进程的父进程。 Init是众进程之父,由init产生shell。 Shell同样能够产生子shell进程。用户可以使用shell子进程。 每个进程都记录了父进程和子进程的ID,这样在这个进程结束之后就退回到父进程,并返回一个状态码。
  • 5. 5.1.2 进程间的关系每个进程都记录了父进程和子进程的ID。 每个进程由父进程创建,结束时释放所有资源并回到父进程,同时返回一个状态码。 父进程负责处理子进程结束后的善后事宜,并收集子进程的返回值。
  • 6. 5.1.3 多进程Linux是一个多用户多任务的操作系统。 Linux采用“分时”来提供多用户的支持。同一时刻实际上只有一个进程处于运行状态,但看起来就好像多个进程在同时运行一样。
  • 7. 5.2 进程的类型前台进程和后台进程 前台进程就是一个程序控制着标准输入输出。程序执行时,shell被暂时挂起,程序执行完毕之后退回到shell。 后台进程则是指一个程序运行时并不接收标准输入,也不做标准输出。 一般系统服务都以后台进程的方式存在,且都是开机就被加载。通常也称为Daemon(守护进程)。如HTTP服务的守护进程httpd
  • 8. 5.3 进程控制命令使用ps显示当前进程 格式: ps [选项] ps命令的选项很多,最常用的是-aux,即 ps -aux -aux参数可以查看当前运行的所有进程,以及CPU、内存的使用情况等。
  • 9. Ps命令的选项-a:显示终端上的所有进程,包括其他用户的进程。 -u:打印用户格式,显示用户名和起始时间。 -x: 显示没有控制终端的进程。 -e:显示所有进程。 -f:全格式。 -h:不显示标题。 -l:给出长列表。 -r:只显示正在运行的进程。 -txx:只显示受tty.xx控制的进程。 -j:按作业格式输出。 -v:按虚拟存储器格式显示输出。 -m:显示存储器信息。 -S:增加子CPU时间和页面出错。 -w:用宽格式显示,不截取命令行,使它成为一行
  • 10. ps -auxUSER:进程所有者的用户名 PID:该进程的进程号 %CPU:占用CPU的百分比 %MEM:占用内存的百分比 VSZ:使用的虚拟内存大小,单位KB RSS:驻留空间的大小,单位KB TTY 进程相关的终端 STAT:进程状态 START:进程开始运行的时刻 TIME:进程使用的总CPU时间 COMMAND:被执行的命令行
  • 11. 进程状态R:运行或准备运行 S:自愿睡眠,例如httpd由于暂时无事可做而主动选择睡眠。 D:非自愿睡眠,主例如多个进程之间由于竞争资源而被动选择睡眠。 Z:僵尸进程。进程退出并释放资源和其父进程收集返回值并释放剩余资源这两段时间之间的状态。也有可能由于程序设计问题,造成子进程终止后父进程却不进行清理。 T:停止或跟踪。由用户挂起的进程,例如调试程序。 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页)
  • 12. 5.3.2 用户退出后继续运行进程用户登录后,系统启动一个shell,用户的命令由此shell解释执行。用户退出时,shell也退出,则所有shell生成子进程被杀死。 要让一个进程在用户退出后仍然运行,需要使用nohup命令。 如:nohup dir。则dir命令执行的结果附加在nohup.out文件的末尾,包括标准输出和标准错误输出。
  • 13. 5.3.3 调整优先级每个进程都有一个优先级属性,系统利用该属性决定优先执行哪个进程或为其分配更多的资源。 进程的优先级是PRI(Priority),PRI越小,进程优先级越高,且PRI由系统动态产生,不是一直固定的。
  • 14. 5.3.3 调整优先级在PRI的基础上,用户可以提供一个Nice值,以影响PRI,关系为: 新PRI = 原PRI + NI NI为正则相当于降低了进程优先级,反之则提高进程优先级。 一般用户可用的NI值为0~19,root可用的NI值为-20~19。 一般用户只能调整属于自己的进程的nice值,root用户则可以调整所有的进程。
  • 15. 5.3.3 调整优先级调整进程的NI值由两种方式: Nice命令,可以在开始执行进程时就立即提供一个特定的NI值。 Renice命令,可以调整某个已经存在的进程的NI值。
  • 16. Nice命令语法为:nice –n number 命令 效果为:命令的PRI是原PRI(父进程)+number 例如: nice –n -10 cat /dev/zero > /dev/null &
  • 17. renice命令Renice命令可以调整一个正在运行的进程的PRI。 语法为:renice number pid 效果为:将指定pid的进程的nice值为number。 一般先用ps命令(可以配合grep)找出进程的PID后,用renice命令修改
  • 18. 5.3.4 结束进程语法为: kill –signal PID(jobnumber) 其含义是向指定PID的进程(作业号为jobnumber的作业)发送signal信号。 可以用kill -l获得当前能够使用的signal。
  • 19. signal向作业传送信号时,可以用数字形式,也可以用字符形式。 常用的信号有: SIGHUP(1):让指定进程重新读取自己的配置文件。 SIGINT(2):中断一个进程的执行。 SIGKILL(9):强制结束一个进程,可能会遗留一些问题。 SIGTERM(15,默认):正常结束一个进程。
  • 20. killall该命令可以结束指定进程和所有以该进程启动的其他进程。 例如,使用killall –9 httpd可以强行结束系统的WWW服务,以及所有相关服务。
  • 21. 5.4 后台命令对于一些不需要键盘输入而且不会生成大量输出的长时间运行的命令适合于在后台运行。当bash shell在后台运行命令时,该命令被称为作业(job),被分配一个作业号码。 作业管理的相关命令如下: 让作业直接在后台运行:命令 & 将前台作业挂起:Ctrl+z 显示当前所有作业:jobs 将挂起的作业切换到后台:bg [作业号] 将后台作业切换到前台:fg [作业号]
  • 22. 用&在后台运行命令要让命令在后台运行,可以在命令后面加“&”,该命令启动后就在后台运行。 例如: cat /dev/zero > /dev/null & 后台启动作业后,bash给用户返回作业号和进程ID。
  • 23. Jobs命令使用jobs命令可以列出正在后台运行的作业。 加-l参数,可以同时显示相应进程的PID。 显示出来的作业状态中,中括号中的数字是作业编号。 最新操作的作业被称为当前作业,在jobs命令输出中用一个“+”修饰。
  • 24. fg命令使用fg命令可以把后台作业拿到前台处理。 直接使用fg命令,将把当前作业转到前台。 可以用fg number把作业号为number的作业转到前台。
  • 25. Ctrl+zCtrl+z用于将前台进程挂起。 被挂起的进程将被分配一个作业号(如果没有的话),并被置于后台。 该作业处于“Stopped”状态,用ps –u命令查看,该进程处于“停止”状态(T)。
  • 26. bg命令使用bg命令可以将挂起在后台的命令重新启动。 直接使用fg命令,将把当前作业转到前台。 可以用fg number把作业号为number的作业转到前台。 重新启动后的作业处于“Running”状态,进程为运行状态(R)。