11 进程管理

通过阅读本章,你将会了解到以下几项内容。

  • 显示进程
  • 进程前后台切换
  • 对进程的生杀予夺

11.1 何谓进程

参考网页:

Linux 是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。

进程是指正在执行的程序;是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的输入组成。进程的一个比较正式的定义是∶在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的,进程不是程序,虽然它由程序产生。程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而且一个程序可以启动多个进程。

系统运行时,会为每个进程分配当前唯一的数字标识,PID(Process ID),其他进程在该进程存活期间是无法抢占该PID的,当然,该进程结束了,系统会回收该PID的。

除了PID号外,进程还会与特定的用户帐户和组帐户相关联。这些账户信息有助于确定进程可以访问的系统资源。例如,进程运行时,root 根用户进程比普通用户进程在访问系统文件和资源方面有更多的权限。

有效管理进程,有助于我们更好的控制电脑。进程的信息一般存储与 /proc 文件夹,每个进程将其信息存储在/proc的子目录中,以进程 PID 命名。你可以使用 cat,less 以及其他编辑器查看这些文件。

11.2 深度系统监视器管理进程

深度系统监视器

深度系统监视器是深度科技团队打造一款直观易用的系统监视器应用,它可以实时监控处理器状态、内存占用率、网络上传下载速度;还可以管理您的系统进程和应用进程,支持搜索进程和强制结束进程。

标签显示,快速定位

通过标签分类的方式显示:应用程序进程、我的进程和所有进程,快速切换自己想要的进程显示;同时应用程序进程名称国际化处理,进程名称一目了然。当需要快速定位到某个进程时,可以快速搜索定位。

标签显示,快速定位

列表展示,高效右键

系统的进程采用列表方式展示,可以自定义处理器、内存、磁盘写入、磁盘读取、下载、上传、进程号是否显示,还可以根据列表排序显示;同时对进程还可以右键菜单快速操作。

列表展示,高效右键

捕捉窗口,即点即“杀”

当在使用系统的过程,不知道进程的ID或者想直接结束某个应用进程,只需点击菜单中强制结束进程选项,自动采用红色透明遮框捕捉窗口,点击即可结束进程。

捕捉窗口,即点即“杀”

大家可以通过更新系统以获取深度系统监视器V1.0,或者直接在深度商店搜索下载。也可以采用命令行安装。

$ sudo apt-get install deepin-system-monitor -y

11.3 命令方式查看进程

参考网页:

要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令。使用该命令,可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等。

ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;

如果想对进程时间监控并进行操作,应该用 top 工具。

如果直接用ps命令,会显示所有进程的状态,通常结合grep命令查看某进程的状态。grep命令已经在前面第10章介绍过了。

11.3.1 ps 命令基本用法

按照man ps的说法,

This version of ps accepts several kinds of options:

  1. UNIX options, which may be grouped and must be preceded by a dash.
  2. BSD options, which may be grouped and must not be used with a dash.
  3. GNU long options, which are preceded by two dashes.

ps的选项支持三种方式,

  1. UNIX 风格选项,可以组合且必须以短横线-开头,类似第8章介绍的。
  2. BSD 风格选项,可以组合且不可使用短横线。
  3. GNU 长风格选项,也即第8章提到的双短横线--开头的选项。

不同风格的选项可以混用,但是部分选项可能会相互冲突,比如ps auxps -aux并不完全一样,详情请参考man ps,这里不转载他们的内容了。下面介绍常用的几个例子。下面例子未经上机测试。特殊字符$,&在代码中由于是mathtype=true,需要特别关注。

$ # To see every process on the system using standard syntax:
$ ps -e
$ ps -ef
$ ps -eF
$ ps -ely
$ # To see every process on the system using BSD syntax:
$ ps ax
$ ps axu
$ # 查找包含php的进程
$ ps aux|grep php
$ # To print a process tree:
$ ps -ejH
$ ps axjf
$ # To get info about threads:
$ ps -eLf
$ ps axms
$ # To get security info:
$ ps -eo euser,ruser,suser,fuser,f,comm,label
$ ps axZ
$ ps -eM
$ # To see every process running as root (real \& effective ID) in user format:
$ ps -U root -u root u
$ # To see every process with a user-defined format:
$ ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
$ ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
$ ps -Ao pid,tt,user,fname,tmout,f,wchan
$ # --sort=-rss是输出结果安装 rss从大到小排序,rss前正负号是否倒序。
$ ps -eo pid,user,group,gid,vsz,rss,comm --sort=-rss | less
$ # Print only the process IDs of syslogd:
$ ps -C syslogd -o pid=
$ # Print only the name of PID 42:
$ ps -q 42 -o comm=

对各个选项的简单解释如下,摘自:https://www.cnblogs.com/w10234/p/5642552.html

  1. ps a 显示现行终端机下的所有程序,包括其他用户的程序。
  2. ps -A 显示所有程序。
  3. ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
  4. ps -e 此参数的效果和指定“A”参数相同。
  5. ps e 列出程序时,显示每个程序所使用的环境变量。
  6. ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
  7. ps -H 显示树状结构,表示程序间的相互关系。
  8. ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
  9. ps s 采用程序信号的格式显示程序状况。
  10. ps S 列出程序时,包括已中断的子程序资料。
  11. ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
  12. ps u  以用户为主的格式来显示程序状况。
  13. ps x  显示所有程序,不以终端机来区分。

