linux进程管理

进程在并发概念的基础上建立,详细内容可以参照我的另一篇博客进程原理

这一部分内容也就对应了windows图形界面的任务管理器,任务计划程序等很多功能

进程管理

1.进程的概念

进程是已启动的可执行程序的运行实例,进程有以下组成部分:

  • 一个文件
  • 被分配内存的地址空间
  • 有权限限制
  • 程序代码的一个或多个副本(也叫执行线程)
  • 像人一样拥有状态
  • cpu和已花费的实际时间
  • 网络
  • pid(进程的号码) ppid

2.静态查看进程ps

解释

ps aux | head -2

1
2
USER  PID   %CPU   %MEM  VSZ    RSS  TTY  STAT  START  TIME  COMMAND 
root 1 0.0 0.6 12809 5708 ? Ss 16:20 10:01 /user/lib/systemd/systemd

第一列:USER:运行进程的用户

第二列:PID:进程ID

第五列:VSZ:占用虚拟内存(硬盘)

第六列:RSS:占用实际内存

第七列:TTY:进程状态

第八列:STAT:进程状态

第九列:TIME:进程启动时间

第十列:COMMAND:进程文件,进程名

参数:

ps a显示现行终端机下的所有程序

ps u以用户为主的格式来显示程序状况

ps x不以终端机来区分

进程排序

语法:ps aux —sort% cpu 以cpu占用来0排序

进程的父子关系

语法:ps -ef(all processes全部进程)(full全格式) PPID就是PID的父程序,通过杀死ppid就可以杀死pid进程

1
2
3
UID         PID   PPID  C STIME TTY          TIME CMD
root 3 2 0 15:11 ? 00:00:00 [rcu_gp]
root 4 2 0 15:11 ? 00:00:00 [rcu_par_gp]

自定义显示字段

ps axo user,pid,ppid,%mem | head -3

3.动态查看进程top

ps是静态的,是调用这一命令的那一时刻的资源占用等信息

top是动态的,是实时的任务管理器

1
2
3
4
5
6
7
8
9
10
11
12
top - 15:40:52 up 29 min,  3 users,  load average: 0.02, 0.01, 0.02
Tasks: 274 total, 1 running, 273 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 1.5 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1806.1 total, 110.6 free, 1076.1 used, 619.4 buff/cache
MiB Swap: 2048.0 total, 2047.2 free, 0.8 used. 554.2 avail Mem
-----------------------------------------------------------
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
691 root 16 -4 149320 2024 1424 S 0.3 0.1 0:00.70 auditd
7209 root 20 0 666224 23972 18676 S 0.3 1.3 0:00.17 gsd-color
7781 root 20 0 159744 6196 4636 S 0.3 0.3 0:05.92 sshd
1 root 20 0 179004 13924 9104 S 0.0 0.8 0:01.34 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd

上面部分:性能

第一行:程序的名称和时间

1
2
top - 15:40:52 up 29 min,  3 users,  load average: 0.02, 0.01, 0.02
程序名 系统时间 运行时间 登录用户数 cpu负载 :三个时间点来呈现

第二行:个状态进程数

1
2
Tasks: 274 total,   1 running, 273 sleeping,   0 stopped,   0 zombie
总进程数 运行数 睡眠数175 停止数 僵死数

第三行:cpu占用率百分比

1
2
%Cpu(s):  0.5 us,  1.5 sy,  0.0 ni, 98.0 id,   0.0 wa,  0.0 hi,  0.0 si,  0.0 st
用户 系统 ni优先级 |98%闲着)ID空闲|等待 hi硬件 si软件 st虚拟机

第四行:实际内存

1
2
MiB Mem :   1806.1 total,    110.6 free,   1076.1 used,    619.4 buff/cache
2G 内存 0.1G空闲

第五行:虚拟内存(交换分区)

1
MiB Swap:   2048.0 total,   2047.2 free,      0.8 used.    554.2 avail Mem

下面部分:进程

和静态查看进程同样的分析方法

参数

top+回车立刻刷新。按z彩色显示,F通过光标设置

,P按cpu占用排序,M按mem占用排序,k加回车杀死选中的进程号

top -d 3 -p 1,2,3

查看1,2,3号进程,每过3秒刷新一下

例子:通过vim命令编辑文档,查看这一进程的动态信息

  1. 获取进程号:ps aux |grep vim
  2. top查询:top -d 2 -p 8788

4.信号控制进程运行

给进程发送信号:(kill -l列出所有支持的信号)

编号 | 信号名

1 SIGHUP重新加载配置(重启)

