Linux进程详解(非常详细且入门)---ps、top、kill、fg

常见的操作系统都支持多重任务处理(multitasking)——系统通过快速切换运行中的程序来实现多任务的同时执行。Linux内核通过使用进程来管理多重任务。进程是Linux用来安排不同程序等待CPU调度的一种组织方式。

1.进程如何工作

系统启动时,内核先把它的一些程序初始化为进程,然后运行一个成为init的程序。init程序将依次运行一系列称为脚本初始化(init script)的shell脚本(放在/etc目录下),这些脚本会启动所有的系统服务。其中很多服务都是通过守护程序(daemon program)来实现的。而后台程序只是待在后台做它们自己的事情,并且没有用户界面。
一些程序的运行可以触发其它程序的运行,在进程系统中这样的情况被表述为父进程创建进程。
内核会保存每个进程的信息以确保任务有序进行,比如每个进程将会被分配一个成为**进程ID(PID, process ID)**的号码。进程ID是按递增顺序来分配的,init进程的PID始终为1.

1.1 使用ps命令查看进程信息

$ ps
   PID TTY          TIME CMD
273916 pts/31   00:00:00 bash
295762 pts/31   00:00:00 ps

这个例子有两个进程:进程5198和进程10129,分别对应bash和ps命令.
可以在ps后增加选项,获得反映系统运行情况的更大的视图界面.

$ ps x
   PID TTY      STAT   TIME COMMAND
 27789 ?        Ss     0:02 SCREEN -S down
 27790 pts/73   Ss+    0:00 /bin/bash
 31195 ?        Ss     0:05 SCREEN -S train00
 31196 pts/82   Ss     0:00 /bin/bash
201867 ?        S      0:05 sshd: lixj@pts/93
201892 pts/93   Ss+    0:00 -bash
203115 pts/82   S+     2:56 wget https://datasets.appen.com/appen_datasets/open-images/zip_files_copy/train_00.zip
273873 ?        S      0:14 sshd: lixj@pts/31
273876 ?        S      0:00 sshd: lixj@notty
273877 ?        Ss     0:00 /usr/libexec/openssh/sftp-server
273916 pts/31   Ss     0:00 -bash
273925 ?        Ss     0:03 bash -c while [ -d /proc/$PPID ]; do sleep 1;head -v -n 8 /proc/meminfo; head -v -n 2 /proc/stat /p
296802 pts/31   R+     0:00 ps x
296808 ?        S      0:00 sleep 1

其中TTY列中出现的“?”表示没有控制终端。
这里增加了个新列STAT,是state的缩写,显示的是进程的当前状态。详情如表1
表1 进程状态

状态含义
R运行状态。进程正在运行或者准备运行
S睡眠状态。进程不在运行,而是在等待某事件发生,如键盘输入或者受到网络报表
D不可中断的睡眠状态。进程在等待I/O操作,如硬盘驱动
T暂停状态。进程在等待I/O操作,如硬盘驱动
Z无效或者“僵尸”进程。子进程被终止,但是还没有被其父进程彻底释放掉
<高优先级进程。进程可以被赋予更多的重要性,分配更多的CPU时间。进程的这一特性称为优先级(niceness)。高优先级的进程被说成较不友好,是因为它将消耗更多的CPU时间,这样留给其它进程CPU时间就会变少。
N低优先级进程。低优先级进程(友好进程,a nice process)只有在其它更高优先级的进程使用完处理器后才能获得使用处理器的时间.

ps还可以带aux选项,注意,这里不带前置连字符,将输出更多信息。

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
deepid-1  7273  0.0  0.0 238316  7060 ?        Sl   Jun05   0:00 /usr/lib/gnome-online-accounts/goa-identity-service
root      7307  0.0  0.0      0     0 ?        S    15:04   0:00 [kworker/3:0]
colord    7316  0.0  0.1 243300 12216 ?        Ssl  Jun05   0:00 /usr/lib/colord/colord
deepid-1  7367  0.0  0.7 926824 60292 ?        Sl   Jun05   0:00 /usr/lib/evolution/evolution-calendar-factory-subprocess --fac

该选项组合将会显示属于每个用户的进程信息,使用这些选项时不带前置连字符使得命令以“BSD模式”。
表2 BSD模式下ps输出的列标题

标题含义
USEER用户ID,表示该进程的所有者
%CPUCPU使用百分比
%MEM内存使用百分比
VSZ虚拟耗用内存大小
RSS实际使用的内存大小。进程使用的物理内存(RAM)大小(以KB为单位)
START进程开启的时间,如果数值超过24小时,那么将使用日期来显示

1.2 使用top命令动态查看进程信息

ps仅仅是提供的在命令被执行时刻机器状态的快照,要查看机器运行情况的动态视图,可以使用top

$ top

top将按照进程活动的顺序,以列表的形式持续更新显示系统进程的当前信息,主要用于查看系统“最高(top)”进程的运行情况。
主要分为两部分,顶部是系统总体状态信息,下面是按CPU活动时间排序的进程情况表。

