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