Unix / Linux - 进程管理

  • 简述

    本章将详细讨论 Unix 中的进程管理。当您在 Unix 系统上执行程序时,系统会为该程序创建一个特殊的环境。该环境包含系统运行程序所需的一切,就好像系统上没有其他程序在运行一样。
    每当您在 Unix 中发出命令时,它都会创建或启动一个新进程。当你尝试ls命令列出目录内容,您启动了一个进程。一个进程,简单来说,就是一个正在运行的程序的实例。
    操作系统通过一个五位数的 ID 号来跟踪进程,称为 pid 或者 process ID. 系统中的每个进程都有一个独特的pid.
    pid 最终会重复,因为所有可能的数字都用完了,下一个 pid 滚动或重新开始。在任何时候,系统中都不存在具有相同 pid 的两个进程,因为 Unix 使用 pid 来跟踪每个进程。
  • 启动进程

    当您启动一个进程(运行命令)时,您可以通过两种方式运行它 -
    • 前台进程
    • 后台进程

    前台进程

    默认情况下,您启动的每个进程都在前台运行。它从键盘获取输入并将其输出发送到屏幕。
    你可以看到这发生在 ls命令。如果要列出当前目录中的所有文件,可以使用以下命令 -
    
    $ls ch*.doc
    
    这将显示所有文件,其名称以 ch 并以 .doc
    
    ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
    ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
    ch01-2.doc   ch02-1.doc
    
    进程在前台运行,输出被定向到我的屏幕,如果 ls 命令需要任何输入(它不需要),它等待来自键盘的输入。
    当程序在前台运行并且很耗时时,不能运行其他命令(启动任何其他进程),因为在程序完成处理并出现之前,提示将不可用。

    后台进程

    后台进程无需连接到键盘即可运行。如果后台进程需要任何键盘输入,它就会等待。
    在后台运行一个进程的好处是可以运行其他命令;你不必等到它完成再开始另一个!
    启动后台进程的最简单方法是添加一个与号 (&) 在命令的末尾。
    
    $ls ch*.doc &
    
    这将显示名称以开头的所有文件 ch 并以 .doc
    
    ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
    ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
    ch01-2.doc   ch02-1.doc
    
    在这里,如果 ls 命令需要任何输入(它不需要),它会进入停止状态,直到我们将它移到前台并从键盘给它数据。
    第一行包含有关后台进程的信息 - 作业号和进程 ID。您需要知道作业编号才能在后台和前台之间对其进行操作。
    按 Enter 键,您将看到以下内容 -
    
    [1]   +   Done                 ls ch*.doc &
    $
    
    第一行告诉你 ls命令后台进程成功完成。第二个是另一个命令的提示。
  • 列出正在运行的进程

    通过运行可以很容易地查看您自己的进程 ps (进程状态)命令如下 -
    
    $ps
    PID       TTY      TIME        CMD
    18358     ttyp3    00:00:00    sh
    18361     ttyp3    00:01:31    abiword
    18789     ttyp3    00:00:00    ps
    
    ps 最常用的标志之一是 -f ( f 代表完整) 选项,它提供更多信息,如以下示例所示 -
    
    $ps -f
    UID      PID  PPID C STIME    TTY   TIME CMD
    amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
    amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
    amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
    amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
    
    这是显示的所有字段的说明 ps -f 命令 -
    序号 列和描述
    1
    UID
    此进程所属的用户 ID(运行它的人)
    2
    PID
    进程标识
    3
    PPID
    父进程 ID(启动它的进程的 ID)
    4
    C
    进程的 CPU 使用率
    5
    STIME
    进程开始时间
    6
    TTY
    与进程关联的终端类型
    7
    TIME
    进程占用的 CPU 时间
    8
    CMD
    启动此进程的命令
    还有其他选项可以与 ps 命令 -
    序号 选项和说明
    1
    -a
    显示所有用户的信息
    2
    -x
    显示有关没有终端的进程的信息
    3
    -u
    显示附加信息,如 -f 选项
    4
    -e
    显示扩展信息
  • 停止进程

    可以通过几种不同的方式结束进程。通常,从基于控制台的命令中,发送 CTRL + C 键击(默认中断字符)将退出命令。这在进程以前台模式运行时有效。
    如果一个进程在后台运行,你应该使用 ps命令。之后,您可以使用kill 命令杀死进程如下 -
    
    $ps -f
    UID      PID  PPID C STIME    TTY   TIME CMD
    amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
    amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
    amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
    amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
    $kill 6738
    Terminated
    
    在这里, kill 命令终止 first_one过程。如果一个进程忽略了一个常规的 kill 命令,你可以使用kill -9 后跟进程 ID 如下 -
    
    $kill -9 6738
    Terminated
    
  • 父进程和子进程

    每个 unix 进程都有两个分配给它的 ID 号:进程 ID (pid) 和父进程 ID (ppid)。系统中的每个用户进程都有一个父进程。
    您运行的大多数命令都将 shell 作为其父级。检查ps -f 此命令同时列出进程 ID 和父进程 ID 的示例。
  • 僵尸进程和孤儿进程

    通常,当子进程被杀死时,父进程会通过 SIGCHLD信号。然后父级可以执行其他任务或根据需要重新启动新子级。然而,有时父进程在其子进程被杀死之前被杀死。在这种情况下,“所有进程的父进程”,init进程,成为新的 PPID(父进程 ID)。在某些情况下,这些进程称为孤立进程。
    当一个进程被杀死时,一个 ps 列表可能仍会显示该过程 Z状态。这是一个僵尸或已失效的进程。该进程已死且未被使用。这些进程不同于孤儿进程。他们已经完成了执行,但仍然在进程表中找到了一个条目。
  • 守护进程

    守护进程是与系统相关的后台进程,通常在 root 和来自其他进程的服务请求的权限下运行。
    守护进程没有控制终端。打不开/dev/tty. 如果你做一个"ps -ef" 看看 tty 字段,所有守护进程都会有一个 ? 为了 tty.
    确切地说,守护进程是一个在后台运行的进程,通常等待它能够处理的事情发生。例如,等待打印命令的打印机守护进程。
    如果您有一个需要长时间处理的程序,那么值得将其设为守护进程并在后台运行。
  • top命令

    top 命令是一个非常有用的工具,可以快速显示按各种标准排序的进程。
    它是一种交互式诊断工具,经常更新并显示有关物理和虚拟内存、CPU 使用率、平均负载和繁忙进程的信息。
    以下是运行 top 命令并查看不同进程的 CPU 利用率统计信息的简单语法 -
    
    $top
    
  • 作业 ID 与进程 ID

    后台和挂起的进程通常通过 job number (job ID). 该编号与进程 ID 不同,使用它是因为它较短。
    此外,一个作业可以由多个连续或同时、并行运行的进程组成。使用作业 ID 比跟踪单个进程更容易。