Linux下进程相关知识

简介: 大家好!我是木荣,今天给大家分享一下Linux下进程相关的知识。
公众号:Linux兵工厂,领取海量Linux硬核学习资料。

1. ps命令

进程是在你的系统上运行的程序。它们由内核管理,每个进程都有一个与之关联的ID,称为进程ID(PID)。这个PID是按照进程创建的顺序分配的。

运行ps命令查看正在运行的进程列表:

ubuntu@ubuntu:~$ ps
   PID TTY          TIME CMD
  3309 pts/1    00:00:00 bash
  3794 pts/1    00:00:00 ps
ubuntu@ubuntu:~$ 
  • PID:进程ID
  • TTY:控制与进程相关联的终端
  • TIME:总CPU使用时间
  • CMD:可执行/命令的名称

如果你看一下ps的man手册,你会发现有很多命令选项可以传递,它们会根据你想使用的选项而变化输出结果。

ubuntu@ubuntu:~$ ps --help all

Usage:
 ps [options]

Basic options:
 -A, -e               all processes
 -a                   all with tty, except session leaders
  a                   all with tty, including other users
 -d                   all except session leaders
 -N, --deselect       negate selection
  r                   only running processes
  T                   all processes on this terminal
  x                   processes without controlling ttys

Selection by list:
 -C <command>         command name
 -G, --Group <GID>    real group id or name
 -g, --group <group>  session or effective group name
 -p, p, --pid <PID>   process id
        --ppid <PID>  parent process id
 -q, q, --quick-pid <PID>
                      process id (quick mode)
 -s, --sid <session>  session id
 -t, t, --tty <tty>   terminal
 -u, U, --user <UID>  effective user id or name
 -U, --User <UID>     real user id or name

  The selection options take as their argument either:
    a comma-separated list e.g. '-u root,nobody' or
    a blank-separated list e.g. '-p 123 4567'

Output formats:
 -F                   extra full
 -f                   full-format, including command lines
  f, --forest         ascii art process tree
 -H                   show process hierarchy
 -j                   jobs format
  j                   BSD job control format
 -l                   long format
  l                   BSD long format
 -M, Z                add security data (for SELinux)
 -O <format>          preloaded with default columns
  O <format>          as -O, with BSD personality
 -o, o, --format <format>
                      user-defined format
  s                   signal format
  u                   user-oriented format
  v                   virtual memory format
  X                   register format
 -y                   do not show flags, show rss vs. addr (used with -l)
     --context        display security context (for SELinux)
     --headers        repeat header lines, one per page
     --no-headers     do not print header at all
     --cols, --columns, --width <num>
                      set screen width
     --rows, --lines <num>
                      set screen height

Show threads:
  H                   as if they were processes
 -L                   possibly with LWP and NLWP columns
 -m, m                after processes
 -T                   possibly with SPID column

Miscellaneous options:
 -c                   show scheduling class with -l option
  c                   show true command name
  e                   show the environment after command
  k,    --sort        specify sort order as: [+|-]key[,[+|-]key[,...]]
  L                   show format specifiers
  n                   display numeric uid and wchan
  S,    --cumulative  include some dead child process data
 -y                   do not show flags, show rss (only with -l)
 -V, V, --version     display version information and exit
 -w, w                unlimited output width

        --help <simple|list|output|threads|misc|all>
                      display help and exit

For more details see ps(1).

常用的操作命令:

ps aux

0.png

  • USER:有效用户(我们正在使用其访问权限的用户)
  • PID:进程号
  • %CPU: CPU使用时间除以进程运行时间
  • %MEM:进程的常驻集大小与机器上物理内存的比率
  • VSZ:整个进程的虚拟内存使用情况
  • RSS:常驻集大小,任务使用的非交换物理内存
  • TTY:控制与进程关联的终端
  • STAT:进程状态码
  • START:进程的开始时间
  • TIME:总CPU使用时间
  • COMMAND:可执行文件/命令的名称

另一个非常有用的命令是top命令,top为你提供有关系统上运行的进程的实时信息,而不是快照。默认情况下,你会每10秒刷新一次。top是一个非常有用的工具,可以查看哪些进程占用了大量资源。此处我们对top命令不做过多的讲解,想了解的小伙伴可以查看我之前的文章,有对top命令做详细的讲解。

2. 进程的细节

在我们深入了解进程的更多实际应用之前,我们必须了解它是什么以及它是如何工作的。

