来自海哥的学习笔记分享

进程管理

简介:

Linux是一个多用户多任务的操作系统,系统上可以同时运行多个进程。

程序:程序是静态的,是完成某些功能的代码的集合

进程:进程是动态的,是程序运行之后,在内存中的状态,运行的程序会产生一个或多个进程

如何产生一个进程?

  1. 运行程序或者执行命令
  2. 计划任务

归根结底,运行程序就会产生进程

如何终止一个进程?

  1. 程序或命令执行完成,自动终止
  2. 强制终止进程(杀进程)

查看进程号

cd /proc/

在该目录下蓝色数字的目录,都是进程号(PID)

一.进程查看

  • 进程的查看:process
  • 静态查看:ps **** 、pstree
  • 动态查看:top ****
  • 列出PID:ls /proc/

    • init 进程号为1

(一)、静态查看进程

1、ps 是监视系统进程的主要工具,显示的是瞬时的进程状况

        ps    显示当前被运行的进程

第一组:

ps   -elf
    -e:显示所有进程
    -f:全格式显示
    -l:长格式显示
  • 例1:

    • ps  -e   
          PID  TTY          TIME     CMD
          1       ?        00:00:02  init
          PID:process  id  ,进程的id号 
          TTY:由哪个终端产生的进程
          TIME:运行的时间
  • 例2:

    • ps  -ef   
          UID         PID   PPID  C STIME TTY          TIME CMD
          root          1      0  0 08:43 ?        00:00:02 /sbin/init
          UID:进程所有者的ID号
          PPID: 父进程号
  • 例3:

    • ps  -el   
          PRI:优先级  
          NI:进程的nice值
          优先级是内核的功能,用户没有权力修改;用只能通过nice去影响优先级

      第二组:

      ps aux    更多是想看优先级 
          a:显示所有进程(包含其他用户进程),默认只显示当前终端下进程
          u:显示进程的所有者
          x:一般和a一起使用,显示所有进程(包含无控制终端的进程)
      ps aux  更多的是想查看cpu、mem(内存)使用率    
*例如:*
 /etc/init.d/httpd start
        Starting httpd:                                            [  OK  ]
 ps -ef
        UID        PID  PPID  C STIME TTY          TIME CMD
        root         1     0  0 06:45 ?        00:00:02 /sbin/init
                    进程号  父进程号  

*更多用法:*
 ps -ef | grep httpd       //查看httpd服务是否在运行
 ps -ef | grep httpd | grep -v grep      //-v:取反,打印不包含某个关键字的行
 ps aux | more
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 ps aux | grep httpd
        STAT:进程状态
        R:正在运行的进程
        S:休眠进程
        Z:僵尸进程 zombie 实际上该进程已经终止,但是它的父进程却无法正常终止它,造成僵尸进程的状态
        D:不可中断的睡眠
        T:停止
    VSZ:虚拟内存集
    RSS:常驻内存集
### 2、pstree:以树型显示正在运行的进程     *不常用*
**好处:个进程间的关系一目了然**

pstree

init进程是所有进程的父进程。

-a:显示完整信息
-u:列出名字
-p:列出PID号
## (二)、动态查看进程
**top 实时查看系统运行状态**

top

top - 15:05:06 up 8:19, 4 users, load average: 0.00, 0.00, 0.00

    系统时间  运行时长   几个登录用户      系统在1分钟、5分钟、15分钟的平均负载情况

Tasks: 160 total, 2 running, 158 sleeping, 0 stopped, 0 zombie //对进程的概括

    总进程数     正在运行的   休眠的进程   停止的进程   僵尸进程           

Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.3%si,

按数字1,展开CPU,可以用于查看有几个CPU。

Mem: 1016516k total, 903140k used, 113376k free, 83324k buffer
Swap: 4181384k total, 8k used, 4181376k free, 419480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

top:

交互式命令
l: 是否显示平均负载和启动时间
t: 是否显示进程和CPU状态相关信息
m: 是否显示内存相关信息
M: 根据驻留内存大小进行排序
P:根据CPU使用百分比进行排序
T: 根据累计时间进行排序
c: 是否显示完整的命令行信息
q: 退出top
k: 终止某个进程 

top:选项

-d: 指定延迟时长,单位是秒,默认是3秒
-b: 批模式,基本不会用
-n 数字:在批模式下,共显示多少批

