添加'&'使它作为守护进程运行?

时间:2017-10-20 02:57:54

标签: linux celery

我知道添加'&'最后使它作为后台运行,但它是否也意味着它作为守护进程运行?

像:

podfile

celery -A project worker -l info &

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

我很想知道上面命令的主要区别

3 个答案:

答案 0 :(得分:2)

他们不同!

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

class SameHash : EqualityComparer<int[]>
{
    public override bool Equals(int[] i1, int[] i2)
    {
        return i1[0] == i2[0] && i1[1] == i2[1]; 
    }


    public override int GetHashCode(int[] i)
    {
        return base.GetHashCode();
    }
}

这可确保进程不再与终端位于同一进程组中,因此不会与进程一起被终止。 IO重定向是为了使输出不出现在终端上(参见:https://unix.stackexchange.com/questions/56495/whats-the-difference-between-running-a-program-as-a-daemon-and-forking-it-into

一个守护进程让它在自己的会话中,没有附加到终端,没有任何从父对象继承的文件描述符打开任何东西,没有父母关心你(除了init)有当前目录中/为了不阻止umount ... 而“&amp;”版本不

答案 1 :(得分:1)

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

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

. 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中的代码。注意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

答案 2 :(得分:1)

不是真的。该过程以&在后​​台运行,但附加到启动它的shell,并且进程输出到终端。

意思是,如果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由系统启动(其所有者可能会更改为常规用户)。