据我所知,当你运行命令时,比如
> sleep 3
shell进程将分叉另一个进程并使用子进程运行该命令。
但是当你这样做时
> (sleep 3)
启动子shell并执行命令。基本上它所做的也是分叉另一个进程来执行命令并等待命令完成。
在这种情况下,两个命令的行为看起来相同,父shell将等待sleep命令完成。
但有时候我注意到子shell的不同之处:
例如,如果我运行一些命令,如:
> virtualbox &
如果我不小心关闭终端,虚拟机将同时关闭。我已经用这种方式多次搞砸了我正在进行的工作。
但是,如果我这样做,即使我退出终端,该程序也不会被杀死:
> (virtualbox &)
所以我不确定引擎盖下发生了什么? shell使用两种不同的方法如何启动和管理任务?
答案 0 :(得分:3)
正如其他人写的那样,使用 nohup 将允许您在shell终止时运行该进程而不终止它。在您描述的两种情况下会发生以下情况。
在virtualbox &
案例 virtualbox 成为shell的子级。当您的控制终端关闭时,与其关联的所有进程都会收到 SIGHUP 信号,并被终止。
在(virtualbox &)
情况下,命令在子shell中执行。子shell终止时,命令与shell和终端解除关联。 (您可以通过运行 ps 来看到这一点。)在这种情况下, SIGHUP 将不会发送到 virtualbox ,因此您的命令将不会控制终端关闭时终止。
nohup 命令通过指定必须忽略 SIGHUP 信号来实现相同的结果。