精华内容
下载资源
问答
  • 守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。  守护...

      守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立 
    于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

      守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在 
    执行过程中的信息也不在任何终端上显示。由于在 linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依 
    附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。

      eg:redis 设置为守护进程则在后台运行,不依赖于启动终端

        

          linux  /var/run 目录中存放的是自系统启动以来描述系统信息的文件。
          linux中/var/run使用的是tmpfs文件系统,这是一种存储在内存中的临时文件系统,当机器关闭的时候,文件系统自然就被清空
          比较常见的用途是daemon进程将自己的pid保存到这个目录。
          标准要求这个文件夹中的文件必须是在系统启动的时候清空,以便建立新的文件。
    

      

    /var/run 目录中存放的是自系统启动以来描述系统信息的文件。
    比较常见的用途是daemon进程将自己的pid保存到这个目录。
    标准要求这个文件夹中的文件必须是在系统启动的时候清空,以便建立新的文件。

    转载于:https://www.cnblogs.com/itplay/p/11091009.html

    展开全文
  • Redis开启守护进程作用: 在 linux 中,每一个系统与用户进行交流的界面称为终端 如果没有开启守护进程,相当于知识在前台开启了Redis,当终端关闭时,Reids服务也会跟着关闭 而开启守护进程后,相当于是在后台...

    Redis开启守护进程的作用:

    在 linux 中,每一个系统与用户进行交流的界面称为终端
    如果没有开启守护进程,相当于知识在前台开启了Redis,当终端关闭时,Reids服务也会跟着关闭
    而开启守护进程后,相当于是在后台运行,脱离终端,不会再关闭终端时停止Redis服务进程

    配置方法

    编辑Redis文件夹下redis.conf配置文件,修改daemonize 为yes

    Redis五大数据类型

    String、List、Hash、Set、Zset
    String:常用于缓存、计数、限速、负载均衡等问题

    字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习尊定基础。
    字符串类型实际上可以是字符串 (简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频)), 但最大不能超过512M。
    字符串常用于数值计算,加减操作,还有便是bitmap(二进制位图),SETBIT k1 1 1(给k1第一位偏移为1),用途:统计某个用户一段时间内登录次数等。

    List:常用于消息队列等问题

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
    列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
    常被用作各种数据结构:链表、队列、数组、栈等。

    Hash:常用于存对象

    Redis hash 是一个键值(key=>value)对集合。
    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
    每个 hash 可以存储 232 -1 键值对(40多亿)。

    Set:常用于标签

    Redis的Set是string类型的无序集合。
    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
    集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    Zset:常用于排行

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
    按什么排序?(权重)
    内部结构?(元素内存较小时是ziplist-----压缩表,元素大时变为skiplist------跳跃表,限制是元素个数大于128,或元素大于64字节。)
    zset的成员是唯一的,但分数(score)却可以重复。

    展开全文
  • 何为守护进程 、进程组 / 组长进程 / 会话 / 会话首进程 、守护进程的创建步骤 、创建守护进程程序示例

    何为守护进程

    守护进程(daemon)是一类在后台运行的特殊进程,其生存期较长独立于控制终端、执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

    我们先来学习几个新概念:会话、会话首进程、进程组、组长进程。


    进程组 / 组长进程 / 会话 / 会话首进程

    进程组

    进程组:每个进程都属于一个进程组,进程组中可以包含一个或多个进程。进程组中有一个组长进程(第一个进程),组长的进程 ID 是进程组 ID(PGID)。

    • 当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组

    • 组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关

    • 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)。


    操作函数:

    1、getpgrp函数:获取当前进程的进程组ID

    pid_t getpgrp(void);  // 总是返回调用者的进程组ID
    

    2、getpgid函数:获取指定进程的进程组ID

    pid_t getpgid(pid_t pid);  // 成功:0;失败:-1,设置errno
    

    如果pid = 0,那么该函数作用和getpgrp一样。

    3、setpgid函数:改变进程默认所属的进程组。通常可用来加入一个现有的进程组或创建一个新进程组。

    /*
    ** 将参数1对应的进程,加入参数2对应的进程组中。
    ** 成功:0;失败:-1,设置errno
    **/
    int setpgid(pid_t pid, pid_t pgid); 
    

    注意:

    • 改变子进程为新的组,应在fork后,在exec前
    • 权级问题。非root进程只能改变自己创建的子进程,或有权限操作的进程。

    会话

    会话:多个进程组构成一个会话建立会话的进程是会话的领导进程,即会话首进程,该进程 ID 为会话的 SID。

    会话中的每个进程组称为一个作业。会话可以有一个进程组称为会话的前台作业,其它进程组为后台作业。

    一个会话可以有一个控制终端,当控制终端有输入和输出时都会传递给前台进程组,比如Ctrl + Z。会话的意义在于能将多个作业通过一个终端控制,一个前台操作,其它后台运行


    创建会话的注意事项:

    • 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
    • 该进程成为一个新进程组的组长进程
    • 需有root权限(ubuntu不需要)
    • 新会话丢弃原有的控制终端,该会话没有控制终端
    • 若调用进程是组长进程,则出错返回
    • 建立新会话时,先调用fork,父进程终止,子进程调用setsid

    操作函数:
    1、getsid函数:获取进程所属的会话ID

    //成功:返回调用进程的会话ID;失败:-1,设置errno
    pid_t getsid(pid_t pid); 
    

    pid为0表示查看当前进程session ID


    如果调用进程非组长进程,那么就能创建一个新会话

    • 该进程变成新会话的首进程
    • 该进程成为一个新进程组的组长进程
    • 该进程没有控制终端,如果之前有,则会被中断(会话过程对控制终端的独占性)

    也就是说:组长进程不能成为新会话首进程,新会话首进程必定成为组长进程


    ps ajx命令查看系统中的进程。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息
    在这里插入图片描述
    2、setsid函数:创建一个会话,并以自己的ID设置进程组ID,同时也是新会话的ID。

    pid_t setsid(void); //成功:返回调用进程的会话ID;失败:-1,设置errno
    

    调用了setsid函数的进程,既是新会话首进程,也是新的组长进程。



    简单总结如下:

    进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合。
    图示aopscjasj


    程序示例

    我们接下来通过上面介绍的函数来查看一下一个进程及其子进程的相关信息

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main()
    {
        printf("pid = %d, ppid = %d, pgid = %d, sid = %d \n",
         getpid(), getppid(), getpgrp(), getsid(0));
    }
    

    程序运行结果如下:

    我们可以看到,当启动一个新进程时,是由其父进程(终端bash)创建,并且该新进程所属的会话ID就是bash的PID因为它属于当前bash的创建的会话,那么bash为该会话的会话首进程

    另外我们看到,新进程的pgid即它的进程组ID就为它自身的pid,即当只启动一个进程时,进程组只有一个成员,就是它自身,因此该新进程也是新创建进程组的进程组长

    那么接下来我们在程序中fork()一个子进程,看一下结果:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main()
    {
        fork();
        printf("pid = %d, ppid = %d, pgid = %d, sid = %d \n",
         getpid(), getppid(), getpgrp(), getsid(0));
    }
    

    我们可以看到,子进程的ppid就是创建它的父进程的id,子进程所属的进程组id就为组长进程的pid,即它父进程的pid。它们的sid都为当前终端的pid

    那么还有一种情况如下图所示:

    我们可以看到子进程的ppid为1,即说明了父进程已结束退出,那么有pid为1的init进程接管,但是我们看到其进程组id仍为其父进程(进程组组长)的pid,这也说明了我们前面所讲的:
    只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关


    守护进程的创建步骤

    1、fork()创建子进程,父进程exit()退出

    进程 fork 后,父进程退出。这么做的原因有以下两点:

    • 如果守护进程是通过 Shell 启动,父进程退出,Shell 就会认为任务执行完毕,之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离,在后台工作。这时子进程由 init 收养
    • 子进程继承父进程的进程组 ID,保证了子进程不是进程组组长,因为下面将调用setsid(),它要求必须不是进程组长。

    2、在子进程调用setsid()创建新会话

    在调用了 fork() 函数后,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变。这还不是真正意义上的独立开来,而 setsid()函数,使子进程完全独立出来,脱离控制。

    setsid()创建一个新会话,调用进程担任新会话的首进程,其作用有:

    • 使当前进程脱离原会话的控制
    • 使当前进程脱离原进程组的控制
    • 使当前进程脱离原控制终端的控制

    这样,当前进程才能实现真正意义上完全独立出来,摆脱其他进程的控制


    3、再次 fork() 一个子进程,父进程exit()退出

    现在,进程已经成为无终端的会话组长(会话首进程),但它可以重新申请打开一个控制终端,可以通过 fork() 一个子进程,该子进程不是会话首进程,该进程将不能重新打开控制终端。退出父进程。

    也就是说通过再次创建子进程结束当前进程,使进程不再是会话首进程来禁止进程重新打开控制终端。


    4、在子进程中调用chdir()让根目录“/”成为子进程的工作目录

    这一步也是必要的步骤。使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件系统(如“/mnt/dev”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。因此,通常的做法是让"/"作为守护进程的当前工作目录这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp。改变工作目录的常见函数是chdir。(避免原父进程当前目录带来的一些麻烦)


    5、在子进程中调用umask()重设文件权限掩码为0

    文件权限掩码是指屏蔽掉文件权限中的对应位。比如,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限(就是说可读可执行权限均变为7)。

    由于使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此把文件权限掩码重设为0即清除掩码(权限为777),这样可以大大增强该守护进程的灵活性。通常的使用方法为umask(0)。(相当于把权限开发)


    6、在子进程中close()不需要的文件描述符

    同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。其实在上面的第二步之后,守护进程已经与所属的控制终端失去了联系

    因此从终端输入的字符不可能到达守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。(关闭失去价值的输入、输出、报错等对应的文件描述符)

    for (i=0; i < MAXFILE; i++)
    	close(i); // 全部关闭
    

    7、守护进程退出处理

    当用户需要外部停止守护进程运行时,往往会使用 kill 命令停止该守护进程所以,守护进程中需要编码来实现 kill 发出的signal信号处理,达到进程的正常退出

    创建守护进程程序示例

    #include <stdio.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
    #include <sys/stat.h>
    
    int main()
    {
    	/* 1、创建子进程,父进程退出 */
    	if (fork() != 0)
    	{
    		exit(0);
    	}
    
    	/* 2、setsid()创建会话 */
    	setsid();
    	
    	/* 3、再次fork,父进程退出,即使新进程不再是会话首进程 */
    	if (fork() != 0)
    	{
    		exit(0);
    	}
    	
    	/* 4、让根目录成为子进程的工作目录 */
    	chdir("/");
    
    	/* 5、清空掩码,大大增强该守护进程的灵活性 */
    	umask(0);
    
    	/* 6、清空所有文件描述符,让其不占用系统资源 */
    	int maxfd = getdtablesize();
    	int i = 0;
    	for (; i < maxfd; ++i)
    	{
    		close(i);
    	}
    
    	/* 每隔5s将当前时间写入日志文件 */
    	while (1)
    	{
    		FILE* fp = fopen("/home/zy/Learn/a.log", "a+");
    		if (fp == NULL)
    		{
    			break;
    		}
    
    		time_t tv;
    		time(&tv);
    		fprintf(fp, "Time is %s", asctime(localtime(&tv)));
    		fclose(fp);
    		sleep(5);
    	}
    
    	exit(0);
    }
    

    运行上述程序,在终端中不会有任何输出,因为它已经变为了守护进程长期在系统中存在,但我们可以通过ps -ef命令查看到。
    在这里插入图片描述
    那么我们打开 a.log 日志文件,通过tail -f命令值实时刷新显示末尾数据。
    我们可以看到,每隔5s文件中就多了一行时间信息。证明我们所创建的守护进程一直在后台工作。

    我们可以通过kill命令结束守护进程。
    在这里插入图片描述

    展开全文
  • 守护进程: 守护线程是低优先级的线程,它的作用仅仅是为用户线程(非守护线程)提供服务。正是由于守护线程是为用户线程提供服务的,仅仅在用户线程处于运行状态时才需要守护线程。另外,一旦所有的用户线程都运行...

    守护进程:
    守护线程是低优先级的线程,它的作用仅仅是为用户线程(非守护线程)提供服务。正是由于守护线程是为用户线程提供服务的,仅仅在用户线程处于运行状态时才需要守护线程。另外,一旦所有的用户线程都运行完毕,那么守护线程是无法阻止JVM退出的。即当程序只剩下守护线程的时候程序就会退出。
    守护线程的作用类似在后台静默执行 ,最典型的就是JVM的垃圾回收机制, 这个就是一个守护线程。

    非守护进程:
    用户线程是高优先级的线程。JVM虚拟机在结束一个用户线程之前,会先等待该用户线程完成它的任务。

    注意:main函数是个比较特殊的用户线程。不是守护线程。

    展开全文
  • 守护进程和超级守护进程

    千次阅读 2015-01-02 11:09:00
    在Linux中,守护进程有...每个守护进程都会有一个脚本,可以理解成工作配置文件,守护进程的脚本需要放在指定位置,独立启动守护进程:放在/etc/init.d/目录下,当然也包括xinet的shell脚本;超级守护进程:按照x
  • 守护进程

    千次阅读 2019-09-02 14:49:40
    什么是守护进程? Daemon(精灵)进程是Linux中后台服务进程,独立于控制终端并且周期性地执行某种任务或等待处理某些发生事件,一般采用以d结尾的名字。 守护进程就是通常讲Daemon进程,是linux后台执行的一种...
  • 守护进程及初始化守护进程

    千次阅读 2016-10-26 21:20:55
    Linux系统中的守护进程是一种运行在后台的进程。而守护进程,也就是通常说的Daemon进程。它通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程它从被执行开始运转,直到整个系统关闭时...
  • linux守护进程

    千次阅读 2018-03-08 21:05:10
    1.守护进程最重要的特性是后台运行。 2.守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程...
  • 守护进程详解及其代码实现

    千次阅读 2018-05-06 14:09:44
    1、概念理解: 守护进程(Daemon)是运行在后台的一种特殊进程,也称为精灵进程...2、守护进程作用: Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完...
  • 【Linux】守护进程守护进程的创建

    千次阅读 2016-08-03 12:26:40
    守护进程 守护进程是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。  守护进程没有控制终端。因此,说他们是在后台运行的。UNIX系统有很多守护进程,他们执行日常事务活动。  下面...
  • TimesTen的守护进程

    万次阅读 2016-07-01 21:59:47
    TimesTen的守护进程分为主守护进程和子守护进程。主守护进程守护进程即...主守护进程作用为: Manages shared memory access Coordinates process recovery Keeps management statistics on what databases exis
  • 什么是守护进程守护进程

    千次阅读 2016-06-25 22:56:52
    下面是关于守护进程的笔记,是对网上搜索结果进行的总结:  守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,程序的名称通常以字母“d”结尾。守护进程是生存期长的 一种进程...
  • java的守护进程与非守护进程

    万次阅读 2018-05-22 13:44:36
    java的守护进程与非守护进程 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) ,(PS:以前忽略了)。...
  • 问题应该是:/etc/init.d/xinetd 的方式启动和rsync --daemon的方式有什么不同 根据守护进程的启动和管理方式,可以分为独立启动守护进程和超级守护进程两类独立启动(stand_alone):该类进程启动后就常驻内存,...
  • 守护进程详解

    千次阅读 2020-02-02 01:48:24
    在一个多任务的电脑操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的电脑程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指...
  • 守护进程c实现

    千次阅读 2017-12-22 17:50:42
    守护进程 守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的,比如,...
  • 1、什么是守护进程守护进程也称为精灵进程,是运行在后台进程的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 (1)脱离于控制终端并且在后台运行 (2)不受用户登录注销的影响...
  • Android守护进程

    千次阅读 2018-11-07 22:59:14
    守护进程 守护进程: 一直在后台运行的进程。本文主要讲解一些android比较常用的守护进程的方法。 实现思想: 1.保活,通过提高进程优先级,降低进程被杀死的概率 2.拉起,进程被杀死后,进行拉起 相关...
  • 守护进程守护进程输出

    千次阅读 2015-02-09 09:08:11
    2 创建一个守护进程 1 创建一个输出程序 守护进程不与终端联系,所以,需要另外创建一个程序用于输出。 也可以直接使用/bin/echo ----- example_daemon_help.cc #include int main(int argc, char** argv)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 205,939
精华内容 82,375
关键字:

守护进程作用