linux(一)进程的状态

2020-06-30  本文已影响0人  谁有羊毛

进程的状态

一、linux的进程查看 一般使用 ps -aux 来看
  1. linux的进程有几个关键的信息
二、linux的进程状态
  1. 主要状态为STAT列的值的第一个字母
  1. 附加状态信息
image.png
三、linux进程状态 详解
  1. R (task_running) : 可执行状态
  1. S (task_interruptible): 可中断的睡眠状态
  1. D (task_uninterruptible): 不可中断的睡眠状态
  1. T(task_stopped or task_traced):暂停状态或跟踪状态:
  1. Z (task_dead - exit_zombie):退出状态,进程成为僵尸进程:
linux系统启动后,第一个被创建的用户态进程就是init进程。它有两项使命:
1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙);
2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作;

init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于task_interruptible状态,“收尸”过程中则处于task_running状态。

5.1 Unix/Linux 处理僵尸进程的方法:

除了通过ps 的状态来查看Zombi进程,还可以用如下命令查看:

[oracle@rac1 ~]$ ps -ef|grep defun
oracle   13526 12825  0 16:48 pts/1    00:00:00 grep defun
oracle   28330 28275  0 May18 ?        00:00:00 [Xsession] <defunct>

5.2 僵尸进程解决办法:

(1)改写父进程,在子进程死后要为它收尸。
  具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。

(2)把父进程杀掉。
   父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。如:

       kill -9 `ps -ef | grep "Process Name" | awk '{ print $3 }'`
       其中,“Process Name”为处于zombie状态的进程名。

(3)杀父进程不行的话,就尝试用skill -t TTY关闭相应终端,TTY是进程相应的tty号(终端号)。但是,ps可能会查不到特定进程的tty号,这时就需要自己判断了。
(4)重启系统,这也是最常用到方法之一。
  1. X (task_dead - exit_dead):退出状态,进程即将被销毁
四、进程状态在linux中的转变说明
  1. 进程的初始状态:
  1. 进程状态变迁:
而进程从task_running状态变为非task_running状态,则有两种途径:

       1、响应信号而进入task_stoped状态、或task_dead状态;
       2、执行系统调用主动进入task_interruptible状态(如nanosleep系统调用)、或task_dead状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入task_interruptible状态或task_uninterruptible状态(如select系统调用)。

显然,这两种情况都只能发生在进程正在cpu上执行的情况下。
附:原文地址
上一篇 下一篇

猜你喜欢

热点阅读