Linux 添加'&';让它作为守护进程运行?

Linux 添加'&';让它作为守护进程运行?,linux,celery,Linux,Celery,我知道在最后添加一个“&”会使它作为后台运行,但这是否也意味着它作为守护进程运行 比如: 芹菜-项目工人-l信息& 芹菜-项目工人-l信息-分离 我确信第一个在后台运行,而文档中所述的第二个作为守护进程在后台运行 我想知道以上命令的主要区别是,进程将作为守护进程或后台进程运行;他们都做同样的事情 您可以通过查看源代码中的opt解析器来验证这一点(如果您确实想验证这一点): 最后,下面的代码就是在DaemonContext中分离它的代码。请注意fork和exit调用: def _detach(

我知道在最后添加一个“&”会使它作为后台运行,但这是否也意味着它作为守护进程运行

比如:

芹菜-项目工人-l信息&

芹菜-项目工人-l信息-分离

我确信第一个在后台运行,而文档中所述的第二个作为守护进程在后台运行


我想知道以上命令的主要区别是,进程将作为守护进程或后台进程运行;他们都做同样的事情

您可以通过查看源代码中的opt解析器来验证这一点(如果您确实想验证这一点):

最后,下面的代码就是在
DaemonContext
中分离它的代码。请注意fork和exit调用:

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

是,进程将作为守护进程或后台进程运行;他们都做同样的事情

您可以通过查看源代码中的opt解析器来验证这一点(如果您确实想验证这一点):

最后,下面的代码就是在
DaemonContext
中分离它的代码。请注意fork和exit调用:

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

他们是不同的

“&”版本为后台,但不是作为守护进程运行,守护进程将与终端分离。 在C语言中,守护进程可以编写代码:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
这可确保进程不再与终端位于同一进程组中,因此不会与终端一起终止。IO重定向是为了使输出不显示在终端上。(请参阅:)


守护进程使其处于自己的会话中,不连接到终端,不允许从父进程继承的任何文件描述符打开任何内容,不允许父进程(init除外)在/中拥有当前目录以防止umount…,而“&”版本不允许

它们是不同的

“&”版本为后台,但不是作为守护进程运行,守护进程将与终端分离。 在C语言中,守护进程可以编写代码:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
这可确保进程不再与终端位于同一进程组中,因此不会与终端一起终止。IO重定向是为了使输出不显示在终端上。(请参阅:)


守护进程使其处于自己的会话中,不连接到终端,不允许从父进程继承的任何文件描述符打开任何内容,不允许父进程(init除外)在/中包含当前目录以防止umount…,而“&”版本不允许。以
&
启动的进程在后台运行,但附加到启动它的shell,进程输出转到终端

这意味着,如果外壳死亡或终止(或终端关闭),该进程将被发送一个拥抱信号,并且也将死亡(如果它没有捕捉到它,或者如果它的输出发送到终端)

该命令将进程(命令)从shell中分离并重定向其I/O,并防止父进程(shell)死亡时进程(命令)死亡

例如:

您可以通过打开两个端子看到这一点。一气呵成

sleep 500 &
在另一个窗口中,运行
ps-ef
查看进程列表,在底部附近类似

me   1234   1201   ... sleep 500
        ^      ^
process id    parent process (shell)
关闭
sleep
在后台睡眠的终端,然后再次执行
ps-ef
,则
sleep
过程消失


守护进程作业通常由系统通过
upstart
init
启动(其所有者可能更改为普通用户),但实际上并非如此。以
&
启动的进程在后台运行,但附加到启动它的shell,进程输出转到终端

这意味着,如果外壳死亡或终止(或终端关闭),该进程将被发送一个拥抱信号,并且也将死亡(如果它没有捕捉到它,或者如果它的输出发送到终端)

该命令将进程(命令)从shell中分离并重定向其I/O,并防止父进程(shell)死亡时进程(命令)死亡

例如:

您可以通过打开两个端子看到这一点。一气呵成

sleep 500 &
在另一个窗口中,运行
ps-ef
查看进程列表,在底部附近类似

me   1234   1201   ... sleep 500
        ^      ^
process id    parent process (shell)
关闭
sleep
在后台睡眠的终端,然后再次执行
ps-ef
,则
sleep
过程消失


守护进程作业通常由系统通过
upstart
init

启动(其所有者可能会被更改为普通用户),因此简言之,您认为我提到的两个命令是相同的,也是在将分配的资源上?最终,是的。哦,太好了!然而,下面的评论说这是不同的。有什么理由吗?答案确实要归结于环境。看一看。AFAIK分叉和退出在这两种情况下都是一样的,python代码中没有发出ignore hangup命令,所以我想说我的答案仍然是正确的,除非我误解了什么。在python代码中创建了一个新会话,使调用过程成为一个先导(不再是shell的后代)。在使用
&
的情况下,它仍然是外壳的后代,并且可能在外壳关闭时关闭,具体取决于环境设置。就您所关心的资源而言,运行时性能没有差异。我会投票给他们,因为他们没有错。所以简言之,你认为我提到的两个命令是一样的,在分配的资源上也是一样的?最终,是的。哦,太好了!然而,下面的评论说这是不同的。有什么理由吗?答案确实要归结于环境。看一看。AFAIK分叉和退出在这两种情况下都是一样的,python代码中没有发出ignore hangup命令,所以我认为我的answe