我们上面说过,进程是系统上正在运行的程序,更准确地说,它是系统分配内存、CPU、I/O以使程序运行的过程。一个进程是一个正在运行的程序的实例,打开3个终端窗口,在两个窗口中运行cat命令,不传递任何选项(cat进程将作为一个进程保持打开状态,因为它期望stdin)。现在在第三个窗口运行:ps aux | grep cat。 将看到cat有两个进程,尽管它们调用的是同一个程序。
1.png

内核负责进程,当我们运行一个程序时,内核将程序的代码加载到内存中,确定和分配资源,然后监视每个进程:

  • 进程的状态
  • 进程正在使用和接收的资源
  • 进程所有者
  • 进程信号处理
  • 基本上所有的其他事情

所有进程都在占用资源,内核的工作是确保进程根据自身需求获得正确数量的资源。当一个进程结束时,它所使用的资源将被释放给其他进程使用。

3. 进程创建

当创建一个新进程时,现有进程基本上会使用称为fork系统调用的函数克隆自己。fork系统调用创建了一个基本相同的子进程,这个子进程有一个新的进程ID(PID),原始进程成为它的父进程,并有一个称为父进程ID PPID的东西。之后,子进程可以继续使用其父进程之前使用的相同程序,或者更经常地使用execve系统调用来启动一个新程序。这个系统调用破坏了内核为该进程设置的内存管理,并为新程序设置了新的内存管理。

2.png

l选项为我们提供了正在运行的进程的“长格式”甚至更详细的视图。你会看到一个标记为PPID的列,这是父ID。现在看看你的终端,你将看到正在运行的进程是你的shell,因此在我的系统上有一个运行bash的进程。现在请记住,当你运行ps l命令时,是从运行bash的进程中运行它的。bash shell的PID是ps l命令的PPID。

当系统启动时,内核创建了一个名为init的进程,它的PID为1。除非系统关闭,否则无法终止init进程。它以根权限运行,并运行许多保持系统运行的进程。

4. 进程终止

上面我们知道创建进程时会发生什么,那么当我们不再需要它时会发生什么呢?

进程可以使用_exit系统调用退出,这将释放进程用于重新分配的资源。因此,当一个进程准备终止时,它会用一个叫做终止状态的东西让内核知道它为什么要终止。通常情况下,状态为0表示进程终止成功。然而,这还不足以完全终止一个流程。父进程必须通过使用等待系统调用来确认子进程的终止,这是为了检查子进程的终止状态。

  • 孤儿进程
    当父进程在子进程之前死亡时,内核知道它不会得到一个等待调用,所以它会让这些进程成为“孤儿”,并将它们置于init(记住所有进程的父进程)的照顾下。init将最终为这些孤儿执行等待系统调用,以便它们可以终止。
  • 僵尸进程
    当子进程终止而父进程还没有调用wait时会发生什么? 我们仍然希望能够看到子进程是如何终止的,因此即使子进程完成了,内核也会将子进程变成僵尸进程。子进程使用的资源仍然被释放给其他进程使用,但是进程表中仍然有这个僵尸进程的条目。僵尸进程也不能被杀死,因为它们在技术上是“死亡”的,所以你不能使用信号来杀死它们。最终,如果父进程调用等待系统调用,僵尸进程将消失,这被称为“收割”。如果父进程没有执行等待调用,init将收养僵尸进程并自动执行等待并移除僵尸进程。僵尸进程太多可能是一件坏事,因为它们会占用进程表上的空间,如果它被填满,就会阻止其他进程运行。

5. 信号

信号是对进程的通知,告诉它发生了什么事情。

为什么有信号?

它是软件中断,有很多用途:

  • 用户可以输入一个特殊的终端字符(Ctrl-C)或(Ctrl-Z)来终止、中断或挂起进程
  • 硬件问题发生时,内核想要通知进程
  • 软件问题发生时,内核想要通知进程
  • 进程通信的方式

信号处理

当一个信号由某个事件生成时,它被传递给一个进程,在传递之前它被认为处于挂起状态。当进程运行时,信号将被传递。但是,进程具有信号掩码,如果指定的话,它们可以将信号传递设置为阻塞。当一个信号被传递时,进程可以做很多事情:

  • 忽略信号
  • “捕获”信号并执行特定的处理程序例程
  • 进程可以终止,而不是正常的退出系统调用
  • 阻塞信号,取决于信号掩码

常见的信号

