普通人的视角,进程就是正在运行着的程序。
从程序员的视角来看,认知要复杂得多。进程是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的输入组成。它也是应用层运行、占据着内存、与内核时常交互的动态运行实体。
进程是由内核定义的抽象的实体,内核为进程分配用来执行程序的各项系统资源。
从内核 的层面来看,进程由用户内存空间和一系列内核数据结构组成。其中,用户内存空间包含了程序代码和代码使用的变量,内核数据结构用于维护进程的状态信息。这些记录在内核数据结构的信息有:进程标识号IDs、虚拟内存表、打开文件描述符表、信号传递及处理的相关信息、进程资源使用和限制、当前工作目录、环境变量、命令行等等大量的相关信息。
1 进程的类型
Linux 中的进程主要分两种类型:
这个也称为交互式进程 - 这些进程由终端或图形界面启动,响应用户操作。也就是说,需要用户来启动这样的进程。虽然它们部分可以设为开机启动,但它们不是作为Linux操作系统功能/服务的一部分去自动启动的。
也称为非交互式/自动进程, 这些进程没有连接到终端,它们不需要任何用户输入。这些进程以系统级服务最多。
要提一下,在Linux中还有一个很重要的进程,这是守护进程deamon。其实这种deamon进属于程后台进程的特殊类型,它们在系统启动时启动,并作为服务一直运行;它们不会死亡。它们自发地作为系统任务启动(作为服务运行)。但是,它们能被用户通过 init 进程控制。
2 linux上进程的4种状态
1. 运行Running,系统中的当前进程,或者准备运行(等待分配 CPU 单元)。
2 等待Waiting,进程正在等待某个事件的发生或者系统资源
内核也会区分两种不同类型的等待进程。一种是可中断等待进程(interruptible waiting processes,这种是可以被信号中断的,另一种就是不可中断等待进程(uninterruptible waiting processes)正在等待硬件条件,不能被任何事件/信号中断。
3. 停止Stopped,进程已经被停止了,通常是由于收到了一个信号,比如SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行。正在调试的进程一般都处于这个状态。
4. Zombie僵死,进程已终止, 但是进程表process table中仍然有它的条目,进程描述符尚在, 直到父进程调用wait4()系统调用后释放。
3 Linux 如何识别进程?
如果你没名字,怎么让别人叫你?同理,事物都是相通的,进程若无标志,Linux系统如何识别?
Linux 是一个多用户、多进程的系统,不同的用户能系统上运行各种各样的程序,而且同一程序有可能运行多个进程。比如,多人可登录到你的Linux系统,启用终端tty,你个人也可以启动多个tty。内核必须唯一标识程序运行的每个实例。
程序由它的进程 ID(PID)和它父进程的进程 ID(PPID)识别的,所以进程可分为父进程和子进程。
查找进程 ID
可以用 pidof 命令查找某个进程的进程 ID,比如Linux上所有进程的老祖宗init 进程的pid都是1:
$ pidof init
1
如果你用一个程序打开了多个实例,比如chrome打开了多个网页,pid的操作画风是这样的:
$pidof chrome
8885 7610 7588 6429 5100 5085 4547 4382 4355 4307 3598 3580 3559
3546 3514 3488 3453 3447 3413 3387 3367 3359 3355 3338 3302 3286
3270 3237 3224 3158 2874 2861 2833 2806 2677 2565 2553 2550 2528
2524 2523 2512
有两个shell命令,可以找当前 shell 的进程 ID 以及它父进程的进程 ID。
$echo $PPID
2758 父进程ID
$ echo $$
8518 当SHELL进程D
4 后台任务
从终端启动一个进程,在命令的最后使用&符号做参数,该进程就被立即送进后台。比如下面的命令系列:
也可以按Ctrl + Z 暂停执行一个程序,并把它发送到后台(按Ctrl+Z,这样当前终端会给进程发送 SIGSTOP 信号),从而暂停它的执行;它就会变为空闲进程。
要在后台继续运行上面被暂停的命令,使用 bg 命令。接上面的例子。
要把后台进程发送到前台,使用 fg 命令以及任务的 ID,类似:
5 在 Linux 中用shell命令查看活跃进程
ps、top,查看进程
ps 和 top 命令是两个最为常用的进程查看命令。这个命令的功能都很强大。熟悉这两个命令的常见用法,是在Linux中进行日常操作管理的基础。
显示进程信息,包括无终端的(x)和针对用户(u)的进程:如USER, PID, %CPU, %MEM等
ps -aux
按内存资源的使用量对进程进行排序
ps -aux | sort -rnk 4
按 CPU 资源的使用量对进程进行排序
ps -aux | sort -nk 3
按UID、PID、PPID、C、STIME、TTY、TIME、CMD
ps -ef
当然,上面的还可以用grep来过滤。
ps -ef | grep tty
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top显示进程的数据包括 PID、进程属主、优先级、%CPU、%memory等。可以使用这些显示数据指示出资源使用量。
pgrep命令
这个命令扫描当前运行的进程,然后按照命令匹配条件列出匹配结果到标准输出。对于通过名字检索进程号是很有用。
使用参数”-o“,当匹配多个进程时,显示进程号最小的那个。参数”-n“则相反,显示进程号最大的那个。
~$ pgrep -l sh 显示结果如上图所示
~$ pgrep -l -o sh
157 zswap-shrink
~$ pgrep -l -n sh
17341 gnome-screensho
pgrep支持正则表达式条件,通常会与kill命令联用,在指定条件下杀死问题进程。
pstree显示进程树
pstrees以树状图来展示进程之间的关系,可以直观的查看进程父子关系。执行时最好带“-g”参数,这样可以显示进程的PID号。
htop
top只能显示系统进程状况,但它不能与用户交互。一个可以交互的是htop,这个不是系统自带的,需要“sudo apt install htop”去安装。htop通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。
top与htop运行时,都可以按q键退出。
6 在 Linux 中用shell命令干预跃进程
kill、killall 杀死进程
kill
kill命令用于发送信号来结束进程,如果上面的命令不能杀死进程,那么带“-9”参数试试。
kill -9
不知道进程PID,或者想用名字杀死进程时候,用killall命令。
killall -9 - 杀死所有同名进程
使用kill或killall命令前一定要小心,因为进程的内部操作有可能没有完成,可能正在写入文件,你这样咔嚓一下就给杀掉了,进程没来得及清理现场就game over了,有可能带来很大风险。
htop杀死进程
因为系统进程实在太多了,在htop中如果想杀死某个进程,最好先F3查询,然后再按F9杀死。
nice、renice命令
在用top、htop显示进程时,有一列是NI,nice value,表示进程的优先级。进程优先级值的范围从-20到19。值越低,优先级越高。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。默认情况下,进程以0的优先级启动。
通过nice命令的帮助,用户可以设置和改变进程的优先级。当然,没有root权限,我们不可能达到这一目的。
sudo nice --3 kolourpaint “kolourpaint”是一个类似于windows上的画图的工具软件
然后就可以看到优先级为-3的kolourpaint进程。
renice这个命令可以改变正在运行的进程优先值。注意,用户只能改变属于他们自己的进程的优先值。
命令“renice -n -p PID” 改变指定进程的优先值,接上例,执行
$ sudo renice -n 6 -p 16217
16217 (process ID) 旧优先级为 -3,新优先级为 6
用htop查看,系统已经运行的kolourpaint进程NI值已经由-3变成了6。
7 其它一些与进程相关的命令
w命令。是的这个命令就是一个“w”。用来查看登录者的信息及他们的行为。
提供当前登录的用户及其正在执行的进程的信息。显示信息头包含信息,如当前时间、系统运行时长、登录用户总数、过去的1,5,15分钟内的负载均衡数
who命令,查看登录服务器的用户信息
whoami命令,显示自己在系统中的用户名
logname命令,可以显示自己初次登录到系统中的用户名
tty命令,来查看所连接的设备或终端
last命令,查看最近1个月用户登录服务器的情况
8 进程资源限制
ulimit命令,用来查看进程在系统上的资源限制。“ulimit -a“显示当前用户关联的资源限制。
该命令用于控制系统资源在shell和进程上的分配量。对于一般人员没有啥价值,反正你也不会要求太多的资源。但对系统管理员来说可是不一样,真正的大系统,资源管理量巨大。这个命令可以管理员,管理重度使用和存在性能问题的系统。限制资源大小,确保重要进程持续运行,调整其他进程不会占用过多资源。
Linux关于进程的命令非常丰富,且很多命令参数众多,功能强大,并且多个命令可以用管道、重定向等方式来组合实用。这里也只能是一个简介而已。