**仅动态查看某个进程的状态(必须记住的): **
​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​​‌​‌​‍‌​​​​‌‌‌‍​​​​‌​​‌‌‌​‌​‌‌‍​‌‌‌​‌​​​‌​​‌‌‌‌‍‌‌​‌‌‌‌‌‍‌‌​‌​​‌​‍‌‌​‌‌‌‌‌‍​‌‌‌​​​​​​‌​​‌​​‍​​​​‌​‌‌‌‌‌​‌​​‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​‌‌‌‌​​‍‌​‌‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​‌‌​​‌​‍‌​‌‌‌‌​​‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​​‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌‌‌​‌‍‌​​‌​​‌‌‍‌​​‌​​​​‍‌​​‌‌​​​‍‌‌​‌​​​‌‍‌​​‌‌‌​​‍‌​​‌​‌​​‍‌​​​​‌‌​‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌‌​‌​​​‌‍‌​​​‌‌​​‍‌​​‌​‌‌​‍‌​​​‌​‌‌‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​​‌‌​​‍‌​​​‌​‌‌‍‌​​​‌​‌​‍‌​​‌‌​‌‌‍‌​​​​‌‌​‍‌​‌​​​‌‌‍‌​​‌​​‌‌‍‌​​‌​‌‌​‍‌​​‌​​​‌‍‌​​​‌​‌​‍‌​​​​‌‌‌‍‌‌​‌​​‌​‍‌​​​‌‌‌‌‍‌​​​‌‌​‌‍‌​​‌​​​​‍‌​​‌‌‌​​‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌‌​​‍‌‌​‌​​‌​‍‌​​‌​​​‌‍‌​​‌​​​​‍‌​​​‌​‌‌‍‌​​‌‌​‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌‌

top -p 2597 //-p 进程号,动态查看某一个进程


# 二.进程的管理

**进程间通信的方式三种:**
1. 信号   signal
2. 消息  message
3. 共享内存  shared memory

信号是类Unix系统中的一种通信机制,它用来中断运行的进程执行某些操作。

## (一)、kill

### 1、查看信号列表
    kill -l   (字母l) 
    
### 2、常用的信号

*  1) SIGHUP    :重读进程的配置,即不停止服务的情况下,重新读取配置文件 
   *  `kill -1 PID  或     kill -SIGHUP PID`
