我知道添加'&'最后使它作为后台运行,但它是否也意味着它作为守护进程运行?
像:
podfile
celery -A project worker -l info &
我确信第一个在后台运行,但文档中所述的第二个在后台作为守护进程运行。
我很想知道上面命令的主要区别
答案 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.
最终,下面的代码是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 -ef
,sleep
进程消失。
守护程序作业通常由upstart
或init
由系统启动(其所有者可能会更改为常规用户)。