【问题标题】:bash subshell vs vanilla command executionbash subshel​​l vs vanilla 命令执行
【发布时间】:2016-04-03 02:10:24
【问题描述】:

据我所知,当你运行一个命令时,比如

> sleep 3

shell 进程将 fork 另一个进程并与子进程一起运行命令。

但是当你这样做时

> (sleep 3)

您启动一个子shell 并执行命令。本质上它所做的也是分叉另一个进程来执行命令并等待命令完成。

在这种情况下,两个命令的行为看起来是一样的,父 shell 将等待 sleep 命令完成。

但有时我注意到 subshel​​l 的情况有所不同:

例如,如果我运行如下命令:

> virtualbox &

如果我不小心关闭了终端,virtualbox 也会同时关闭。我已经多次以这种方式搞砸了我正在进行的工作。

但是,如果我这样做,即使我退出终端,程序也不会被杀死:

> (virtualbox &)

所以我不确定引擎盖下发生了什么?两种不同的方式,shell如何启动和管理任务?

【问题讨论】:

  • 这不是您的问题,但您应该使用nohup 来确保您的程序继续进行。
  • 其实这很有帮助。下次我将使用 nohup 而不是 subshel​​l 启动 virtualbox。
  • 如果你的系统有ptree,用它来查看vbox(vbox &)之间的区别。或者一些ps 工具有-T 选项用于tree 显示。在两者中,您都会看到父/子关系,或者如果进程已与父进程解除关联。实际上,nohupscreentmux 可能真的是你所需要的。祝你好运。

标签: linux bash shell


【解决方案1】:

正如其他人所写,使用 nohup 将允许您在 shell 终止时运行该进程而不会终止它。在您描述的两种情况下会发生以下情况。

  • virtualbox & 的情况下,virtualbox 成为你 shell 的子级。当您的控制终端关闭时,与之关联的所有进程都会收到 SIGHUP 信号,并被终止。

  • (virtualbox &) 的情况下,命令在子shell 中执行。当子shell 终止时,命令与shell 和终端解除关联。 (您可以通过运行 ps 看到这一点。)在这种情况下,SIGHUP 将不会发送到 virtualbox,因此您的命令将不会当控制终端关闭时终止。

nohup 命令通过指定必须忽略 SIGHUP 信号来实现相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 2011-06-05
    • 2013-06-06
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多