$ top
top - 15:52:31 up 2 days, 19:39,  2 users,  load average: 1.19, 1.08, 0.99
Tasks: 311 total,   2 running, 309 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.9 us,  1.3 sy,  0.0 ni, 91.4 id,  0.1 wa,  1.2 hi,  0.1 si,  0.0 st
KiB Mem :  8040348 total,    81664 free,  5791884 used,  2166800 buff/cache
KiB Swap:  4020168 total,  3985712 free,    34456 used.  1990220 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
13545 deepid-1  20   0 21.190g 2.374g 891320 R  37.9 31.0   1885:23 python3
13445 deepid-1  20   0   11000   3756   2872 R   1.3  0.0   0:00.30 top
 6480 root      20   0 24.288g  69412  53420 S   1.0  0.9  18:26.79 Xorg
 1846 root     -51   0       0      0      0 S   0.3  0.0   0:58.04 irq/52-d230000.
 4335 root      20   0       0      0      0 S   0.3  0.0   1:55.73 dhd_watchdog_th
 4336 root     -51   0       0      0      0 S   0.3  0.0   2:38.68 dhd_dpc
 5504 root     -51   0       0      0      0 S   0.3  0.0   5:06.20 sugov:1
 7248 deepid-1  20   0  739508 111436  65760 S   0.3  1.4   5:13.67 compiz
 8244 deepid-1  20   0   12748   5652   4472 S   0.3  0.1   0:01.57 sshd

表3 顶部信息中的字段

字段含义
1top程序名
115:52:31当前时间
1up 2 days正常运行时间(uptime),从机器最后一次启动开始计算的时间总数,这个例子中,系统已经运行了2天
12 users有两个用户已登录
1load average负载均值指的是等待运行的进程数,即共享CPU资源的处于可运行状态的进程数。第一个代表前60s的均值,第二个代表前5min的均值,第三个代表前15min的均值。该值小于1.0表示该机器不忙
2Tasks统计进程数及各个进程的状态信息
35.9 us5.9%的CPU时间被用户进程占用,这里指的是处于内核外的进程
31.3 sy1.3%的CPU时间被系统进程(内核进程)占用
30.0 ni0.0%的CPU时间被友好进程(nice)(低优先级进程)占用
391.4 id91.4%的CPU时间是空闲的
30.1 wa0.0%的CPU时间来等待I/O操作
4Mem显示物理RAM(随机存取内存)的使用情况
5Swap显示交换空间(虚拟内存)的使用情况

2.控制进程

我们使用xlogo的小程序测试对进程的控制。

$ xlogo

2.1 中断程序

在终端按下Ctrl+C将会终端(interrupt)一个程序,它意味着我们委婉地请求程序结束。许多命令行程序都可以这样中断。

2.2 使进程在后台运行

想要shell提示符返回,但又不终止程序,可以让程序在后台(background)运行来实现。只需要在命令后面加上和号字符(&)来实现。

$ xlogo &
[1] 23458
$

打印的信息为shell的一个称为作业控制(job control)的特性表现。
打印的这条信息的意思是,已经启动的作业编号为1([1]),其对应的PID是23458.

2.3使进程回到前台运行

使用fg命令可以使进程回到前台运行

$ jobs
[2]+  Running                 xlogo &
$ fg %2
xlogo

2.4 停止(暂停)进程

如果我们只是想暂停进程,而不是终止今晨,我们为了暂停前台进程需要按下Ctrl+Z键.

$ xlogo
^Z
[1]+  Stopped                 xlogo

可以通过使用fg命令让进程在前台恢复运行,也可以使用bg命令让进程移到后台运行.

$ fg %1
xlogo

3. 信号

kill命令通常用来“杀死”(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序
例如

$ xlogo &
[1] 23638
$ kill 23638

kill准确来说并不是“杀死”进程,而是给进程发送信号(signal)。信号是操作系统和程序间通信的多种方式之一,在使用Ctrl-C键和Ctrl-Z键时已经见识过信号的作用。当终端接受其中一个输入时,将发送信号到前台进程;在按下Ctrl+Z的情况下,将发送一个称为TSTP(终端暂停,Terminal Stop)的信号。反过来,程序“监听”信号,而且在接收到信号的时候按照它们的指示进行操作。

3.1使用kill命令发送信号到进程

语法为

kill [-singnal] PID ...

如果没有指定信号,默认发送TERM(终止,Terminate)信号.
kill常用信号

信号编号信号名含义
1HUP挂起信号。指定程序控制终端已被“挂起”。效果通过关闭终端来表示,前台程序收到该信号后将终止,后台程序接收到该信号后,将重启并且重新读取其配置文件
2INT中断信号。与在终端下按下Ctrl+C一样,通常用来中断程序
9KILL杀死信号。该信号比较特殊,该信号不会真的发送到目标程序,而是内核立即终止该进程。此时该进程没有机会对它自己进行“清理”或者对当前工作进行保存。
15TERM终止信号。这是kill命令默认的信号类型。
18CONT继续运行信号。恢复之前接受了STOP信号的进程
19STOP暂停信号。该信号将使进程暂停,而不是终止。和KILL信号类似,该信号不会发送给目标进程,因此它不能被忽略。

例如

$ xlogo &
[3] 23786
$ kill -1 23786
$
[3]+  Hangup                  xlogo

表5 被系统使用的其他常见信号

信号编号信号名含义
3QUIT退出信号
11SEGV段错误信号。如果程序非法占用了内存空间,那么系统将发送该信号
20TSTP终端暂停信号。按下Ctrl+Z时终端将发出该信号
28WINCH窗口改变信号,当窗口改变大小时,系统将发送该信号

3.2 使用killall命令发送信号给多个进程

语法为

killall [-u user] [-signal] name ...

例如

$  xlogo &
[3] 23867
$ xlogo &
[4] 23872
$ killall xlogo
[3]-  Terminated              xlogo
[4]+  Terminated              xlogo
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值