添加'&'是否会使其作为守护程序运行?

问题描述:

我知道最后添加一个'&'使它作为背景运行,但这是否也意味着它作为守护进程运行?添加'&'是否会使其作为守护程序运行?

像:

celery -A project worker -l info &

celery -A project worker -l info --detach

我相信,第一个在后台然而由于声明在文档在后台作为守护程序运行在第二运行。

我很想知道上述命令中

+0

Stack Overflow是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://*.com/help/on-topic)。也许[超级用户](http://superuser.com/)或[Unix&Linux堆栈交换](http://unix.stackexchange.com/)会是一个更好的地方。 – jww

是该进程将运行为守护程序,或后台进程的主要区别;他们都做同样的事情。

您可以通过查看源代码的选择解析器验证这一点(如果你真的想验证这一点):

. 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

太好了!但是,下面的评论说这是不同的。任何理由? –

他们不一样!

“&”版本是后台,但不能作为后台进程运行,后台进程将与终端分离。 在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

没关系。感谢您的回答 –

不是真的。以&开始的进程在后台运行,但是连接到启动它的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

好吧,我很了解它! –