11.3.2 top 命令基本用法

top动态实时的显示当前资源占用情况,如图11.1,并允许你对进程操作。如果你需要对所有的进程都能够生杀予夺,可能你需要root根权限。

\begin{figure}

{\includegraphics[width=100%]{images/top-showing}

}

\end{figure}

解释

  1. 图中红色矩形框圈出的,表示当前时间22:19:51,已经开机运行了多长时间13min(分钟),当前有1个用户,当前CPU负载。
  2. 图中手划线的分别表示进程统计信息Tasks、CPU及Ni等的信息%Cpu(s)、内存占用情况(单位:MiB)MiB Mem、交换空间占用情况(单位:MiB)MiB Swap。对于MiB以及MB单位的区别,
  3. 按下h键,会弹出帮助信息。如图11.2所示。按下q或者esc键,返回到top命令界面。想看更多信息,可以man top或者必应百度一下。
  4. 按下MP,分别表示安装内存和CPU排序,数字1显示更多CPU,R表示正倒序切换。
  5. 按下u,紧接着输入用户名回车,查看特定用户的进程。直接回车查看所有用户的进程。

\begin{figure}

{\includegraphics[width=100%]{images/top-help}

}

\end{figure}

众所周知,在计算机中是采用二进制,在电脑世界里,以2的次方数为“批量”处理Byte会方便一些,整齐一些。每1024Byte为1KB,每1024KB为1MB,每1024MB为1GB,每1024GB为1TB,而在国际单位制中TB、GB、MB、KB是“1000进制”的数,为此国际电工协会(IEC)拟定了“KiB”、“MiB”、“GiB”的二进制单位,专用来标示“1024进位”的数据大小;而硬盘厂商在计算容量方面是以每1000为一进制的,每1000字节为1KB,每1000KB为1MB,每1000MB为1GB,每1000GB为1TB

参考网页: https://blog.csdn.net/u012256258/article/details/52565500

调整进程

通常我们使用top是电脑太卡了,想要看看哪些进程占用CPU或者内存过多。上面提到的按键MP分别实现内存和CPU占用的排序,就非常有用,按R实现正倒序的切换。非常方便。接下来就需要对相关进程“ 动手” 啦。

  1. 降低权重,减小优先级。其实就是图11.1NIPR那两栏。关于优先级的内容,详情见下文。在top下可以按r(表示renice调整好感值)键,接着输入你想提高好感(NI)的进程PID,回车后再给他一个好感值。一般情况,对于普通用户只能提高进程的好感值,无权降低。好感值(NI)越高,占用资源的权限就越低,详细内容后面再说。
  2. 干掉进程。当你知道某个进程PID,就可以按下k(表示kill干掉键,接着输入该PID,最后输入kill命令的选项值,比如15清屏或者绝情些用9

11.4 进程的分类

当你使用Putty远程连接服务器时,只有一个终端,你想后台跑一个程序,但是在此同时还想干其他事情,怎么办呢?那就用上后台程序啦。

在 Linux 中主要有两种类型的进程:

  • 前台进程(也称为交互式进程) - 这些进程由终端会话初始化和控制。换句话说,需要有一个连接到系统中的用户来启动这样的进程;它们不是作为系统功能/服务的一部分自动启动。
  • 后台进程(也称为非交互式/自动进程) - 这些进程没有连接到终端;它们不需要任何用户输入。

什么是守护进程

这是后台进程的特殊类型,它们在系统启动时启动,并作为服务一直运行;它们不会死亡。它们自发地作为系统任务启动(作为服务运行)。但是,它们能被用户通过 init 进程控制。

11.4.1 怎么生成后台进程呢?

我感觉我的理解可能有误,比如我知道evince PDF阅读器不锁定文件的修改,当你修改了PDF文件,可以从evince上直接看到变化。这对于编写本书反复编译太有帮助了。但是编译本书要运行make命令,我习惯只打开一个终端,我就可以让evince程序运行于后台。有这么几种方法,

  • 在命令行末尾加&
  • 使用at命令(没有例子)。
$ evince _book/deepin-bible.pdf &
[1] 19589

解释

  1. [1]表示,后台进程序号。19589是进程号PID。

如果想查看当前有多少后台进程。使用命令jobs

$ jobs
[1]   运行中               evince _book/deepin-bible.pdf &
[2]-  已停止               man top
[3]+  已停止               vim ~/test.md

解释

  1. 使用jobs会弹出当前正在运行的后台程序。还会显示他们的状态,比如运行中、已停止等。
  2. [3]+,的+-号,表示最新和次新加入后台的进程。就是最后两个加入后台的进程。但是这个貌似不是非常准确。man top不是最新加入后台的进程,但是却被标注为最新加入的。好在这个不怎么影响,后面再去找资料核实。

有时还需要把这些后台再拉回前台来,fg表示foreground的意思,就可以派上用场了。先看看fg的用法。貌似,不带%也不影响结果。需要核实。

$ fg % # 把最新的进程,也就是带`+`的进程放到前台。
$ fg %n # n表示`jobs`命令中[n]
$ fg %string # string 表示命令,比如 `vim`,前提是不混淆。
$ fg %?string # ?string表示 string 在任意位置。
$ fg %-- # 倒数第二个已停止的进程拉回前台。