zoukankan      html  css  js  c++  java
  • 🎬进程管理

    一、介绍

    程序存放代码的文件---->静态

    进程程序的运行过程---->动态

    同一个程序可能对应多个进程 父进程:程序运行时产生的第一个进程 子进程:由父进程衍生fork()出来的进程

    :如果父进程终止,子进程也会随之被终止

    [root@localhost yum.repos.d]# yum install nginx -y 
    [root@localhost yum.repos.d]# systemctl start nginx [root@localhost yum.repos.d]# ps aux |grep nginx root 27482 0.0 0.1 120896 2096 ? Ss 16:50 0:00 nginx: master process /usr/sbin/nginx nginx 27483 0.0 0.1 123364 3544 ? S 16:50 0:00 nginx: worker process root 27500 0.0 0.0 112724 988 pts/0 S+ 16:50 0:00 grep -- color=auto nginx

    进程之进程状态(R、S、D、T、Z、X)

    • 进程概念

    1.正在执行的程序

    2.正在计算机上执行的程序实例

    3.能分配处理并由处理器执行的实体

    进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。

    这便有了“进程状态”-->进程在内存中因策会忽略调度需求,会处于各种状态

    • linux下的进程状态
    static const char * const task_state_array[] = {
    "R (running)", /* 0 */
    "S (sleeping)", /* 1 */
    "D (disk sleep)", /* 2 */
    "T (stopped)", /* 4 */
    "t (tracing stop)", /* 8 */
    "X (dead)", /* 16 */
    "Z (zombie)", /* 32 */
    };
    R-----可执行状态(运行状态)
    只有在运行状态的进程才有可能在CPU上运行,注:此为可能!并不意味进程一定在运行中,同一时刻可能有多个进程处在可执行状态,
    这些进程的PCB(进程控制块)被放入对应CPU的可执行队伍中,然后进程调度器从各个可执行队列中分别选择一个进程在CPU上运行
    如果计算机只有一个处理器,那么一次最多只有一个进程处于这种状态。
     
    S-----可中断睡眠状态(sleeping)
    处在这个状态意味着进程在等待事件完成。这些进程的PCB(task_struct结构)被放入对应时间的等待队列中。然后等待的事件发生时,对应的进程将被唤醒
     
    D-----不可中断睡眠(disk sleep)
    在这个状态的进程通常会等待io结束
    这个状态与sleeping状态相似,处于睡眠状态,但是此刻进程是不可中断的,意思是不响应异步信号
    另外你会发现处在D状态的进程kill -9竟然也杀不死。这就相当于我们怎么也叫不行一个装睡的人。
     
    T------暂停状态
    给进程发送一个SIGSTOP信号,进程就会响应信号进入T状态,除非该进程正处在D状态
    再通过发送STGSTOP信号让进程继续运行
    kill -STGSTOP
    kill -STGSTNP
     
    Z-----僵尸状态
    僵尸状态是一个比较特殊的状态,进程在退出的过程中,处于TASK_DEAD状态
    在这个退出过程中,进程占有的所有资源将被收回,除了task_struct结构(以及少数资源)以外。于是进程就剩下task_struct这么个空壳,故称为僵尸。
    X-----死亡状态或退出状态(dead)
    死亡状态是内核运行 kernel/exit.里的do_exit()函数返回的状态。这个状态只是一个返回装态,并不会在任务列表里看到此状态
    进程状态切换
     

    进程在运行中不断的改变运行状态

    就绪态

    当前进程已分配到CPU以外对的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态

    执行状态

    当进程已获得处理机,其程序正在处理机上运行,此时的进程状态就是执行状态

     阻塞态
    正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态,引起进程阻塞的事件有很多。如:等待IO完成、申请缓冲区不能满足、等待信件(信号)等。
     
     就绪态-->执行态
    处在就绪态的进程,当调度为其分配好了处理机,就变成了执行态
     
    执行态-->就绪态
    执行状态的进程在其执行过程中,时间片跑完了不得不让出处理机,于是从执行变成就绪状态
     
    执行态-->阻塞态
    正在执行的进程等待某种事件而无法继续执行时,便从执行态变成阻塞态
     
    阻塞态-->就绪态
    处在阻塞状态的进程,如果等待的时间发生,则从阻塞态变成就绪态
     
    二、查看进程
    ps aux是常用组合,查看进程用户、PID、占用CPU百分比、状态、执行命令等
    -a #显示一个终端的所有进程
    -u #选择有效的用户的ID或者是用户名
    -x #显示没有控制终端的进程,同意显示各个命令的具体路劲

    示例

    [root@localhost ~]# ps aux |head -5
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.3 128400 7104 ? Ss 8์12 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root 2 0.0 0.0 0 0 ? S 8์12 0:00 [kthreadd]
    root 4 0.0 0.0 0 0 ? S< 8์12 0:00 [kworker/0:0H]
    root 5 0.0 0.0 0 0 ? S 8์12 0:01 [kworker/u256:0]

    查看结果显示

    USER: 运行进程的用户
     
    PID: 进程ID
    %CPU: CPU占用
     
    %MEM: 内存占用率
     
    VSZ:占用虚拟内存,单位:kb(killobytes)
                  VSZ是指已分配的线性空间的大小,这个大小通常并不等于程序实际用到的大小,产生这个的可能性很多
                   比如内存映射。共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小
    RSS: 占用实际内存,单位:kb(killobytes)
     RSZ是Resident Set Size,常驻内存大小,即进程实际占用的物理内存大小
     
    TTY:进程运行终端
    STAT:进程状态  man ps  (/STATE) 
     R 运行
     S 可中断睡眠sleep,即在睡眠的过程中可以接收信号唤醒==>执行io操作可以得到硬件设备的响应
     D 不可中断睡眠,即在睡眠的过程中不可接收信号唤醒==>执行的io操作得不到硬件设备的响应
     T 停止进程
     Z 僵尸进程
     X 死掉的进程(几乎看不见,因为死了就立刻被回收了)
     
     < 标注了<小于号代表优先级较高的进程
     N N代表优先级较低的进程
     
     s 包含子进程
     
     + +表示是前台的进程
     
     l  小写字母l,代表以线程的方式云,即多线程
     | 管道符号代表多线程
     
    START: 进程对的启动时间
    TIME:进程占用CPU的总时间
    COMMAND:进程文件,进程名
               带[]号的代表内核态进程
               不带[]号的代表用户态进程

     linux进程有种睡眠状态

    1、interrupt ible sleep(可中断睡眠,在命令中显示"S")

    处在这种睡眠状态的进程是可以通过给它发送signal来唤醒的,比如发HUP信号给nginx的master进程

    可以让nginx重新加载配置文件,不需要重启nginx进程

    2,、UNinterruptible sleep(不可中断睡眠,在ps命令中显示"D")

    处在这种状态对的进程不接受外来的任何signal,这也是为什么无法用kill杀掉这些处于D状态的进程,无论是"kill"、"kill -9"、"kill -15"还是被按Ctrl+c、Ctrl+z 都无济于事,因为他们压根儿就不受这些信号的支配
     
    解释
    进程为什么会被置于D状态?处于UNinterruptible sleep状态的进程通常在等待io,比如磁盘io,网络io,其他外设io,如果进程正在等待的io在较长时间都没有响应,那么就会很不幸地被ps看到了,同时也就意味着很有可能有io出现了问题,可能是外设本身出了故障,也可能是比如NFS挂载的远程文件系统已经不可访问了
     
    正是因为得不到io的响应,进程才进入了uninterruptible sleep所以要想使进程从UNinterruptible sleep状态恢复,就得使进程等待的io恢复,比如:如果是因为从远程挂载的NFS卷不可访问导致进程进入UNinterruptible sleep状态的,那么可以通过恢复该NFS卷的链接来使进程的io请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个linux系统了
     
    有说法:如果想要杀掉D状态的进程,通常可以去杀掉它的父进程(通常是shell,在shell下直接运行的该进程,之后该进程转入了D状态)但是执行后的状态为:他们的父进程被杀掉了,但是他们的父进程PID都变成了1,也就是init进程,此时这些D进已经影响到其他进程运行,而已经无法访问和恢复NFS卷,所有只好重启了
     
    强调
    D与z状态的进程都无法用kill -9杀死
     
    查看进程树
    [root ~]# rpm -qf `which pstree`
    psmisc-22.20-16.el7.x86_64
    [root ~]# pstree
    [root ~]# pstree 104239
    bash——bash——bash——bash——pstree

    查看ppid

    [root ~]# ps -ef | head -10
    
    UID PID PPID C STIME TTY TIME CMD
    
    root 1 0 0 11月01 ? 00:00:07 /usr/lib/systemd/systemd --
    
    system --deserialize 20
    
    root 2 0 0 11月01 ? 00:00:00 [kthreadd]
    
    root 4 2 0 11月01 ? 00:00:00 [kworker/0:0H]
    
    root 6 2 0 11月01 ? 00:00:06 [ksoftirqd/0]
    
    root 7 2 0 11月01 ? 00:00:00 [migration/0]
    
    root 8 2 0 11月01 ? 00:00:00 [rcu_bh]
    
    root 9 2 0 11月01 ? 00:00:03 [rcu_sched]
    
    root 10 2 0 11月01 ? 00:00:00 [lru-add-drain]
    
    root 11 2 0 11月01 ? 00:00:01 [watchdog/0]

    动态查看

    # 基本用法
    [root@localhost ~]# top
    [root@localhost ~]# top -d 1 # 1秒刷新一次
    [root@localhost ~]# top -d 1 -p 进程pid
    [root@localhost ~]# top -d 1 -p `pgrep nginx | head -1`
    [root@localhost ~]# top -d 1 -p `pgrep sshd | head -1`,33 # 查看sshdզ݊pid以及pid为33的进程
    [root@localhost ~]# top -d 1 -u nginx # 查看指定用户进程
    [root@localhost ~]# top -b -n 2 > top.txt # 将2次top信息写入到文件

    显示信息解释

    第一部分:系统整体统计信息

    up左边的代表当前的时间

    up右边的代表运行了多长时间

    load average: 0.86, 0.56, 0.78         CPU 1分钟 ,5分钟,15分钟平均负载
     
    us 用户状态进程占用CPU时间的百分比
    sys 内核态进程占用CPU时间的百分比
    ni 代表优先级被调度的进程占CPU时间百分比
    id CPU空闲的百分比
    wa CPU等待io的百分比
    hi 硬件中断,处理硬件中断所占用CPU的时间
    si 软件中断,处理软件中断所占用CPU的时间
    st 被偷走的CPU
     
    第二部分:进程信息
    top  命令 VSZ,RSS,TTY,STAT,VIRT,RES,DATA的含义
    ====================================================
    VIRT:virtual memory usage 虚拟内存
    1.进程"需要的"虚拟内存大小,包括进程使用额库、代码、数据等
    2.假如进程申请100m的内存,但实际只用了10m,那么它会增长100m,而不是实际的使用量
     
    RES:reisden memory usage 常驻内存
    1、进程当前使用的内存大小,但不包括swap out(当某进程向os请求内存发现不足时,os会把内存中暂时不用的数据交换出去,放在swap分区中,这个过程称为swapu out。当某进程又需要这些数据且os发现还有空闲物理内存时,又会把swap分区中的数据交换回物理内存中,这个过程称为swap IN )
    2、 包含其他进程对共享
    3、 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
    4、 关于库占用内存的情况,它只统计加载的库文件所占内存大小
     
    SHR:resident memory usage 共享内存
    1、除了自身进程的共享内存,也包括其他进程的共享内存
    2、虽然进程只使用了几个共享的函数,但他包含了整个共享库的大小
    3、计算机某个进程所占的物理内存大小公式:RES — SHR
    4、swap out后,它将会降下来,因为内存充裕了,没必要挤内存
     
    DATA1
    1、数据占用的内存。如果top没有显示,按f键、然后用空格选中DATA项目、按q即可显示出来
    2、真正的该进程要求的数据空间,是真正在运行中要使用的。
     
    top 运行中可以通过top的内部命令对进程的显方式进行控制
    命令:
    M 按内存的使用排序
    P 按CPU使用排序
    N 以PID的大小排序
    R 对排序进行反转
    f 自定义显示字段
    l 显示所有CPU的负载
    s 改变画面更新频率
     
    h | ?帮助
    <  向前
    >  向后
    z  着色,彩色
     
    调整进程的优先级
    1、r 调整进程的优先级(nice level)
    优先级的数值为 -20 ~~19,其中数值越小优先级越高,数值越大优先级越低,最高-20,最低19
    注:普通用户只能在0~19之间调整应用程序优先级,超级用户才有权限调整更高优先级
    2、k 给进程发送信号1,2,9,15,18,19
     
    更多内部命令
    l - 关闭或者开启第一部分第一行 top 信息的表示
    t - 关闭或者开启第一部分第二行 tasks 和第三行cups信息的表示
    m-关闭或者开启第四行 mem 和 第五行 swap 信息的表示
    N - 以 PID 的大小的顺序排列表示进程列表
    P - 以CPU 占用率的大小顺序来排序
    h - 显示帮助
    n - 设置在进程列表所显示进程的数量
    q - 退出 top
     
     
    序号  列名 含义
    a PID 进程 id
    b PPID 父进程 id
    c RUSER Real user name 
    d UID 进程所有者的用户id
    e USER 进程所有者的用户名
    f GROUP 进程所有者的组名
    g TTY 启动进程的终端名。不是从终端启动的进程则显示为?
    h PR 优先级
    i NI nice值。负责表示高优先级,正值表示低优先级
    j P 最后使用的CPU,仅在多个CPU环境下有意义
    k %CPU 上次更新到现在的cup时间占用百分比
    l TIME 进程使用的CPU 时间总计,单位 秒
    m TIME+ 进程使用的CPU时间总计,单位秒1/100秒
    n %MEM 进程使用的物理内存百分比
    o VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
    p SAWP 进程使用的虚拟内存中被换出的大小,单位kb 
    q RES 进程使用的、未被换出的物理内存大小,单位kbRES=CODE+DATA
    r CODE  可执行代码占用的物理内存大小
    s DATA  可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    t SHR  共享内存大小,单位kb
    u nFLT 页面错误次数
    v nDRT 最后一次写入到现在,被修改过的页面数
    w S  进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,z=僵尸进程)
    x COMMAND  命令名/命令行
    y WCHAN  若该进程在睡眠,则显示睡眠中的系统函数名
    z Flags  任意标志,参考 sched.h
     
    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
    可用以下快捷键更改显示内容
    通过 f 键可以选择显示内容。按 f 键之后会显示列的列表,按a-z即可显示或隐藏对应的列,最后回车键确定
    按o键可以改变列的显示顺序。按a-z可以将相应的列向右移动,而A-Z可以将相应的列向左移动。最后回车键确定
    按 F 或 O 键,然后再按a-z可以将进程按照相应的列表进行排序。而R键可以将当前的排序倒转
    三、shell管理进程
     1、优先级设置
    可以在启动进程时用nice命令设置优先级
    命令
    nice [-n  <优先级数值>]  [--help] [--version] [执行指令]
    选项
    若nice命令未指定优先级的调整值,则以缺省值10来调整程序运行优先级,即在当前程序运行优先级基础之上增加10
        -n  <优先级>    指定优先级
      --help                 帮助信息
      --version            版本信息
    执行范例:让命令以新的优先级执行:[root@localhost ~]# nice -n 5 ls # nice -n -20 命令
     ps -l 命令
    重要信息:
    UID : 代表执行者的身份
    PID : 代表这个进程的代号
    PPID : 代表这个进程是由哪个进程发展衍生而来的,即父进程的代号
    PRI : 代表这个进程可被执行的优先级,其越小越早被执行
    NI : 代表这个进程对的nice值
     
    对正在运行的进程设置新的优先级:[root@localhost ~]# renice -20  命令
    2.给进程发信号  
    [root@localhost ~]# kill -l    列出所有支持的信号
    ===================解释======================
    HUP :1、挂起信号  2、可以让进程重新加载配置
    此信号在用户终端连接(正常或非正常)结束时发出,通常是在终端对的控制进程结束时,通知session内的各个作业,这时他们与控制终端不再关联。
    登录linux时,系统会分配给登录用户一个终端(session )。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都会属于这个session。当用户退出linux登录时,前台进程组和后台有对终端输出的进程就会终止。不过,可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略,这样就算退出了
    Linux登录,wget也能继续下载
    此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新加载
    # INT(2): 中断,通常因为按下Ctrl+c而产生的信号,用于通知前台进程组终止
    # QUIT(3): 退出,和SIGINT类似,但由QUIT字符(通常是Ctrl-)来控制,进程在因收到SIQUIT退出时会产生core文件,在这个意义上类似于一个进程错误信号。
    # TSTP(20) :停止进行运行,通常因为按下Ctrl+z
    # KILL (9)  :用来立即结束程序的运行,本信号不能被阻塞、处理和忽略,强制杀死。 
    # TERM(15) :正常终止
    # CONT(18) :被暂停的进程继续恢复运行
    # SIGSTOP(19) :暂停进程
    # SIGCHLD :子进程结束时,父进程会收到这个信号
     
    如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程,这种情况应该避免父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管
     
    kill -l 重新加载配置文件
    #1、启动vsftpd服务
    [root ~]# systemctl start vsftpd # 默认匿名用户共享根目录为/var/ftp
    [root ~]# ls /var/ftp/
    centos7 pub
    
    # 2、打开浏览器,输入ftp://192.168.12.42/,  看到的是/var/ftp下的内容
    # 3、修改vsftp的配置文件,默认匿名用户根目录/test
    [root ~]# sed -i '$a anon_root=/test' /etc/vsftpd/vsftpd.conf 
    # 4、在不启动服务vsftp的情况下让其加载配置文件
    [root ~]# ps aux |grep [v]sftpd
    root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root ~]# kill -1 50695 # 这期间vsftpd的pid是始终不变的,因为从未关闭过进程
    [root ~]# ps aux |grep [v]sftpd
    root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    #5、打开浏览器,重新输入ftp://192.168.12.42/看到的是/test下对的内容

    kill 杀死进程

    # kill -15 不加-15,默认就是-15对的信号
    [root ~]# ps aux |grep [v]sftpd
    root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root ~]# kill 50695
    [root ~]# ps aux |grep [v]sftpd
    # kill -9强制杀死
    [root@localhost ~]# ps aux |grep nginx
    root 29978 0.0 0.1 120896 2096 ? Ss 17:28 0:00 nginx:
    master process /usr/sbin/nginx
    nginx 29979 0.0 0.1 123364 3544 ? S 17:28 0:00 nginx:
    worker process
    root 29984 0.0 0.0 112724 988 pts/0 S+ 17:28 0:00 grep --
    color=auto nginx
    [root@localhost ~]# kill -9 29978

    暂停kill-19与恢复进程kill -18

    [root ~]# ps aux |grep [v]sftpd
    root 106530 0.1 0.0 53288 572 ? Ss 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root ~]# kill -stop 106530
    [root ~]# ps aux |grep [v]sftpd
    root 106530 0.0 0.0 53288 572 ? Ts 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root ~]# kill -cont 106530
    [root ~]# ps aux |grep [v]sftpd
    root 106530 0.0 0.0 53288 572 ? Ss 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    
    [root ~]# # 也可以用数字
    [root ~]# kill -19 106530
    [root ~]# ps aux |grep [v]sftpd
    root 106530 0.0 0.0 53288 572 ? Ts 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root ~]# kill -18 106530
    [root ~]# ps aux |grep [v]sftpd
    root 106530 0.0 0.0 53288 572 ? Ss 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

    杀死所有:根据进程名称杀死所有

    [root ~]# vim a.txt &
    [root ~]# vim b.txt &
    [root ~]# vim c.txt &
                      、、、、、、、、、、、、、
    [root ~]# killall -9 vim
    [root ~]# pkill -9 vim

    查看某个用户开启的进程

    [root ~]# pgrep -l -u 用户
     
     
  • 相关阅读:
    兼容多浏览器的网页复制插件(ZeroClipboard)
    兼容主流浏览器的css渐变色
    如何让字体随窗口缩放自动调整大小
    使用javascript实现html页面直接下载网盘文件
    360随身wifi隐藏ssid方法
    javascript特效——烟花燃放的效果[xyytit]
    JavaScript数组定义
    常用特殊符号的HTML代码(HTML字符实体)
    9.JAVA之GUI编程列出指定目录内容
    8.JAVA之GUI编程键盘码查询器
  • 原文地址:https://www.cnblogs.com/ChuangShi-HolySpirit/p/13921699.html
Copyright © 2011-2022 走看看