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

Difference between ctrl-z and "&" in linux

我的理解是,当您在给定的 shell(例如 bash)中 运行 执行任何命令(例如 sleep 10)时,幕后发生了什么是调用了一个 fork 系统调用,sleep 10 现在 运行ning 作为子进程,父进程是 bash shell 我执行了睡眠。

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

的子进程

现在我的问题是,当通过 SSH 执行此操作时,我注意到以下内容: 如果我这样做:sleep 999 &sleep 888 <- 然后是 ctrl+z,然后关闭 ssh 会话,只有 sleep 999 & 幸存下来。

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

or run sleep 10 and press ctrl+z so the process is sent to the background

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

Why is this?

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

Bash 在线提供手册:https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html .