bash subshel​​l vs vanilla命令执行

时间:2016-04-03 02:10:24

标签: linux bash shell

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

> sleep 3

shell进程将分叉另一个进程并使用子进程运行该命令。

但是当你这样做时

> (sleep 3)

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

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

但有时候我注意到子shell的不同之处:

例如,如果我运行一些命令,如:

> virtualbox &

如果我不小心关闭终端,虚拟机将同时关闭。我已经用这种方式多次搞砸了我正在进行的工作。

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

> (virtualbox &)

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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