Linux中ctrl-z和"&"的区别

3
我的理解是,当您在给定的shell(比如bash)中运行任何命令(比如sleep 10)时,底层发生的情况是调用了一个fork系统调用,sleep 10现在作为子进程运行,其父进程是我执行sleep的bash shell。

现在,如果我想将sleep发送到后台,我会使用sleep 10 &或者运行sleep 10并按下ctrl+z,这样进程就被发送到后台。pstree显示,使用这些选项之一,sleep仍然是bash shell的子进程。

现在我的问题是,在通过SSH进行此操作时,我注意到以下内容:

如果我执行:sleep 999 &sleep 888<- 然后按下ctrl+z,并关闭ssh会话,只有sleep 999 &幸存下来。

为什么会这样?实际上,我期望以下情况之一发生:

  • 两个进程都被终止,因为父进程已经消失了
  • 两个进程都与init关联为父进程。

你确定你正在使用bash吗? - KamilCuk
1
Ctrl+Z 停止一个前台作业。除非您恢复它,否则它将会是一个已停止的作业,而不是一个后台作业。 - oguz ismail
1个回答

8

或者运行 sleep 10 并按下 ctrl+z,使进程后台运行

不是的。你没看到那个大提示吗?上面写着 "[1]+ Stopped sleep 10"。按下 ctrl+z停止该进程并返回到当前 shell。现在你可以输入 fg 来继续该进程,或输入 bg 在后台继续该进程。请查阅“bash job control”,参考 bash 手册中的作业控制基础知识。

为什么会这样呢?

已停止的进程首先会收到 SIGCONT 信号,然后再收到 SIGTERM 信号以便它们能够终止。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接