[toc]
什么是进程
程序
程序是数据和指令的集合,是一个静态的概念,比如/bin/ls、/bin/cp等二进制文件,同时程序可以长期存在系统中。
进程
进程是一个程序的运行过程,是一个动态概念,进程是存在生命周期概念的,也就是说进程会随着程序的终止而销毁,不会永远在系统中存在。
进程的生命周期
用户发起请求
父进程会fork出子进程,子进程会继承父进程的大部分属性,如:文件描述等,处理任务
子进程在处理任务的过程中,父进程是一个wait状态,等待子进程结束汇报
僵尸进程
子进程比父进程先结束,父进程没有回收子进程的资源,此时的子进程就称为”僵尸进程”
孤儿进程
父进程比子进程先结束,子进程还在执行任务,没有父进程管理,此时的子进程就称为“孤儿进程”
静态进程状态 ps(静态查看当前进程状态) 1 2 3 4 5 6 7 8 9 10 ps 选项 ps a ps u ps x ps aux
列标识 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND USER PID %CPU %MEM VSZ RSS TTY ?: tty1: pts/0: STAT D: R: S: T: W: X: Z: <: N: L: s: l: |: +: START TIME COMMAND []: 没[]:
ps命令用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 -e -f -l -a ps aux --sort 列标识|less ps aux|sort -k区域 -n|grep 软件 ps auxf|grep [n]ginx ps ax -o 列标识,列标识 pidof 软件名 pgrep -l -a 软件名 pstree
动态进程状态 top(动态查看进程状态) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 h z 1 s b M P R f k W q
top列标识解析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 top - 17:10:10 up 8:11, 1 user, load average: 0.00, 0.01, 0.05 top - 17:10:10 up 8:11 1 user load average: 0.00, 0.01, 0.05 Tasks: 96 total, 1 running, 95 sleeping, 0 stopped, 0 zombie Tasks: 96 total 1 running 95 sleeping 0 stopped 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id , 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 0.0 us 0.3 sy 0.0 ni 99.7 id 0.0 wa 0.0 hi 0.0 si 0.0 st KiB Mem : 995892 total, 597616 free, 99008 used, 299268 buff/cache 995892 total 597616 free 99008 used 299268 buff/cache KiB Swap: 1048572 total, 1048572 free, 0 used. 723692 avail Mem 1048572 total 1048572 free 0 used 723692 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
进程管理命令 kill(进程关闭命令) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 kill -l 1 HUP 2 INT 3 QUIT 9 KILL 15 TERM 18 CONT 19 STOP 20 TSTP pkill killall
nice(进程优先级) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 nice 值越高:表示优先级越低,例如19,该进程优先将CPU使用量让给其他进程使用。nice 值越低:表示优先级越高,例如-20,该进程优先调用更多CPU资源。优先级别高的进程,可以优先享用系统的资源:cpu、内存、虚拟内存等 top ps axo aommand,nice |grep [软]件名 nice -n -nice 值 启动进程 renice -n -nice 值 pid 修改完pid值,退出终端重新连接后查看,命令:exit (登出)
企业案例:Linux假死 什么是假死 所谓假死,就是能ping通,但是ssh不上去;任何其他操作也都没反应,包括上面部署的nginx也打不开页面。
假死其实很难出现一次 作为一个多任务操作系统,要把系统忙死,忙到ssh都连不上去,也不是那么容易的。尤其是现在还有fd保护、进程数保护、最大内存保护之类的机制。 你可以fork很多进程,系统会变得很慢,但是ssh还是能连上去;你可以分配很多内存,但是内存多到一定程度oom killer就会把你的进程杀掉,于是ssh又能工作了。
假死如何实现 有一个确定可以把系统搞成假死的办法是:主进程分配固定内存,然后不停的fork,并且在子进程里面sleep(100)。 也就是说,当主进程不停fork的时候,很快会把系统的物理内存用完,当物理内存不足时候,系统会开始使用swap;那么当swap不足时会触发oom killer进程; 当oom killer杀掉了子进程,主进程会立刻fork新的子进程,并再次导致内存用完,再次触发oom killer进程,于是进入死循环。而且oom killer是系统底层优先级很高的内核线程,也在参与死循环。
系统假死为何能ping同无法连接 此时机器可以ping通,但是无法ssh上去。这是由于ping是在系统底层处理的,没有参与进程调度;sshd要参与进程调度,但是优先级没oom killer高,总得不到调度。
出现假死怎么办 为什么要费那么大的力气把机器搞死?我们知道假死是怎么产生的即可,这样可以针对假死的原因进行预防。 (其实假死的情况很少发生,只有当代码写的bug很多的情况下会出现。) 其实建议使用nice将sshd的进程优先级调高。这样当系统内存吃紧,还能勉强登陆sshd,进入调试。然后分析故障。