*  2) SIGINT:中断(interrupt),相当于ctrl + c
   * 第一个标签:`firefox 172.16.254.210`
   * 另一个标签:
     * ```bash
        ps -ef | grep fire
             root      7839  4203  2 15:56 pts/3    00:00:01 /usr/lib64/firefox/firefox 172.16.254.210
             root      7858  7839  0 15:56 pts/3    00:00:00 [firefox] <defunct>
             root      7899  3222  0 15:57 pts/1    00:00:00 grep fire
        kill -2 7839
 * 第一个标签:
     发现该标签中的命令被终止了
  • 3) SIGKILL:强制杀死进程,必死

    • firefox 172.16.254.210
      ps -ef | grep firefox
              root      7952  4203  4 16:01 pts/3    00:00:01 /usr/lib64/firefox/firefox 172.16.254.210
              root      7995  3188  0 16:01 pts/0    00:00:00 grep firefox
  • 4) SIGTERM:终止进程,进程不一定会死

    • 18)启动进程
    • 19)停止进程
  • 5) SIGTSTP:相当于ctrl + z,切换到后台停止进程

    • 第一个标签:firefox 172.16.254.210
    • 第二个标签:

      • ps -ef | grep firefox
            root      8027  4203  4 16:05 pts/3    00:00:01 /usr/lib64/firefox/firefox 172.16.254.210
            root      8073  3222  0 16:06 pts/1    00:00:00 grep firefox
      • 第一个标签:

        [1]+ Stopped firefox 172.16.254.210

        * 执行top时侯,可以看到一个stopped的进程。

    (二)、pkill 按照进程的属性结束进程

    pkill -kill -t tty2

    1、按照进程名字杀死进程

         ps -ef | grep httpd 

### 2、按照用户名杀死进程    -U(杀死前台的)

**例: **
    pkill   -U  apache      杀掉所有者为apache的进程

第一个标签
su - quota1
vim /etc/passwd

第二个标签
pkill -U quota1

第一个标签
vim /etc/passwd
    Vim: Caught deadly signal TERM
    Vim: Finished.
    
    pgrep:可以获取包含某个关键字的进程的pid           
    # /etc/init.d/httpd start    
    # kill -9 `pgrep httpd`

<br>

killall:

killall 命令名        //杀死全部的同名进程
# /etc/init.d/httpd start
# killall httpd

xkill:杀死图形化资源

# xkill
    点哪哪死
## 三.进程的后台运行
### 1、前台运行
直接在终端运行命令
firefox 172.16.254.210
会发现该程序一直占用着终端,其他命令不能够使用该终端运行
### 2、后台运行

#### 1)命令执行的时候,直接将其放置于后台
firefox 172.16.254.210 &
会发现后台运行的程序不会占用执行命令的终端,用户仍然可以使用该终端执行命令
#### 2)对于一个已经运行的进程,如何将其放置于后台?              (可能出面试,分两步走)
kill -9 10104
firefox 172.16.254.210      #按下ctrl + z,将进程放置于后台,但是进程是停止的状态
^Z       
[2]+  Stopped                 firefox 172.16.254.210
bg 2            #激活后台进程   background:后台
[2]+ firefox 172.16.254.210 &
jobs        #查看后台进程的
[2]+  Running                 firefox 172.16.254.210 &

====================================

bg 任务编号:激活后台进程

fg 任务编号:将后台运行的进程调到前台来运行 foreground:前台

fg 2

firefox 172.16.254.210


**注意:不管你是前台运行,还是后台运行,只要终端一关闭,进程就停止了。**

> 那么如何让一个命令或者程序执行脱离终端?   (面试题)

**使用nohup。**
nohup firefox 172.16.254.210 &
nohup: ignoring input and appending output to `nohup.out`   #正常现象,按回车。
ls nohup.out 
nohup.out
# 四.进程优先级

* -40-----99  数字越小,优先级越高
    * 60----99:用户控制
    * -40----59:内核控制
    
**进程的nice值 PRI-NI(nice)=值是一定的**

* nice:谦让值
  * 作用:指定或调整用户进程的nice值
    * nice值越高,该进程抢占资源的能力越弱
    * nice值越低,该进程抢占资源的能力越强
            
## 1、相关命令

* nice:运行时直接设置nice值
  * 格式:`nice -n 数字 command`
* renice: 对于已经运行的,调整nice值
  * 格式:`renice 数字 PID`
* nice值的范围:-20 ~ 19


## 2、例子
    vim loop.sh
        #添加如下内容:

        #!/bin/bash
        while true
        do
        echo hello > /dev/null
        done
    chmod +x loop.sh
    cp -p loop.sh loop1.sh     #-p:带属性拷贝(比如:权限、所有者、所属组等等)
    ll loop*
        -rwxr-xr-x 1 root root 52 Aug 12 10:40 loop1.sh
        -rwxr-xr-x 1 root root 52 Aug 12 10:40 loop.sh
### 1)在运行程序时,直接指定nice值
nice -n 7 ./loop.sh &
    [1] 10818
nice -n 14 ./loop1.sh &
    [2] 10822
top
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND   
    10818 root      27   7  103m 1192 1028 R 80.0  0.1   1:10.38 loop.sh   
    10822 root      34  14  103m 1192 1028 R 16.6  0.1   0:12.99 loop1.sh
**从上述实验看出,nice越大,抢占资源越少。**

### 2)使用renice调整运行中的进程的nice值
说普通用户调整进程的nice值,只能往高调,抢占资源能力变弱。
renice 19 10818
    10818: old priority 7, new priority 19
top
killall loop.sh
killall loop1.sh
### 3)进程调度

* ctrl+Z:转入后台并且停止
* jobs:查看处于后台的任务离别
* fg:将后台的进程恢复前台运行,可指定任务号
* ctrl+c:中断正在执行的命令
* kill:终止PID  -9 强制终止  
* pkill:根据 特定条件终止进程
  * -t:停止终端进程
  * -U:按用户名终止进程
        
----
>  **如果你发现一个进程占用资源非常多,怎么办?**
> 
>   * 1)如果进程是你的,将其nice值调高,让其他进程优先运行。
>   * 2)如果进程不是你的,可以将其杀死。

----