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

2023-05-16

常见的操作系统都支持多重任务处理(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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux进程详解(非常详细且入门)---ps、top、kill、fg 的相关文章

  • 安装 Pillow 错误:安装脚本退出并出现错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

    当我尝试安装 Pillow 2 5 3 时 我收到错误 命令 x86 64 linux gnu gcc 失败 退出状态为 1 这是所发生事件的完整日志 http pastebin com 5k2TsyJY 我需要这个库作为另一个 pytho
  • Azure Nvidia 中的 apt-update 出现公钥错误

    我在 AZURE 上启动了 NVIDIA VM 并尝试使用进行更新sudo apt update但给出错误 Hit 2 http azure archive ubuntu com ubuntu focal InRelease Hit 3 h
  • 启动jetty服务器时出现NoClassDefFoundError

    我正在尝试在码头服务器中托管我的网络应用程序 spring 我将 war 文件复制到 jetty 服务器中的 webapp 文件夹中 我并不是想嵌入jetty服务器 而是试图在jetty内托管应用程序 如tomcat 我没有安装jetty
  • Bash 变量:区分大小写?

    Bash shell 脚本区分大小写吗 是可变的date与DATE 是的 它区分大小写 就像 UNIX 的其余部分一样 date and DATE是两个不同的变量 makefile and Makefile是两个不同的文件 h and H是
  • SSL 和 Tkinter 不存在于 Python 3.5.2、Debian Linux 的源代码构建中

    我刚刚将 Python 3 5 2 下载到我的 Debian 机器上并使用以下命令构建它 configure make make test sudo make install 一切正常 但在make test输出中 它显示安装程序由于未安装
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • 为所有图像添加前缀(递归)

    我有一个包含 5000 多张图像的文件夹 全部带有 JPG 扩展名 我想要做的就是递归地向所有图像添加 thumb 前缀 我发现了一个类似的问题 重命名文件和目录 添加前缀 https stackoverflow com questions
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • 用于列出用户和组的 Python 脚本

    我正在尝试编写一个脚本 在自己的行上输出每个用户及其组 如下所示 user1 group1 user2 group1 user3 group2 user10 group6 etc 我正在为此用 python 编写一个脚本 但想知道如何做到这
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • vm.dirty_ratio 和 vm.dirty_background_ratio 之间的区别?

    我目前正在试验中找到的内核参数 proc sys vm 尤其dirty ratio and dirty background ratio 内核文档对两者都有以下解释 脏背景比例 包含 以包含空闲页面的总可用内存的百分比表示 和可回收页 后台
  • Linux 中如何获取内存修改通知

    在Linux的用户空间程序中 我通过从堆中分配来获取一块内存 然后将指针分发给在其他线程中运行的许多其他组件来使用 当上述内存被修改时我想收到通知 我当然可以开发一个自定义用户空间解决方案 供其他组件在尝试修改内存时使用 我的情况的问题是这
  • 如何检测文本文件中大于 n 的一系列“空洞”(孔、与模式不匹配的线)?

    Case scenario cat Status txt 1 connected 2 connected 3 connected 4 connected 5 connected 6 connected 7 disconnected 8 di
  • 安全地记住 bash 脚本中的 ssh 凭据[重复]

    这个问题在这里已经有答案了 假设我有一个 bash 脚本 它通过 ssh 在远程计算机上执行命令 Do something here ssh otheruser host command1 Do something else ssh oth
  • 套接字发送并发保证

    如果我在两个进程 或两个线程 之间共享一个套接字 并且在这两个进程中我尝试发送一条阻塞的大消息 大于下划线协议缓冲区 是否可以保证这两个消息将按顺序发送 或者消息可以在内核内部交错吗 我主要对 TCP over IP 行为感兴趣 但了解它是
  • 每当调用 malloc/free 时输出到 stderr

    使用 Linux GCC C 每当调用 malloc free new delete 时 我想向 stderr 记录一些内容 我试图了解库的内存分配 因此我想在运行单元测试时生成此输出 我使用 valgrind 进行内存泄漏检测 但我找不到
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • bash 或 sh 中的“=”和“==”运算符有什么区别

    我意识到 和 运算符都可以在 if 语句中使用 例如 var some string if var some string then doing something fi if var some string then doing some
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se

随机推荐