每个信号都由具有符号名的整数定义,符号名的形式为SIGxxx。 一些最常见的信号是:

  • SIGHUP或HUP或1:挂机
  • SIGINT或INT或2:中断
  • SIGKILL或KILL或9:杀死
  • SIGSEGV或SEGV或11:分割错误
  • SIGTERM或TERM或15:软件终止
  • SIGSTOP或STOP:停止

数字会随着信号的变化而变化,所以通常用它们的名字来表示。

有些信号是不可阻挡的,例如SIGKILL信号。KILL信号杀死进程。

6. kill命令

可以发送终止进程的信号,这样的命令被命名为kill命令。

kill 12345

12345是要终止的进程的PID。默认情况下,它发送一个TERM信号。SIGTERM信号被发送到进程,进程释放其资源并保存其状态来请求终止进程。

还可以使用kill命令指定一个信号:

kill -9 12345

这将运行SIGKILL信号并终止进程。

SIGHUP, SIGINT, SIGTERM, SIGKILL, SIGSTOP信号

这些信号看起来都相似,但它们确实有不同之处。

  • SIGHUP 挂起,当控制终端关闭时发送给进程。例如,如果关闭了一个终端窗口,其中正在运行一个进程,那么将得到一个SIGHUP信号。
  • SIGINT 是一个中断信号,因此可以使用Ctrl-C,系统将尝试优雅地终止进程
  • SIGTERM 终止进程,但允许它先做一些清理工作
  • SIGKILL 杀死进程,不做任何清理
  • SIGSTOP 停止/挂起进程

7. 进程优先级

当你在电脑上同时运行多个程序时,比如Chrome、Microsoft Word或Photoshop,看起来这些进程是同时运行的,但事实并非如此。

进程使用CPU的时间,称为时间片。然后它们暂停几毫秒,另一个进程得到一点时间切片。默认情况下,进程调度以这种循环方式进行。每个进程都有足够的时间片,直到它完成处理。内核处理所有这些进程的切换,并且大多数时候它都做得很好。

进程无法决定何时以及多长时间获得CPU时间,如果所有进程正常运行,它们将大致获得相同数量的CPU时间。但是,有一种方法可以用一个不错的值来影响内核的进程调度算法。优先级它的意思是进程有一个数字来确定它们对CPU的优先级。数值高意味着进程很好,对CPU的优先级较低,数值低或为负数意味着进程不是很好,它想要尽可能多地获得CPU。

要更改进程优先级别,可以使用nicerenice命令:

nice -n 5 apt upgrade
renice 10 -p 3245

nice命令用于设置新进程的优先级。renice命令用于设置已存在进程的优先级。

8. 进程状态

我们再来看一下:ps aux命令

在STAT列中,看到许多值。linux进程可以处于许多不同的状态。你将看到的最常见的如下所示:

0.png

  • R: running或runnable,它只是在等待CPU处理它
  • S:可中断休眠,等待一个事件完成,例如来自终端的输入
  • D:不间断睡眠,不能被信号杀死或中断的进程,通常要让它们消失,你必须重新启动或修复问题
  • Z:僵尸进程,僵尸是正在等待收集其状态的终止进程
  • T: Stopped,已挂起/停止的进程

9. /proc文件系统

在Linux中一切皆文件,包括进程。进程信息存储在一个称为/proc文件系统的特殊文件系统中。

3.png

这里看到多个值,每个PID都有子目录。如果查看ps输出中的PID,则可以在/proc目录中找到它。

进入其中一个进程并查看该文件:

4.png

你能看到进程状态信息以及更详细的信息。/proc目录是内核查看系统的方式,因此这里有比ps中更多的信息。

10. Job控制

假设你正在一个终端窗口上工作,并且正在运行一个命令,该命令将花费很长时间。在它完成之前,你不能与shell交互,但是我们希望继续在我们的机器上工作,因此我们需要打开shell。我们可以控制我们的进程如何运行:

将工作发送到后台

在命令后添加&号将在后台运行该命令:

sleep 1000 &
sleep 1001 &
sleep 1002 &

查看后台进程

5.png

将进程从后台移动到前台

要将进程移出后台,只需指定所需的进程ID。如果不带任何选项地运行fg,它将带回最近的后台进程。

6.png

相关文章
|
29天前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
29 0
|
3月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
595 2
|
3月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
64 2
|
4天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
26 4
linux进程管理万字详解!!!
|
4天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
24 4
|
5天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
6天前
|
消息中间件 存储 Linux
|
13天前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
12 1
|
24天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
18 1
|
29天前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
26 0
Linux c/c++之IPC进程间通信