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

Sim*_*ate 3 linux bash shell process

我的理解是,当您sleep 10在给定的 shell(比如 bash)中运行任何命令(比如 )时,幕后发生的事情是调用 fork 系统调用,并且sleep 10现在作为子进程运行,父进程是 bash shell我执行了sleep。

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

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

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

  • 由于父进程消失,两个进程都被终止
  • 两个进程都与 init 相关联,作为父进程。

Kam*_*Cuk 8

或者运行 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