练习 16:处理进程,pskill

    最简单的程序是硬盘上的文件,它包含中央处理器执行的指令。当你启动它的时候,它被复制到内存,控制权传递给它。被执行的程序称为进程。在例如 Linux 的多任务操作系统中,你可以启动程序的许多实例,因此可以从一个程序启动许多进程,所有程序将同时运行(执行)。

    一些进程不像ls那样交互,只是在后台静静地工作,就像ssh一样。进程有许多可能的状态,并且有许多操作,你可以通过信号机制对它们执行。

    首先让我们谈论状态。如果你键入ps ax -forest,它将打印出所有进程,你会得到这样的东西(跳过一些与硬件有关的进程):

    让我们浏览这个列表:

    PID - 进程 ID。每个进程都有与之相关联的唯一编号,用于唯一标识它。这意味着没有两个进程可以拥有相同的 PID。
    TTY - 与进程相关联的电传模拟器,允许进程与你交换信息。
    STAT - 当前进程状态。这将在下面详细描述。
    TIME - 这是在 CPU 上执行此进程的时间(以分钟为单位)。
    COMMAND - 这是带有参数的程序名称。请注意/usr/sbin/sshdsshd: user1的父进程,而又是sshd: user1/0的父进程,而sshd: user1@pts/0又是bash的父进程,而bash又是ps –forest ax的父进程。你需要更深入一些!

    现在让我们讨论,与所有这些进程沟通的方式。你可以通过发送信号来实现它。信号可能是一种鞭策进程方式,所以进程会听你的话,并做出你想要的行为。这是可能的进程的缩略列表,我从man killSIGNALS部分获得:

    | 信号 | 编号 | 行为 | 描述 |
    | 0 | 0 | N/A | 退出代码表示是否可以发送信号 |
    | HUP | 1 | 退出 | 控制终端挂起或父进程死亡 |
    | INT | 2 | 退出 | 来自键盘的中断 |
    | QUIT | 3 | 内核 | 来自键盘的退出 |
    | ILL | 4 | 内核 | 非法指令 |
    | TRAP | 5 | 内核 | 跟踪/断点捕获 |
    | ABRT | 6 | 内核 | 来自abort(3)的中止信号 |
    | FPE | 8 | 内核 | 浮点异常 |
    | KILL | 9 | 退出 | 不可捕获,不可忽视的杀死 |
    | SEGV | 11 | 内核 | 内存引用无效 |
    | PIPE | 13 | 退出 | 损坏的管道:写入没有读者的管道 |
    | ALRM | 14 | 退出 | 来自alarm(2)的定时器信号 |
    | TERM | 15 | 退出 | 终止进程 |

    同样,不要因为不理解而害怕,因为现在你只需要了解HUPTERMKILL。甚至有一首关于KILL信号的歌曲 ,命名为。另外,注意到和alarm(2)了么?这意味着你可以通过键入man 3 abortman 2 alarm来阅读相应的手册页。

    现在,你将学习如何列出正在运行的进程并向其发送信号。

    1. 打印你拥有(启动)的进程。
    2. 打印所有正在运行的进程。
    3. 以树形式打印所有正在运行的进程,并包含附加信息,例如可用的相关用户名和环境。请注意,此信息仅适用于你拥有(启动)的进程。为了查看所有进程的环境信息,请输入sudo ps axue -forest
    4. 开始创建一个零填充文件(填充为空字符,现在不要纠结),并通过在末尾指定&发送到后台。
    5. 查询dd的状态。
    6. 因为 bash 只能打印一些东西来回应你的输入,你需要按<ENTER>(发出空指令)。
    7. 同样,你需要按<ENTER>来查看输出。
    8. dd发送终止信号,所以dd退出了。
    9. 为了看到它确实发生了,你需要再次按<ENTER>键 。