精华内容
下载资源
问答
  • 嵌入式amr linux U盘 自动挂载 守护进程
  • Linux进程守护

    千次阅读 2019-05-11 19:11:24
    Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务...

    守护进程概述
    Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过 守护进程实现的。常见的守护进程包括系统日志进程sysslogd,web服务器httpd,邮件服务器sendmail和数据库服务器mysqld等。
    守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。
    一个守护进程的父进程的init进程,因为它真正的父进程在fork出子进程后就先子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要经过特殊处理。
    守护进程的名称通常以d结尾,比如,sshd,xinetd,crond等

    守护进程的特点

    1.运行方式:守护进程,也就是通常所说的Deamon进程,是Linux中的后台服务进程。周期性的执行某种任务或者等待处理某些发生的事件。LInux系统有很多守护进程,大多数服务都是用守护进程实现的。

    2.生命周期:守护进程会长时间运行,常常在系统启动时就开始运行,直到系统关闭时才终止。

    3.守护进程不依赖于终端:显而易见,从终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端。当控制终端被关闭时,相应的进程都会被自动关闭。咱们平常写进程时,一个死循环程序关闭终端的同时也关闭了我们的程序,但是对于守护进程来说其生命周期守护需要突破这种限制,它从开始运行,直到整个系统关闭才会退出,所以守护进程不能依赖与终端。

    如何识别一个守护进程

    1.一般所有的守护进程都是以超级用户启动的.(UID为0);

    2.没有控制终端(TTY为?);

    3.终端进程组ID为-1(TPGID表示终端进程组ID,该值表示与控制终端相关的前台进程组,如果未和任何终端相关,其值为-1);

    4.所有的守护进程的父进程都为init进程(PID为1的进程)

    在这里插入图片描述
    进程,进程组,会话,控制终端之间的关

    因为守护进程的创建需要改变这些环境参数,所以了解他们之间的关系很重要。
    在这里插入图片描述

    进程组:它是由一个或多个进程组成进程组号(GID)就是这些进程中的进程组长的PID(第一个进程的PID)。

    会话:其实叫做会话期,它包括了期间所有的进程组,一般一个会话期开始于用户login,一般login的是shell终端,所以shell终端又是此次会话期的首进程,会话一般结束于logout。对于非进程组长,它可以调用setId()创建一个新的会话。

    控制终端:一个会话一般会拥有一个控制终端用于执行io操作。用户登录的终端就成为该会话的控制终端。与控制终端建立连接的会话领头进程也被称为控制进程。一个会话只能有一个控制终端。

    前台进程组:该进程组中的进程能够向终端设备进行读,写操作的进程组。

    后台进程组:该进程组中的进程只能够向终端设备写。

    每个会话有且只有一个前台进程组,但会有0个或多个后台进程组。

    终端进程组ID:每个进程还有一个属性,终端进程组ID(TPGID),用来标识一个进程是否处于一个和终端相关的进程组中。前台进程组中的进程的TPGID=PGID,后台进程组的PGID!=TPGID。若该进程和任何终端无关,其值为-1,。通过比较他们来判断一个进程是属于前台进程组,还是后台进程组。
    在这里插入图片描述

    Linux守护进程编写步骤

    Step1:创建子进程,父进程退出

    实质是 让init进程成为新产生进程的父进程。调用fork函数创建子进程后,使父进程立即退出。从而使产生的子进程将变成孤儿进程,并被init进程接管,同时,所产生的新进程将变为在后台运行;利用前面介绍的父进程先于子进程退出后内核会自动托付子进程给init的原理。

    pid = fork();

    if (pid > 0) /父进程退出/
    {
    exit(0);

    }

    Step2:脱离控制终端,创建新的会话

    这个步骤是创建守护进程最重要的一步,虽然实现非常简单,但意义却非常重大。

    #include <unistd.h>

    pid_t setsid(void);

    返回值:若成功,返回新的会话期ID;若出错,返回-1。

    setsid函数作用

    首先内核会创建一个新的会话,并让该进程成为该会话的leader进程,
    同时伴随该session的建立,一个新的进程组也会被创建,同时该进程成为该进程组的组长。
    该进程此时还没有和任何控制终端关联。如果调用setsid之前该进程有一个控制终端,那么这种联系也被切断。
    Ps:如果该调用进程已经是一个进程组组长,则此函数返回出错。回想一下我们为了保证不处于这种情况我们是如何处理的?第一步,先调用fork,然后父进程终止,而子进程继续。因为子进程继承了父进程的进程组ID,而其进程ID是新分配的,两者不可能相等,这就保证了子进程不是一个进程组组长。

    Step 3: 改变当前工作目录

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

    Step4:重设文件权限掩码

    进程从创建它的父进程那里继承了文件创建掩码。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:

    umask(0);

    Step5:关闭文件描述符

    进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误:

    for(i=0;i<=getdtablesize();i++)

    close(i);

    #include <unistd.h>
    int getdtablesize(void);

    返回:进程最多打开文件描述符的个数(1024)

    PS:
    禁止进程重新打开控制终端
    现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:

    if(pid=fork())
    exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <time.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/stat.h>
    
    void creat_daemon(void);
    int main(void)
    {
    	time_t t;
    	int fd;
    	if (daemon(0, 0) == -1)
    		perror("daemon error");
    	while (1){
    		fd = open("daemon.log", O_WRONLY | O_CREAT | O_APPEND, 0644);
    		if (fd == -1)
    			ERR_EXIT("open error");
    		t = time(0);
    		char *buf = asctime(localtime(&t));
    		write(fd, buf, strlen(buf));
    		close(fd);
    		sleep(60);
    
    	}
    	return 0;
    }
    
    void creat_daemon(void)
    {
    	pid_t pid;
    	pid = fork();
    	if (pid == -1)
    		perror("fork error");
    	if (pid > 0)
    		exit(EXIT_SUCCESS);
    	if (setsid() == -1)
    		ERR_EXIT("SETSID ERROR");
    	chdir("/");//将目录更改到/下
    
    
    	int fd = open("/dev/null", O_RDWR);
    	dup2(fd, 0);
    	dup2(fd, 1);
    	dup2(fd, 2);
    	close(fd);
    
    	umask(0);
    	return;
    }
    
    展开全文
  • linux 进程守护,监控并自动重启

    千次阅读 2019-01-11 12:20:12
    1、[下载](http://cr.yp.to/daemontools.html daemontools... 2、安装 tar xvzf daemontools-0.76.tar.gz cd admin/daemontools-0.76 package/install 若发现报错: /usr/bin/ld: errno: TLS definition in /lib6...

    1、[下载](http://cr.yp.to/daemontools.html daemontools)daemontools安装包

    2、安装

    tar xvzf daemontools-0.76.tar.gz
    cd admin/daemontools-0.76
    package/install

    若发现报错: /usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o, 可修改代码admin/daemontools-0.76/src/error.h中的extern int errno;替换为#include <errno.h>

    3、启动
    使用命令svscanboot &来启动svscan工具
    查看进程ps -aux | grep svscan

    4、配置

    mkdir -p /opt/svc/fgapi/
    mkdir -p /opt/svc/ybcxcm/

    touch /opt/svc/fgapi/run
    touch /opt/svc/ybcxcm/run

    chmod 755 /opt/svc/fgapi/run
    chmod 755 /opt/svc/ybcxcm/run

    #!/bin/bash
    /opt/python/bin/python /home/wwwroot/fgapi/server.py -p 1314

    #!/bin/bash
    /opt/python/bin/python /home/wwwroot/ybcxcm/server.py -p 2999

    ln -s /opt/svc/fgapi/  /service/
    ln -s /opt/svc/ybcxcm/  /service/

    5、启动管理
    svc -u /service/fgapi/
    svc -u /service/ybcxcm/ 

    6、关闭被管理的进程
    svc -d /service/fgapi/

    7、查看service状态

    svstat /service/fgapi/

    8、移除service

    rm  /service/fgapi   
    svc -dx /opt/svc/fgapi/

    展开全文
  • Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程是,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。 在子进程中创建新会话 这个步骤是创建...
  • linux创建守护进程

    千次阅读 2014-10-12 12:27:40
     linux开启进程都是与终端绑定的,终端一关,进程也关,如果想独立不受干扰,必须将此进程变为守护进程(在后台运行,不以终端方式与用户交互)。 守护进程能够突破这种限制,它从被执行开始运转,直到整个系统...

    一、概述

            linux开启进程都是与终端绑定的,终端一关,进程也关,如果想独立不受干扰,必须将此进程变为守护进程(在后台运行,不以终端方式与用户交互)。

            守护进程能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。

     

    二、守护进程特性

            守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来:这些环境包括未关闭的文件描述符控制终端会话和进程组工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。

            总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。

     

    三、创建守护进程步骤

    创建一个简单的守护进程:

    step1:创建子进程,父进程退出: (假象--父进程已完成,可退出终端)

    step2: 在子进程中创建新会话:使用系统函数setid()--进程组、会话期

    step3: 改变当前目录为根目录,用fork创建的子进程继承了父进程的当前工作目录

    step4: 重设文件权限掩码: umask(0)

    step5: 关闭文件描述符

     

      1、创建子进程,父进程退出: (假象--父进程已完成,可退出终端)

      这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离。

      在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程是,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。

      2、在子进程中创建新会话: 使用系统函数setid()--进程组、会话期

      这个步骤是创建守护进程中最重要的一步,虽然它的实现非常简单,但它的意义却非常重大。在这里使用的是系统函数setsid,在具体介绍setsid之前,首先要了解两个概念:进程组和会话期

      进程组:是一个或多个进程的集合。进程组有进程组ID来唯一标识。除了进程号(PID)之外,进程组ID也是一个进程的必备属性。每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。且该进程组ID不会因组长进程的退出而受到影响。

      会话周期:会话期是一个或多个进程组的集合。通常,一个会话开始与用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。

      接下来就可以具体介绍setsid的相关内容:

      (1)setsid函数作用:

      setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid有下面的3个作用:

      让进程摆脱原会话的控制

      让进程摆脱原进程组的控制

      让进程摆脱原控制终端的控制

      那么,在创建守护进程时为什么要调用setsid函数呢?由于创建守护进程的第一步调用了fork函数来创建子进程,再将父进程退出。由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,还还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。

      3、改变当前目录为根目录

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

      4、重设文件权限掩码: umask(0)

      文件权限掩码是指屏蔽掉文件权限中的对应位。比如,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限。由于使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性。设置文件权限掩码的函数是umask。在这里,通常的使用方法为umask(0)。

      5、关闭文件描述符

      同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。

            在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。通常按如下方式关闭文件描述符:

    for(i=0;i<MAXFILE;i++)  
        close(i);

    这样,一个简单的守护进程就建立起来了。

    实现守护进程的完整实例(每隔10s在/tmp/dameon.log中写入一句话):

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<fcntl.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<sys/wait.h>
    #define MAXFILE 65535
    int main()
    {
        pid_t pc;
        int i, fd, len;
        char *buf="this is a Dameon\n";
        len = strlen(buf);
        pc = fork(); //第一步
        if(pc<0){
            printf("error fork\n");
            exit(1);
        }
        else if(PC>0)
            exit(0);
            setsid(); //第二步
            chdir("/"); //第三步
          umask(0); //第四步
          for(i=0;i<MAXFILE;i++) //第五步
              close(i);
              if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0){
                  perror("open");
                  exit(1);
          }   
          while(1){
             write(fd,buf,len+1);
              sleep(10);
          }
    }
    

    四、守护进程编程要点

            不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样,区别在于具体的实现细节不同。这个原则就是要满足守护进程的特性。同时,Linux是基于Syetem V的SVR4并遵循Posix标准,实现起来与BSD4相比更方便。

    1. 在后台运行。

            为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。

    if(pid=fork())

    exit(0);//是父进程,结束父进程,子进程继续

    2. 脱离控制终端,登录会话和进程组

            有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。

            控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:setsid();

            说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

    3. 禁止进程重新打开控制终端

            现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:

    if(pid=fork())

    exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)

    4. 关闭打开的文件描述符

            进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:

    for(i=0;i 关闭打开的文件描述符close(i);>

    5. 改变当前工作目录

            进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/")

    6. 重设文件创建掩模

            进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);

    7. 处理SIGCHLD信号

            处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。

    signal(SIGCHLD,SIG_IGN);

            这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

    -------------------------------------------------------------------------------------------------------------------

    守护进程顾名思义就是默默运行在后台的进程。它具有以下特征:

    1. 父进程是init
    2. 没有和任何控制终端关联,所以也不会收到诸如SIGINT、SIGTSTP等信号
    创建守护进程步骤
    1. fork()创建子进程,父进程退出这样做的2个目的:

    • 使调用程序的控制台结束挂起,可以继续执行
    • 使得新创建的进程不会成为进程组的leader,保证了接下来的setsid()顺利执行

    1. 调用setsid(),创建新的session,使得调用者进程失去和控制终端的关联
    2. 避免进程后续打开终端设备不会成为控制终端,有2种办法:

    •  每次open()的时候指定参数O_NOTTY
    •  再执行一次fork()并且让主进程退出,使得进程的子进程不会成为会话的leader

    1. 清除从祖先继承下来umask值,以便后续的创建的文件文件夹能有指定的权限
    2. 改变工作目录(可选)

    •  一般是换到/目录下。如果不这样做,有可能导致占用文件系统,使之无法卸载。

    1. 关闭从父进程继承的文件描述符(可选)

    • 既然已经失去了控制终端,还保留0 1 2文件描述符就显得多余。
    • 当还有文件描述符在某个磁盘上时,会妨碍文件系统的卸载。

    1. 重定向描述符(可选)

    • 将0 1 2指向/dev/null
    • 避免后续向这3个描述符的io操作不会发生异常

    另外一个例子:
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    int daemonize() {
    
        // 1. 第一次fork()
        switch (fork()) {
        case -1: exit(-1); // fork错误
        case 0: break;     // 子进程继续
        default: exit(0);  // 父进程退出
        }
    
        // 2. 创建新的session
        setsid();
    
        // 3. 第二次fork()
        switch (fork()) {
        case -1: exit(-1); // fork错误
        case 0: break;     // 子进程继续
        default: exit(0);  // 父进程退出
        }
    
        // 4. 清空umask值
        umask(0);
    
        // 5. 改变工作目录(可选)
        chdir("/");
    
        // 6. 关闭从父进程继承来的文件描述符
        int maxfd = sysconf(_SC_OPEN_MAX); // 获取系统的最大打开文件数
        if (-1 == maxfd) {
            maxfd = 8192; // 获取失败,使用猜测的最大数
        }
        // 关闭所有文件描述符
        for (int fd = 0; fd < maxfd; fd++) {
            close(fd);
        }
    
        // 7. 重定向0 1 2
        close(STDIN_FILENO);
        int fd = open("/dev/null", O_RDWR);
        if (fd != STDIN_FILENO) {
            return -1;
        }
        if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO) {
            return -1;
        }
        if (dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO) {
            return -1;
        }
    
        return 0;
    }
    
    int main(int argc, char *argv[]) {
        daemonize();
        sleep(100);
        return 0;
    }
    

    注意:

            1.进程组的id需要和leader进程的id保持一致。由于组id是父进程的id,故子进程id必然不会和组的id一致。

            2.进程组leader调用setsid(),会发生EPERM错误。进程调用setsid()时,会同时创建新的进程组,并使用调用进程的id作为新进程组的组id。又因为进程组的组id总是组leader进程的id,若leader进程使用setsid()创建了新的session,一并创建的新的进程组id就会和原进程组id冲突。

            3.会话的id是setsid()的调用者的进程id。这里再fork()一次,会话的id就是父进程的id。则子进程的id必然不会是会话的id,进而失去了获得控制终端的能力。


    展开全文
  • linux使用Supervisor守护进程

    万次阅读 2021-07-15 11:24:56
    用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制, 应用场景 执行耗时爬虫任务 守护队列,以及...

    Supervisor是什么

    是Linux/Unix系统下的一个进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制,

    应用场景

    • 执行耗时爬虫任务
    • 守护队列,以及workman进程
    • 需要一直执行的程序

    安装Supervisor

    linux下直接执行yun安装,方便快捷

    yum install -y epel-release && yum install -y supervisor
    

    安装完会生成三个执行程序
    supervisortdsupervisorctlecho_supervisord_conf

    • supervisortd:用于管理supervisor本身服务
    • supervisorctl:用于管理我们需要委托给superviso工具的服务
    • echo_supervisord_conf:用于生成superviso的配置文件
    • supervisor的守护进程服务(用于接收进程管理命令)
    [root@ad581v8efzsd5 /]# which supervisord
    /bin/supervisord
    [root@ad581v8efzsd5 /]# which supervisorctl
    /bin/supervisorctl
    [root@ad581v8efzsd5 /]# which echo_supervisord_conf
    /bin/echo_supervisord_conf
    

    安装完启动

    #supervisord启动
    supervisord -c /etc/supervisord.conf                    #启动supervisord进程
    

    编写workman被superviso守护

    1. 找到配置文件
      /etc/supervisord.conf
    2. 在最下面添加如下代码
    vim /etc/supervisord.d/redis.conf
    
    [program:dd_thinkphp_workman]
    command=  /usr/local/php/bin/php  think  worker:server  ; 被监控进程
    directory= /data/wwwroot/thinkphp6;       项目地址(必填)
    ;process_name=%(process_num)02d 
    ;numprocs=1 #启动几个进程
    autostart=true ;随着supervisord的启动而启动
    autorestart=true ;自动启动
    startsecs=1 ;程序重启时候停留在runing状态的秒数
    startretries=10 ;启动失败时的最多重试次数
    redirect_stderr=true ;重定向stderr到stdout
    stdout_logfile=  /data/wwwlogs/dd_thinkphp_workman.log; stdout文件,日志文件
    
    1. 使用super启动workman
    #杀掉supervisord
    ps -ef|grep supervisord
    root     23164     1  0 10:47 ?        00:00:00 /usr/bin/python /bin/supervisord -c /etc/supervisord.conf
    root     27549 27402  0 11:07 pts/2    00:00:00 grep --color=auto super
    kill -9 23164     
    
    #重新启动supervisord使其重新加载配置文件,supervisord默认会把workman拉起来
    supervisord -c /etc/supervisord.conf
    
    1. 其他命令
    supervisorctl status workman                             #workman状态
    supervisorctl stopworkman                               #停止workman
    supervisorctl start workman                            #启动workman
    supervisorctl restart workman                            #重启workman
    supervisorctl reoload workman                             #重载workman
    

    管理supervisorctal

    supervisorctl status all                            #查看所有进程状态
    supervisorctl stop   all                            #停止所有进程
    supervisorctl start  all                            #启动所有进程
    supervisorctl restart all                           #重启所有进程
    supervisorctl reoload all                           #重载所有进程
    

    在这里插入图片描述

    总的来说是非常简单的,像一些队列啊,workman这些不能挂掉,就守护起来就行

    展开全文
  • linux进程守护脚本

    千次阅读 2019-01-18 09:58:25
    为了防止进程异常挂掉,为了避免影响业务,编写一个守护进程,定时检查某个进程是否存在,如果不存在则自动启动该进程。 编写脚本文件daemon.sh文件 while true; do server=`ps aux | grep eapi| grep -v grep` if ...
  • Linux守护进程shell脚本

    2019-11-05 14:12:02
    linux守护进程shell脚本,可检测当前目录下需要守护的程序是否已经执行,如果已经执行,只需守护,如果没运行,会自动启动程序并进行守护。 其他目录下同名的程序运行不影响当前目录的进程守护。 具体用法,放到需要...
  • linux python守护进程编写

    千次阅读 2017-03-30 15:39:41
    转自:守护进程 守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器...
  • Linux nohup 守护进程

    千次阅读 2012-01-05 10:52:49
     Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:  /usr/local/mysql/bin/mysqld_safe –user=mysql &  但是我们很多程序并不象mysqld一样...
  • Linux守护进程编写

    2019-04-12 00:09:38
    Linux守护进程编写 环境:VMware 15 + ubuntu 16 护进程的特点 后台服务程序,随系统启动而启动。 很多系统服务通过守护进程完成。 守护进程的名字往往以字母‘d’结尾 生存周期长。系统装入时...
  • linux nohup守护进程

    2018-07-27 17:26:02
    后台守护进行 nohup php websocket.php &gt;/dev/null 2&gt;&amp;1 &amp;  查看进程 ps -aux |grep "php websocket.php"  杀死进程 kill -9 22234   5. 开机自启 通过...
  • 它可以自动修复那些已经停止运作的程序,特使适合处理那些由于多种原因导致的软件错误。 对你的网站来说,让你的 Apache,MySQL 和类似的进程一直处于运行状态至关重要。有几 个很好的工具,例如 Monit 和 ...
  • Linux系统的守护进程

    千次阅读 2017-03-30 14:27:21
    Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了 Linux 的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的,有些书籍和资料也把守护...
  • LINUX守护进程介绍

    2009-07-29 21:54:35
    LINUX守护进程介绍 amd:自动安装NFS(网络文件系统)守侯进程 apmd:高级电源管理 Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库 Autofs:自动安装管理进程automount,与NFS相关,...
  • Linux 守护进程

    千次阅读 2018-08-26 11:06:13
     守护进程, 也就是通常所说的 daemon 进程, 是 Linux 中的后台服务进程。 它是一个生存期较长的进程, 通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 守护进程常常在系统引导载入时启动...
  • 理解Linux守护进程

    千次阅读 2010-03-05 11:27:00
    Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台...linux系统有很多守护进程,大多数服务器都是用守护进程实现
  • linux守护进程的编写

    千次阅读 2018-10-23 20:57:42
    Linux守护进程 了解守护进程的特点 了解ps中查看守护进程的方法 了解会话相关概念 掌握编写守护进程的方法 一、基础知识 1)进程的类型,进程大体分为三类  (1)交互进程  (2)批处理进程  (3)守护进程 2...
  • Linux守护进程的概念

    千次阅读 2018-07-09 10:43:07
     守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统...
  • 由于有许多程序需要在CLI模式下运行,nohup虽然可以在保持在后台一直运行,即时退出登录,但是不太便于管理,故搜索了下Linux守护进程管理工具,发现Supervisor,总体感觉挺好用的,所以分享给更多的人使用。...
  • Linux守护进程

    千次阅读 2012-07-26 15:55:26
    守护进程,就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存起较长的进程,通常独立于控制终端,并且周期性的执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导时候启动,在系统关闭...
  • linux tomcat守护进程

    千次阅读 2015-08-12 13:09:19
    我们需要写一个进程监控的脚本,目的是检测tomcat进程是否停掉,如果挂了,自动拉起,所以我们写了如下的脚本,参考了一些资料,希望对有需要的人有所帮助。 #!/bin/bash echo "Start" URL="...
  • Linux nohup守护进程经验

    千次阅读 2015-08-06 09:53:55
    因为我使用xshell,启动jetty,但发现一关闭窗口就自动和主机断开了,和Windows的终端不一样,所以就上网找啊找,网上说普通的一些程序,& 结尾,终端关闭,那么程序也被关! 于是就查为什么ssh一关闭,程序就不再运行...
  • linux C 守护进程及其创建

    千次阅读 2013-07-24 11:10:37
    守护进程:在linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统。守护进程...
  • 何为守护进程 、进程组 / 组长进程 / 会话 / 会话首进程 、守护进程的创建步骤 、创建守护进程程序示例
  • 由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能...
  • 系统守护进程 /etc/inetd.conf 或/etc/xinetd.conf 适合访问量小 独立守护进程 standalone 适合访问量大 standalone一次性启动,运行期间一直驻留在内存中,优点是对接入信号反应快,缺点是损耗了一定的系统资源...
  • Linux 守护进程原理

    2013-08-12 20:41:46
    Linux系统中的守护进程是一种运行在后台的进程。而守护进程,也就是通常说的Daemon进程。它通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。linux大多数服务器进程就是用守护进程实现的,例如...
  • Linux守护进程列表

    2012-02-20 22:33:05
    Linux启动时需要加载很多服务,提供这些服务的程序是由运行在后台的守护进程来执行的。守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。常常在系统引导装入时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,801
精华内容 27,920
关键字:

linux自动守护

linux 订阅