2017-10-17 48 views
1

我碰到一个正在运行的脚本(myDir/myScript.sh arg1 arg2 &)为什么要从子shell /为什么parens在(someCommand&)中启动后台进程?

从我的理解,它在子shell中运行脚本,并且在该子shell的后台运行。

会不会有什么副作用,如果我不跑了,创造新的子shell括号中的脚本myDir/myScript.sh arg1 arg2 &

+0

这是双叉的外壳等效物。见https://stackoverflow.com/questions/881388/what-is-the-reason-for-performing-a-double-fork-when-creating-a-daemon –

回答

3

通常的原因为在子shell运行它是使得壳不打印的消息的背景处理开始和结束时。另外,如果脚本曾经使用wait命令,它将不会等待在子壳体中启动的后台进程(一个进程只能等待自己的子进程而不是子进程)。

这也意味着脚本无法获得后台进程的退出状态,如果它是在子shell中启动的 - 您需要使用wait来获得该状态。并且$!变量不会被设置为后台进程的PID(它在子shell中设置,而不是原始shell进程)。

基本上,如果原始shell不需要处理后台进程,就使用(command&),它只是想启动并忘记它。

+0

我以为符号叉一个新的进程在后台,但这与subhell有什么不同? – avaldez1412

+0

每个非内置命令都会分叉一个新进程。 &符号使该进程在后台运行,这意味着原始shell继续运行而不必等待它完成。 – Barmar

+0

'()'分叉了一个新的shell进程,那么这个subshel​​l就派生出一个新的进程,无论是前台还是后台,这取决于是否存在'&'。 – Barmar

相关问题