展开

关键词

首先,什么是是一个在后台长期运行并且不受任何终端控制的。其次,为什么需要?我们知道linux有许多自带的,比如syslogd、crond、sendmail等。 那用户或开发者自己编写的序为什么也需要成为呢?这主要是因为的特性。 目的很明显,我们不希望在该终端上见到的输出,用户也不期望他们在终端上的输入被所读取。最后,举个例子来说明一下。 两次fork两次调用fork就是出于僵尸的考虑:父生成后,还有其它事情要做,其『人生意义』不止是创建。 而如果父先fork子,子再立刻fork孙子,这样孙子成为,立刻被init接管,无论父怎么阻塞,都与无关了。

69840

5.1 概念(1)什么是 Daemon()是运行在后台的一种特殊。**它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 (2)为什么需要 是脱离于终端并且在后台运行的脱离于终端是为了避免在执行过中的信息在任何终端上显示并且也不会被任何终端所产生的终端信息所打断。 (3)实例 常见的包括系统日志syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。 5.2 模型(1)步骤a.创建子,父退出,一切工作在子中执行,形式上脱离了控制终端 b.在子中创建新的会话(会话后面章节会提到),使子完全独立出来,脱离控制 c.改变当前目录为根目录 ,防止占用其他可卸载的文件系统 d.重设文件权限掩码,防止继承的文件创建屏蔽字拒绝某些权限,增加的灵活性 e.关闭文件描述符 f.退出处理 ?

