这个daemonize方法有什么作用?

时间:2016-07-25 17:56:09

标签: python

当我在反向shell示例中偶然发现这个名为daemonize()的方法时,我正在寻找GitHub。 source

我不太明白它在这种情况下的作用是什么,不会从命令行运行这样的代码:python example.py &没有达到同样的效果?

Deamonize方法来源:

def daemonize():
    pid = os.fork()
    if pid > 0:
        sys.exit(0)   # Exit first parent
    pid = os.fork()
    if pid > 0:
        sys.exit(0)   # Exit second parent

2 个答案:

答案 0 :(得分:1)

查看Orphan ProcessesDaemon Process。没有父级的进程成为init的子进程(pid 1)。

当关闭一组进程时,比如一个bash实例的所有孩子,操作系统将会给那个bash的孩子们带来一丝叹息。孤儿,在这种情况下被强迫,或者由于某些意外而被迫,不会得到这种治疗,并且会在更长时间内待在一起。

答案 1 :(得分:1)

后台进程 - 使用python2.7 <file>.py信号运行& - 与真正的守护程序进程不同。

真正的守护进程:

  • 在后台运行。如果您使用&,也会发生这种情况,并且是相似性结束的地方。
  • 与终端不在同一个进程组中。当终端关闭时,守护进程也不会死亡。 &不会发生这种情况 - 过程保持不变,只是移到后台。
  • 正确关闭所有继承的文件描述符(包括输入,输出等),以便没有任何东西将其与父级联系起来。同样,&不会发生这种情况 - 它仍会写入终端。
  • 理想情况下只能被SIGKILL杀死,而不是SIGHUP。使用&运行可以让您的进程被SIGHUP杀死。
然而,所有这些都是迂腐。很少有任务确实要求你去达到这些属性所需的极端 - 使用screen在新终端中生成的后台任务通常可以完成相同的工作,但效率较低,你也可以称之为守护进程这是一个长期运行的后台任务。 与真正的守护进程之间唯一真正的区别在于后者只是试图避免所有可能的死亡途径。

您看到的代码只是分叉当前进程。从本质上讲,它克隆了当前的流程,杀死了它的父母和后台的行为。通过简单地成为一个单独的进程,不会阻止当前的执行 - 如果你问我,有点丑陋的黑客,但它的工作原理。