【发布时间】:2016-04-03 02:10:24
【问题描述】:
据我所知,当你运行一个命令时,比如
> sleep 3
shell 进程将 fork 另一个进程并与子进程一起运行命令。
但是当你这样做时
> (sleep 3)
您启动一个子shell 并执行命令。本质上它所做的也是分叉另一个进程来执行命令并等待命令完成。
在这种情况下,两个命令的行为看起来是一样的,父 shell 将等待 sleep 命令完成。
但有时我注意到 subshell 的情况有所不同:
例如,如果我运行如下命令:
> virtualbox &
如果我不小心关闭了终端,virtualbox 也会同时关闭。我已经多次以这种方式搞砸了我正在进行的工作。
但是,如果我这样做,即使我退出终端,程序也不会被杀死:
> (virtualbox &)
所以我不确定引擎盖下发生了什么?两种不同的方式,shell如何启动和管理任务?
【问题讨论】:
-
这不是您的问题,但您应该使用
nohup来确保您的程序继续进行。 -
其实这很有帮助。下次我将使用 nohup 而不是 subshell 启动 virtualbox。
-
如果你的系统有
ptree,用它来查看vbox和(vbox &)之间的区别。或者一些ps工具有-T选项用于tree显示。在两者中,您都会看到父/子关系,或者如果进程已与父进程解除关联。实际上,nohup或screen或tmux可能真的是你所需要的。祝你好运。