2017-10-20 103 views
1

我知道最後添加一個'&'使它作爲背景運行,但這是否也意味着它作爲守護進程運行?添加'&'是否會使其作爲守護程序運行?

像:

celery -A project worker -l info &

celery -A project worker -l info --detach

我相信,第一個在後臺然而由於聲明在文檔在後臺作爲守護程序運行在第二運行。

我很想知道上述命令中

+0

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。 – jww

回答

1

是該進程將運行爲守護程序,或後臺進程的主要區別;他們都做同樣的事情。

您可以通過查看源代碼的選擇解析器驗證這一點(如果你真的想驗證這一點):

. cmdoption:: --detach 
    Detach and run in the background as a daemon. 

https://github.com/celery/celery/blob/d59518f5fb68957b2d179aa572af6f58cd02de40/celery/bin/beat.py#L12

https://github.com/celery/celery/blob/d59518f5fb68957b2d179aa572af6f58cd02de40/celery/platforms.py#L365

最終,下面的代碼是什麼分開它在DaemonContext。注意撥號和退出電話:

def _detach(self): 
    if os.fork() == 0:  # first child 
     os.setsid()   # create new session 
     if os.fork() > 0: # pragma: no cover 
      # second child 
      os._exit(0) 
    else: 
     os._exit(0) 
    return self 
+0

因此,簡而言之,你認爲我提到的兩個命令是一樣的,也就是將分配的資源? –

+0

最終,是的。 – Rafael

+0

太好了!但是,下面的評論說這是不同的。任何理由? –

2

他們不一樣!

「&」版本是後臺,但不能作爲後臺進程運行,後臺進程將與終端分離。 在C語言中,守護進程可以在代碼寫:

fork() 
setsid() 
close(0) /* and /dev/null as fd 0, 1 and 2 */ 
close(1) 
close(2) 
fork() 

這確保了過程是相同的處理組作爲終端中不再並且因此將不與它一起被殺死了。該IO重定向是使輸出不會出現在終端上(參見:https://unix.stackexchange.com/questions/56495/whats-the-difference-between-running-a-program-as-a-daemon-and-forking-it-into

一個守護進程使其在它自己的會話,無法連接到終端,不具備繼承自父任何文件描述符打開任何東西,沒有適合你父母關愛(比其他的init)具有當前目錄/以免防止umount命令...而「&」版本不

+0

我明白了純樸背景和守護進程的不同之處,現在我的問題是......在性能上會有什麼不同嗎? –

+0

如果--detach是真正的deamon,如文檔所述,會有一些差異,&版本的標準輸出不會重定向(仍然打印到屏幕),並且該過程仍然是終端的子節點...其中一些差別不明顯,依賴於代碼及其功能。順便說一下,我在舊版本中犯了一個錯誤,當終端退出時,進程可能不會被終止。 –

+0

沒關係。感謝您的回答 –

1

不是真的。以&開始的進程在後臺運行,但是連接到啓動它的shell,並且進程輸出轉到終端。

這意味着,如果殼死或終止(或終端關閉),該過程將發送一個HUG信號,並且也將死亡(如果它不捕獲它,或者如果它的輸出到達終奌站)。

命令nohup從shell分離進程(命令)並重定向其I/O,並防止在父進程(shell)死亡時它死亡。

例如:

您可以看到通過打開兩個終端。在一個運行

sleep 500 & 
在另一個運行 ps -ef

看到的進程列表,並接近底部像

me 1234 1201 ... sleep 500 
     ^ ^
process id parent process (shell) 

關閉終端中sleep睡在後臺,然後做再次ps -efsleep過程消失。

守護程序作業通常由系統(其擁有者可能更改爲常規用戶)通過upstartinit啓動。

+0

將分配的資源如何?它會一樣嗎? –

+0

在資源方面,shell將執行'fork()',然後執行'exec ...()',用新進程替換分支shell,但進程以'&開始,與開始的不同系統將繼承shell的環境 - 您可能不想要,這取決於您的應用程序。在你的情況下(&和--detach),它們都是從shell啓動的,所以它們都得到相同的環境。 –

+0

好吧,我很瞭解它! –

相關問題