2 SIGINT键盘中断CTRL+C

3 SIGQUIT键盘退出Ctrl+\,类似SIGINT

9 SIGKILL强制终止,无条件(杀死)

15 SIGTERM终止(正常关闭),缺省信号

例子1:

1
2
3
4
5
6
kill -15 8317     //给开的8317号vim进程发送-15信号
结果:
Vim: Caught deadly signal TERM
Vim: Finished.
已终止
[root@localhost ~]#

例子2:

1
2
3
kill -9 9127      //给开的9127号vim进程发送-15信号
结果:
11111111111已杀死

5.进程优先级nice

值越大优先级越低

优先级的范围和特性(-20-19)

top中显示的优先级有两个,PR和nice

系统自身的调整范围PR:-99-39

nice调整的优先级范围只是系统范围的一部分,nice的值再加上20才能对应系统的PR值

查看不同nice级别的进程

语法:ps axo pid,command,nice —sort=- nice //将进程按nice值排序

查看进程的PR值(真正优先级)

通过top查询可以看到

调整优先级

  1. 启动时设置优先级:nice -n -5 sleep 500 &
  2. 修改运行着的优先级:renice -20 3881

6.作业控制

后台运行

foreground:前台进程,是在终端中运行的命令,占领终端

background:后台进程,没有控制终端,他不需要终端的交互。看不见,但是在运行

如sleep 200,当前终端就已经无法注入命令。

sleep 200 & ,该命令就在后台运行。终端可以继续操作

查看后台进程

jobs

第一列,进程打开的顺序

第二列,运行中

第三列:执行语句

调动后台进程至前台

fg 4

将4号后台进程调至前台执行。

ctrl z

键盘中止,使当前进程暂停

bg 4

又能将该进程进程调至后台执行。

消灭后台进程

kill %1

注意:kill 1和kill 1%不同

前者为终止PID为1的进程(就把系统进程给干掉了)

后者杀死作业序号为1的后台程序

7.虚拟文件系统

采集服务器自身内核、进程运行的状态信息

cpu: /proc/cpuinfo

内存:/proc/meminfo

内核:/proc/cmdline

8.管道和重定向

重定向

(覆盖) >>(追加) < <<

​ 对程序的输出进行引导

1
2
3
4
mkdir dec1 > dec1.txt
dec1目录被创建,但是dec1.txt并没有信息
mkdir -v dec1 > dec1.txt
dec1.txt显示目录创建信息
  1. FD简介:(范围0-255)

    file descriptors,FD,文件描述符,文件句柄进程使用文件描述符来管理打开的文件。

    总而言之:FD就是一堆数字,是已打开文件的代号,由这些代号在程序中引用文件。就是一个通向文件的链接。

    0号:标准输入,例如键盘输入就存储在/dev/stdin,再通过FD进入程序

    1.2号:终端,可以理解为屏幕?dev/pst/0 、1

    1号:标准输出

    2号:标准错误输出

    3+:普通文件

  2. 输出正确重定向:

    1> 就等价于 > 1>1.txt 将本来应该输出到终端上的内容重定向到1.TXT中。

    1>> 就等价于 >>

    输出错误重定向:

    2> 2>>

    输出不管正确与否都对其执行重定向:
    ls /home/ /aaaaaaa 1> yes.txt 2>no.txt

    ls /home/ /aaaaaaa &> /dev/null 引导至垃圾桶

  3. 输入重定向

    例1

    发送邮件:

    mail -s “test01” alice + 邮件内容

    mail -s “test01” alice < word.text

    例2

    看看文件内容

    cat < /etc/hosts

  4. 重定向总结:

    执行程序都写在左侧

    输出重定向就是将程序执行结果引导至别的文件;相当于有return结果的方法进行复制

    ls -l file1 1> a.txt 即return到终端上的结果赋值给了a.txt

    输入重定向就是给可执行程序一个输入;类似于给方法传参

    cat < /etc/hosts 就是给读文件方法传入了一个参数

管道

  1. 进程管道Piping

    管道命令可以将多条命令组合起来,一次性完成复杂的处理任务

    语法:command1 | command2 | command3 |…

    1
    cat /etc/passwd | grep "root" | head -1
  2. tee管道

    类似三通,在执行管道命令的同时将输出保存在文件中

    1
    cat /etc/passwd |tee file1.txt | head -1
  3. 参数传递(xargs)

    转换。cp,rm等一些特殊命令不遵守管道命令

1
2
cat file1 | rm -rvf  并不能执行删除命令
cat file1 | xargs rm -rvf 这时候就可以执行了(v是可视的意思)