24520
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    (daemon)是一类在后台运行的特殊,用于执行特定的系统任务。很多在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。 是一个在后台运行并且不受任何终端控制的。这也是最重要的特点。在Linux下创建的步骤如下。 创建子,终止父 这是因为是脱离终端控制的,所以要造成一种在终端里已经运行完的假象,把所有的工作都放在子中去完成。父退出后,子变成孤儿。 重设文件掩码 由于通过fork函数创建的子继承了父的文件掩码,这就给该子使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该的灵活性。 、 下面是在Linux系统下创建的一个简单示例。

    16710

    android

    而一些安全软件,如360等,会有结束的功能,如果不做Service的保持,就会被其杀掉。 另外再加上两个类似一的Service, 分别检查Service的运行状态,注册响应的广播,对其,一旦发现没有运行就将其启动.我利用的系统广播是Intent.ACTION_TIME_TICK 至于检测方式,可以轮询获取子Pid,若为1, 则说明子被Init所领养,已经成为了孤儿.    但是这种方式比较消耗电量,并且由于不同手机系统定制的改变,当应用被强制停止时,父并不一定被真正杀死,因此在一些特定机型上是无法通过此方式行判断. (0)退出子,避免浪费系统资源和消耗电量.

    82080

    13()

    13.2 的特征是一种纯粹的后台,与运行前环境完全隔离,包括未关闭的文件描述符、控制终端、会话、组、工作目录以及文件创建掩码等 很多是父 fork 产生,所以会继承所有的父地址空间中的环境 ,所以必须在诞生之初,断绝这些相关环境,当然,也可以在 linux 系统启动时从启动脚本 etcrc.d 中启动,也可以由 crontab 启动 事实上,与普通的编写并没有特别大的区别 13.3 编规则(1)从创建他的父那里继承了文件创建掩码,它可能会修改创建的文件的存取位。 这样做实现了以下两点:第一,如果该是通过shell命令启动的,那么父终止使得shell认为该命令已执行完毕。 ; sa.sa_flags = 0; if (sigaction(SIGHUP, &sa, NULL) < 0) { perror(sigaction); exit(-1); } 再次 fork 让不再担当会话组长

    18910

    Python

    :通常被定义为一个后台,而且它不属于任何一个终端会话(terminal session)。许多系统服务由序实施;如网络服务,打印等。  下面是转自一位网友写的编写的步骤: 1. 调用fork()以便父可以退出,这样就将控制权归还给运行你序的     命令行或shell序。 由于一个控制终端     与一个会话相关联,而且这个新会话还没有获得一个控制终端,我们的没     有控制终端,这对于序来说是一件好事。 3. (译者注:这里指步骤5,因为序不一定需要写文件) 6. 调用‘close()’关闭文件描述符0,1和2。这样我们释放了从父继承的标     准输入,标准输出,和标准错误输出。 注意到许多序使用‘sysconf()’来确认     ‘_SC_OPEN_MAX’的限制。‘_SC_OPEN_MAX’告诉你每个能够打     开的最多文件数。

    16130

    python

    假如写一段服务端序,如果ctrl+c退出或者关闭终端,那么服务端序就会退出,于是就想着让这个序成为,像httpd一样,一直在后端运行,不会受终端影响。 英文为daemon,像httpd,mysqld,最后一个字母d其实就是表示daemon的意思。 的编写步骤:fork子,然后父退出,此时子会被init接管。 修改子的工作目录,创建新组合新会话,修改umask。子再次fork一个,这个可以称为孙子,然后子退出。 重定向孙子的标准输入流,标准输出流,标准错误到devnull完成上面的4个步骤,那么最终的孙子就称为,先看下代码,后面分析下步骤的原因。#! ,fork孙子处理,6.重定向孙子的标准输入流,标准输出流,标准错误流到devnull因为是,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到devnull

    24820

    Python

    nohup 可以使序后台运行不受终端影响,但想使序运行后就脱离终端Python需要用到os.fork来实现,例子如下:daemonize.py#!

    15210

    (Daemon)

    的概念(Daemon)一般是为了保我们的序服务的正常运行,当序被关闭、异常退出等时再次启动序恢复服务。 例如 http 服务的叫 httpd,mysql 服务的叫 mysqld。 Linux 中一般把放在etcinit.d中,启动服务时的命令一般是 etcinit.d* {start|stop|status|restart}。脱离终端而存在。 当你执行命令ps -ef 时,的 PPID (父 ID)都是 1,TTY (终端)则是???。 的创建Linix 中可以调用 int daemon(int nochdir, int noclose); 函数来使序成为一个

    1.4K30

    linux

    1、什么是是运行在后台的一种特殊,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生;一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行 ;一般都以root用户权限运行,因为要使用某些特殊的端口或者资源;的父一般都是init,因为它真正的父在fork出后就直接退出了,所以都是孤儿,由init 接管;2、有哪些常见的日志服务 syslogd数据库 mysqld3、创建的步骤1)fork()创建子,父exit()退出这是创建的第一步。 因此从终端输入的字符不可能达到中用常规方法(如printf)输出的字符也不可能在终端上显示出来。 7)退出处理当用户需要外部停止运行时,往往会使用 kill 命令停止该。所以,中需要编码来实现 kill 发出的signal信号处理,达到的正常退出。

    28320

    详解

    在一个多任务的电脑操作系统中,(英语:daemon,ˈdiːmən或ˈdeɪmən)是一种在后台执行的电脑序。此类序会被以的形式初始化。 序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的。通常,没有任何存在的父(即PPID=1),且在UNIX系统层级中直接位于init之下。 序通常通过如下方法使自己成为:对一个子运行fork,然后使其父立即终止,使得这个子能在init下运行。这种方法通常被称为“脱壳”。系统通常在启动时一同引导为对网络请求,硬件活动等行响应,或其他通过某些任务对其他应用序的请求行回应提供支持。 也能够对硬件行配置(如在某些Linux系统上的devfsd),运行计划任务(例如cron),以及运行其他任务。在DOS环境中,此类应用序被称为驻留序(TSR)。

    23121

    python (daemon)

    的编写步骤:1、fork子,然后父退出,此时子会被init接管。2、修改子的工作目录,创建新组合新会话,修改umask。 usrbinenv python# -*- coding:utf-8 -*-import sys, os 将当前fork为一个   注意:如果你的是由inetd启动的,不要这样做! 也可以改变到对于序运行重要的文件所在目录      os.umask(0)  # 调用umask(0)以便拥有对于写的任何东西的完全控制,因为有时不知道继承了什么样的umask。               sys.stderr.write(fork #2 failed: (%d) %sn % (e.errno, e.strerror))        sys.exit(1)         # 已经是了 ,fork孙子处理,6.重定向孙子的标准输入流,标准输出流,标准错误流到devnull因为是,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到devnull

    26030

    Linuxdemo

    学习笔记#include #include #include #include #include #include int ngx_deamon(){ switch(fork()){ fork子 case -1: 说明子创建失败 写一些日志文件 return -1; case 0: 这里是子 直接break跳出switch break; default : 这里是父 直接结束 exit(0); } 只有子可以走到这里 umask(0); 设置umask值 确保创建文件的执行权限 if(setsid() == -1){ 脱离父后 创建新的session 并成为leader = 1){ 创建失败 失败后的处理 return 1; } while(1){ printf(ngx_deamonn); sleep(1); } return 0;}

    28910

    Python setdaemon

    setdaemon#_*_coding:utf-8_*___author__ = gaogd import timeimport threading ,如果主线down了,子线也就没有了 下面先通过主生成main主线,之后main主线再生成10个子线。 -- main_thread = threading.Thread(target=main,args=(100,))main_thread.setDaemon(True)    ##这里的意思就是把主设置为

    25310

    线

    创建  其一:会在主代码执行结束后就终止  其二:内无法再开启子,否则抛出异常:AssertionError: daemonic processes are ,都遵循:xxx会等待主xxx运行完毕后被销毁需要强调的是:运行完毕并非终止运行#1.对主来说,运行完毕指的是主代码运行完毕 #2.对主线来说,运行完毕指的是主线所在的内所有非线统统运行完毕 ,主线才算运行完毕详细解释:#1 主在其代码结束后就已经算运行完毕了(在此时就被回收),然后主会一直等非的子都运行完毕后回收子的资源(否则会产生僵尸),才会结束, #2 主线在其他非线运行完毕后才算运行完毕(线在此时就被回收)。 因为主线的结束意味着的结束,整体的资源都将被回收,而必须保证非线都运行完毕后才能结束。

    65190

    Python实现

    因此如果你关闭了终端,这个命令行序也会随之关闭。 要使你的python服务不受终端影响而常驻系统,就需要将它变成。 代码实现python可以很简洁地实现,下面给出代码和相应注释。这份代码稳定运行在我本地电脑的一个(自制闹钟)里,暂时没出过问题。 与后台 通过&符号,可以把命令放到后台执行。 它与是不同的:1、与终端无关,是被init收养的孤儿;而后台的父是终端,仍然可以在终端打印2、在关闭终端时依然坚挺;而后台会随用户退出而停止,除非加上nohup3 、改变了会话、组、工作目录和文件描述符,后台直接继承父(shell)的换句话说:就是默默地奋斗打拼的有为青年,而后台是默默继承老爸资产的富二代。

    1.2K80

    PHP 编写

    PHP 创建根据状态可以分为三种,僵尸,孤儿。今天我们着重来分析下简介 (daemon) 是一类在后台运行的特殊,用于执行特定的系统任务。很多在系统引导的时候启动,并且一直运行直到系统关闭。 创建步骤创建子,终止父由于是脱离控制终端的,因此首先创建子,终止父,使得序在 shell 终端里造成一个已经运行完毕的假象。 在子中创建新会话这个步骤是创建中最重要的一步,在这里使用的是系统函数 setsid。setsid 函数用于创建一个新的会话,并担任该会话组的组长。 由于使用 fork 函数新建的子继承了父的文件创建掩码,这就给该子使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为 0,可以大大增强该的灵活性。

    40620

    Python| 设置

    上一篇文章 介绍 join 在多中的作用,本文继续学习设置的对序的影响。 p1为线 p1.start() p2.start() print now() + Process end .结果显示启动了子 Run child process func_1 但是没有 func 随着主的结束而结束。 p2为线 p1.start() p2.start() print now() + Process end .结果显示启动了子func_1,而func_2 没有启动便随着主的结束而结束。 总结对于或者子线设置join() 意味着在子或者子线结束运行之前,当前序必须等待。当我们在序中运行一个主(主线),然后有创建多个子线。主线和子线各自执行。

    68920

    PHP 实现

    微信图片_20191107171931.jpg作为一种常驻服务,很常见,例如 PHP-FPM, NGINX,REDIS,都需要一个父来支持整个服务。 但是用 PHP 编写不多见,今天就来用 PHP 来实现一下。 步骤● fork 子● 父退出● 设置新的会话● 重置文件掩码● 关闭标准输入输出实现我们对着以上的步骤来实现,在这之前需要 pcntl 和 posix 扩展,请确保安装了。 微信图片_20191107172016.png细节 微信图片_20191107172059.png三者结果相同,说明了该即使组的组长,也是会话首领。 以上就是PHP 实现的详细内容

    23010

    Shell: nohup

    感觉nohup就是将一个初始化为一个。 nohup命令运行了另一个命令来阻断所有发送给该的SIGHUP信号。这会在退出终端会话时阻止退出。 由于nohup命令会从终端解除的关联,会丢掉到STDOUT和STDIN的链接,为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中

    61820

    相关产品

    • 安全专家服务

      安全专家服务

      专家服务(ES)由腾讯云专业的安全专家团队提供安全咨询、网站渗透测试、应急响应、等保合规等服务,帮助用户在上云过程获得合适的安全解决方案、发现潜在安全威胁和提升用户的安全防护能力……

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券