2017-10-17 30 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

相關問題