linux中ctrl-z和“&”的区别

问题描述

我的理解是,当您在给定的 shell(比如 bash)中运行任何命令(比如 <div class="parent"> <input id="date" type="date" min="" max="2021-07-31" name="APPOINTMENTDATE" data-field-type="Text"> </div>)时,幕后发生的事情是调用 fork 系统调用,并且 sleep 10现在作为子进程运行,父进程是我执行睡眠的 bash shell。

现在,如果我想将 sleep 10 发送到后台,我会执行 sleep 或运行 sleep 10 & 并按 ctrl+z 以便将进程发送到后台。 pstree 显示使用这些选项中的任何一个,sleep 一直是 bash shell 的子进程。

现在我的问题是,在通过 SSH 执行此操作时,我注意到以下几点: 如果我这样做:sleep 10sleep 999 & sleep 888 幸存下来。

这是为什么?我实际上期待其中之一:

  • 两个进程都因为父进程消失而终止
  • 两个进程都作为父进程与 init 相关联。

解决方法

或者运行 sleep 10 并按 ctrl+z 将进程发送到后台

不,不是真的。没看到“[1]+ Stopped sleep 10”的大消息吗? ctrl+z 停止进程并返回到当前 shell。您现在可以键入 fg 以继续处理,或键入 bg 以在后台继续处理。研究“bash 作业控制”并查看 bash 手册作业控制基础。

这是为什么?

停止的进程首先继续 SIGCONT,然后将 SIGTERM 发送给它们,以便它们可以终止。

Bash 手册可在线获取:https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html .