zoukankan      html  css  js  c++  java
  • 一起来学linux:进程

    简单来说,每当执行一个程序或者命令,启动事件的时候都会得到一个PID,也就是进程ID。比如用户登陆的时候就会得到一个PID。如下所示。两个用户zhfroot在登陆后分别获得PID 32123214

    root@zhf-linux:/home/zhf/zhf# ps -aux | grep 'bash'

    zhf 3212 0.0 0.2 8968 4812 pts/5 Ss 08:36 0:00 bash

    root 3224 0.0 0.1 6008 3600 pts/5 S 08:36 0:00 bash

    前面我们还讲到了父子进程,比如在root这个账户下执行一些命令,那么rootPID 3224就是这些命令的父进程。用ps -l查看可以看到,ps命令的PID=4259. PPID=3224. PPID就父进程ID

    root@zhf-linux:/home/zhf/zhf# ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    4 S 0 3223 3212 0 80 0 - 2079 wait pts/5 00:00:00 su

    4 S 0 3224 3223 0 80 0 - 1502 wait pts/5 00:00:00 bash

    0 R 0 4259 3224 0 80 0 - 1869 - pts/5 00:00:00 ps


    linux是多任务,多用户的系统。最直接的体现就是工作管理。什么是工作管理呢,比如我想ping一个网站,同时呢我又在做其他的事情,我不想ping网站的结果干扰我。那么我就可以把ping这个动作扔到后台去。前台继续做我的工作。前台就是你可以控制与执行命令的环境。后台就是自动运行的工作。那么如何将命令扔到后台去呢。只需要在命令的最后加一个 &就可以了。如下:

    ping -c 10 www.sina.com.cn &


    执行完后会提示如下:

    10 packets transmitted, 10 received, 0% packet loss, time 9012ms

    rtt min/avg/max/mdev = 27.893/28.957/31.411/1.237 ms


    [1]+ Done ping -c 10 www.sina.com.cn

    但是有一点不好的是,由于每秒都会进行一次ping操作,结果也会在终端上显示,这会干扰到我正在执行的动作。最简单的办法就是将就结果重定向到文件中去。如下所示,这样在前台界面就不会看到执行的结果了。

    命令执行后会返回一个进程执行的pid。要查看在后台运行的程序可以通过jobs就可以看到后台执行的程序

    root@zhf-linux:/home/zhf/zhf# ping -c 10 www.sina.com.cn > test1.txt &

    [1] 4437

    root@zhf-linux:/home/zhf/zhf# jobs

    [1]+ Running ping -c 10 www.sina.com.cn > test1.txt &

    root@zhf-linux:/home/zhf/zhf# cat test1.txt

    PING www.sina.com.cn (218.30.66.248) 56(84) bytes of data.

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=1 ttl=54 time=31.1 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=2 ttl=54 time=30.6 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=3 ttl=54 time=29.8 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=4 ttl=54 time=32.0 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=5 ttl=54 time=28.4 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=6 ttl=54 time=29.3 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=7 ttl=54 time=28.1 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=8 ttl=54 time=30.5 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=9 ttl=54 time=28.6 ms

    64 bytes from www.sina.com.cn (218.30.66.248): icmp_seq=10 ttl=54 time=33.8 ms


    --- www.sina.com.cn ping statistics ---

    10 packets transmitted, 10 received, 0% packet loss, time 9013ms

    rtt min/avg/max/mdev = 28.135/30.271/33.876/1.708 ms

    [1]+ Done ping -c 10 www.sina.com.cn > test1.txt


    但是如果此刻我正在用VIM,但是想退出去查找某个东西,那么是否需要退出VIM呢。当然不需要,我们只需要将VIM丢到后台去执行就可以了。按下ctrl+z就可以了。就想下面一样。

    root@zhf-linux:/home/zhf/zhf# vim test1.txt


    [1]+ Stopped vim test1.txt

    root@zhf-linux:/home/zhf/zhf# jobs

    [1]+ Stopped vim test1.txt

    如果我想把后台的工作移到前台来,比如刚才的VIM操作,查找完毕继续编辑文档。这就要用到fg命令

    fg %jobnumber就可以将后台的工作任务移动到前台来,这个jobnumber就是用jobs结果的第一列的值。在这里VIMjobnumber1。执行fg %1就可以回到VIM的界面
    root@zhf-linux:/home/zhf/zhf# fg %1

    vim test1.txt

    前面在执行ctrl+z的时候看到后台的程序状态都是stopped. 表示后台程序已停止运行,那么如果我想让后台程序保持运行就要用到bg命令。比如查找一个文件,转到后台后状态是stopped。当执行bg %1后,状态变为running

    root@zhf-linux:/home/zhf/zhf# find / -name test1.txt

    ^Z

    [1]+ Stopped find / -name test1.txt

    root@zhf-linux:/home/zhf/zhf# bg %1

    [1]+ find / -name test1.txt &

    root@zhf-linux:/home/zhf/zhf# jobs

    [1]+ Running find / -name test1.txt &

    那如果我想将后台任务给删除掉呢,这就需要用到kill命令

    root@zhf-linux:/home/zhf/zhf# kill %1

    root@zhf-linux:/home/zhf/zhf# jobs

    [1]+ Terminated find / -name test1.txt




    进程的查看:

    查看进程有2种方法:1 查看当前终端有关的进程 2 查看系统所有的进程

    首先来看下查看当前终端有关的进程:ps -l

    root@zhf-linux:/home/zhf/zhf# ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    4 S 0 3245 3233 0 80 0 - 2079 wait pts/2 00:00:00 su

    4 S 0 3246 3245 0 80 0 - 1497 wait pts/2 00:00:00 bash

    0 R 0 3266 3246 0 80 0 - 1869 - pts/2 00:00:00 ps

    F:代表进程标志,若为4说明此进程的权限是root,若为1表示此子进程仅可进行复制fork,而无法执行

    S:代表进程的状态。R running S sleep D 不可唤醒 T 停止状态 Z 僵尸状态

    UID/PID/PPID:分别是用户ID,进程PID,以及父进程PID

    C代表CPU使用率,单位为百分比

    PRI/NIprioritynice的缩写,代表进程的优先级,数值越小代表该进程越快被进程执行

    ADDR/SZ/WCHAN:和内存有关,指进程在内存中的位置

    TTY:登陆者的终端位置

    TIMECPU时间,实际耗费CPU的时间

    CMD:进程的bash命令


    系统所有的进程查看: ps aux

    root@zhf-linux:/home/zhf/zhf# ps aux

    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

    root 1 0.1 0.2 24176 5228 ? Ss 08:39 0:02 /sbin/init spla

    root 2 0.0 0.0 0 0 ? S 08:39 0:00 [kthreadd]

    root 3 0.0 0.0 0 0 ? S 08:39 0:00 [ksoftirqd/0]

    root 5 0.0 0.0 0 0 ? S< 08:39 0:00 [kworker/0:0H]

    root 7 0.1 0.0 0 0 ? S 08:39 0:01 [rcu_sched]

    root 8 0.0 0.0 0 0 ? S 08:39 0:00 [rcu_bh]

    root 9 0.0 0.0 0 0 ? S 08:39 0:00 [migration/0]

    root 10 0.0 0.0 0 0 ? S 08:39 0:00 [watchdog/0]

    root 11 0.0 0.0 0 0 ? S 08:39 0:00 [watchdog/1]

    这里只介绍前面没有的字段:

    MEM:内存占用百分比

    VSZ:使用的虚拟内存

    RSS:固定占用的内存


    上面看到的这些进程CPU或者内存百分比都是静态的,如果我们想查看动态的变化的话要使用top命令。

    -d: 后面接秒数,就是进程的更新秒数,默认是5

    -b:以批次的方式执行top,

    -n:-b搭配,意义是需要进行几次top的输出结果

    -p: 指定某些PID来进行查看监控。

    如果我想查看自己bash的进程变化情况:可以用下面的方法,首先查看当前进程的PID, 然后用-p 进程id的方式查看。

    root@zhf-linux:/home/zhf/zhf# echo $$

    3246

    root@zhf-linux:/home/zhf/zhf# top -d 2 -p 3246


    进程的管理:

    进程之间是可以相互控制的。比如我在运行某个进程的时候死机了,我可以启动另外一个终端查出死机的进程ID 并将进程杀死掉。这也是linuxwindows维护起来方便的原因。进程之间通信需要用signal也就是信号来进行通知。

    信号signal的值有下面几个:

    1 SIGHUP 启动被终止的进程。

    2 SIGNINT 相当于用键盘输入ctri-c来进行中断一个进程的进行

    9 SIGKILL 代表强制中断一个进程的进行

    15 SIGTERM 以正常的结束进程来终止该进程

    17 SIGSTOP 相当于用键盘ctrl-z来暂停一个进程的进行。

    进程之间传递进程采用kill命令。kill -signal PID

    比如当前终端的运行进程如下,3620就是我们当前使用的终端进程ID

    zhf@zhf-linux:~$ ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    0 S 1000 3620 3615 0 80 0 - 2242 wait pts/2 00:00:00 bash

    0 R 1000 3644 3620 0 80 0 - 2305 - pts/2 00:00:00 ps

    采用如下的命令 -9 强制中断当前的终端。执行后当前终端就会退出

    zhf@zhf-linux:~$ kill -9 3620



    进程的执行顺序:

    在前面执行ps -l的时候有两个参数prioritynice值。这两个值的作用在于调节进程的执行顺序。如果进程都是在一个队列里面进行,每个都按照顺序来,虽然很公平,但是会带来一个问题,比如有3个进程,进程1是紧急的进程,进程23是一般的进程而且进程2和进程3的工作很耗时间。如果按照顺序来,紧急的进程1就有可能半天得不到调度。紧急的任务就一直卡在那里。为了解决这个问题,引入了进程的优先级参数,也据是prioritynice值。PRI越低就代表越优先的意思。那么nice值是起什么作用的呢。

    因为PRI是内核动态调整的,我们是无法去修改的。如果要调整进程的优先级,只能通过nice值来进行调整。PRI(new)=PRI(old)+nice。当nice为负值的时候,就是降低PRI值,优先级就会提高。反之则是降低

    nice值的可调整范围是-20-19

    比如我们新增一个vi进程并转入后台处理,设置nice值为-5。 通过ps -l可以看到vi进程的nice值。原本BASH内置的PRI值为80, nice设为-5以后,PRI变为75

    root@zhf-linux:/home/zhf# nice -n -5 vi &

    [1] 3802

    root@zhf-linux:/home/zhf# ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    4 S 0 3681 3670 0 80 0 - 2079 wait pts/2 00:00:00 su

    4 S 0 3682 3681 0 80 0 - 1497 wait pts/2 00:00:00 bash

    4 T 0 3802 3682 2 75 -5 - 3634 signal pts/2 00:00:00 vi

    0 R 0 3803 3682 0 80 0 - 1869 - pts/2 00:00:00 ps


    已有的进程可以通过renice的方法进行调整。下面的就是将su进程的nice调整为-5

    root@zhf-linux:/home/zhf# ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    4 S 0 3681 3670 0 80 0 - 2079 wait pts/2 00:00:00 su

    4 S 0 3682 3681 0 80 0 - 1500 wait pts/2 00:00:00 bash

    0 R 0 3817 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

    root@zhf-linux:/home/zhf# renice -5 3681

    3681 (process ID) old priority 0, new priority -5

    root@zhf-linux:/home/zhf# ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    4 S 0 3681 3670 0 75 -5 - 2079 wait pts/2 00:00:00 su

    4 S 0 3682 3681 0 80 0 - 1500 wait pts/2 00:00:00 bash

    0 R 0 3823 3682 0 80 0 - 1869 - pts/2 00:00:00 ps


  • 相关阅读:
    Spring异常重试框架Spring Retry
    Ubuntu 16.04无法在WPS中输入中文的问题解决
    Ubuntu 16.04使用百度云的方案
    Ubuntu 16.04安装Wine版的迅雷+QQ(完美方案,终极解决方法)
    Ubuntu下Deb软件包相关安装与卸载
    Spring在Java Filter注入Bean为Null的问题解决
    MyBatis 3在Insert之后返回主键
    MySQL JDBC URL参数(转)
    MySQL索引原理及慢查询优化
    Markdown 语法整理大集合2017
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7605331.html
Copyright © 2011-2022 走看看