精华内容
下载资源
问答
  • Linux守护进程

    2014-06-17 15:24:49
    在公司做项目的时候为了防止服务器中的bug导致程序崩溃,通常情况下需要一个进程负责监控你的服务器程序即使发生崩溃的情况也能在第一时间将服务器重启不至于会发生服务器程序崩溃而再也无法启动的情况。为此,我写...

            在公司做项目的时候为了防止服务器中的bug导致程序崩溃,通常情况下需要一个进程负责监控你的服务器程序即使发生崩溃的情况也能在第一时间将服务器重启不至于会发生服务器程序崩溃而再也无法启动的情况。为此,我写了一个监测程序,采用守护进程的方式来实现。

    守护进程是一种在后台运行的特殊进程,它脱离了终端从而避免进程被任何终端所产生的信号所打断。

    守护进程有以下几个要点:

          1. 屏蔽一些有关控制终端的操作信号。这是为了防止守护进程在运行起来之前控制终端受到干扰而挂起。

          for(inti=0;i<31;i++)

          {

            signal(SIGTTOUT,SIG_IGN);

          }

          2.  在后台运行。方法是创建子进程,并让父进程退出,使子进程在后台运行

         if(pid==fork())

         {

             exit(0);

         }

        3.  脱离控制终端和进程组。方法是需要调用setsid()函数使子进程形成新的会话组组长。

               setsid();

       4.  禁止进程重新打开终端。当进程已经成为了无终端的会话组组长了之后它依然可以申请重新打开一个终端。方法是再创建一次子进程。并让父进程退出,那么该子进程就不         再是会话组的组长了,就无权再打开终端。

                 if(pid=fork)

                       exit(0);

        5. 关闭打开的文件描述符,包括标准的输入输出,如果不关闭会造成资源的浪费。  还会造成进程所在的文件系统无法卸载造成无法预料的错误。

              #define NOFIFLE 256  //不同的系统有不同的限制

              for(int i=0;i<NOFIFLE;i++)

             {

                   close(i);

             }

       6. 重设文件创建掩码。因为子进程从创建它的父进程那里继承了文件创建掩码,它          可能修改守护进程所创建的文件存取权限。所以要将文件创建掩码清除。

                umask(0);

       7. 处理子进程退出信号,让系统负责回收子进程退出时产生的僵尸。

               signal(SIG_CHLD,SIG_IGN);

     

          以下是我用守护进程的方式写的一个服务器监控程序,它负责去启动指定的程序,并对其进行监控,一旦程序异常退出或崩溃,监控程序立即将它重启:

            

    #include <QtCore/QCoreApplication>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/wait.h>
    #include <QFile>
    //#define ARM_LIFECUBE
    
    #define NUM_FILE 256
    #define NOW_DIR "/data/local/KD"
    #define TOOL_PATH "/data/local/KD/tool"
    #define TOOL "tool"
    #define DNS_PATH "/data/local/KD/qtdns"
    #define DNS "qtdns"
    
    #ifndef ARM_LIFECUBE
    #define SERVER_PATH "/data/local/KD/itoneserver"
    #define SERVER "itoneserver"
    #else
    #define SERVER_PATH "/data/local/KD/LifeCube"
    #define SERVER "LifeCube"
    #endif
    void startGuard(const char *strPath,const char *strProcess)
    {
        QFile filePath(strPath);
        if(!filePath.exists())
            return;
        if(filePath.size()<=0)
            return;
        if(access(strPath,X_OK) != 0)
            return;
        int pidGuard = fork();
        if(pidGuard == 0)
        {
           execl(strPath,strProcess,NULL);
        }
        else if(pidGuard > 0)
        {
           waitpid(pidGuard,NULL,0);
           startGuard(strPath,strProcess);
        }
        else
        {
          exit(EXIT_FAILURE);
        }
    
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        signal(SIGTTOU,SIG_IGN);
        signal(SIGTTIN,SIG_IGN);
        signal(SIGTSTP,SIG_IGN);
        signal(SIGHUP,SIG_IGN);
        //忽略输入,输出,停止,挂起,信号
        int pid = fork();
        if(pid > 0)
            exit(EXIT_SUCCESS);
        else if(pid < 0)
            exit(EXIT_FAILURE);
        //保证在后台运行
        else
        {
            setsid();//新建进程组
            pid = fork();
            if(pid >0 )
            {
                exit(EXIT_SUCCESS);//禁止进程重新打开控制终端
            }
            else if(pid < 0)
            {
                exit(EXIT_FAILURE);
            }
            else
            {
                for(int i = 0;i<NUM_FILE;i++)
                    close(i);
                chdir(NOW_DIR);
                umask(0);//重建文件创建掩码
                signal(SIGCHLD,SIG_IGN);//忽略子进程退出信号
                /*
                pid_t pidGuard = fork();
                if(pidGuard == 0)
                {
                    startGuard(DNS_PATH,DNS);
                }
                else if(pidGuard < 0)
                {
                   exit(EXIT_FAILURE);
                }
                */
                //主进程
                pid_t pidServer = fork();
    
                if(pidServer == 0)
                {
                    startGuard(SERVER_PATH,SERVER);
                }
                else if(pidServer < 0)
                {
                   exit(EXIT_FAILURE);
                }
                //主进程
                pid_t pidTool = fork();
                if(pidTool == 0)
                {
                   startGuard(TOOL_PATH,TOOL);
                }
                else if(pidTool < 0)
                {
                   exit(EXIT_FAILURE);
                }
            }
        }
        return a.exec();
    
    }
    

    展开全文
  • linux 守护进程

    2016-11-16 12:43:53
    int main() {  static int nCount = 0;  pid_t pid;  int ret = -1, status; ... //初始化记录崩溃的次数  RecordKilledTimes( nCount );  while(1)  {  pid = fork();  i


    int main()
    {
        static int nCount = 0;
        pid_t pid;
        int ret = -1, status;

        //初始化记录崩溃的次数  

        RecordKilledTimes( nCount );

        while(1)
        {
            pid = fork();
            if (pid == -1)
            {
                printf( "fork() error.errno:%d error:%s", errno, strerror(errno) );
            }

            if (pid == 0)
            {
                ret = execv(APP_PATH, NULL); /APP_PATH 这个是你 要重启的app路径
                if (ret < 0)
                {
                    fprintf(stderr, "execv ret:%d errno:%d error:%s<strong>n</strong>", ret, errno, strerror(errno));
                    printf( "fork() error.errno:%d error:%s", errno, strerror(errno) );
                    continue;
                }
                exit(0);
            }

            if (pid > 0)
            {
                pid = wait(&status);
                RecordKilledTimes( ++nCount ); //记录崩溃的次数
                printf( "wait return\n" );
            }

        }
        return 0;
    }


    展开全文
  • ...Monit是一款功能非常丰富的进程、文件、目录和设备的监测软件,...你的整个系统崩溃前终止它。配置这件事的规则 是个老大难问题,但是当一切都做好的时候,可 以节省大量的凌晨 3 点钟的宕机时间。



    Monit是一款功能非常丰富的进程、文件、目录和设备的监测软件,用于Unix平台。它可以自动修复那些已经停止运作的程序,特使适合处理那些由于多种原因导致的软件错误。


    对你的网站来说,让你的 Apache,MySQL
    和类似的进程一直处于运行状态至关重要。有几
    个很好的工具,例如 Monit 和 God,可以帮助你
    确保你的进程一直处于运行状态。通过检查进程
    的响应性,打开的端口,或进程 id 那些工具可以
    重新启动一个已死的服务或在一个失控的进程使
    你的整个系统崩溃前终止它。配置这件事的规则
    是个老大难问题,但是当一切都做好的时候,可
    以节省大量的凌晨 3 点钟的宕机时间。

    展开全文
  • 我有一个运行嵌入式Linux的系统,它连续运行至关重要.基本上,它是一个与传感器通信并将数据中继到数据库和Web客户端的过程.如果发生崩溃,如何自动重启应用程序?此外,有几个线程正在进行轮询(例如套接字和uart通信)....

    我有一个运行嵌入式

    Linux的系统,它连续运行至关重要.基本上,它是一个与传感器通信并将数据中继到数据库和Web客户端的过程.

    如果发生崩溃,如何自动重启应用程序?

    此外,有几个线程正在进行轮询(例如套接字和uart通信).如何确保没有线程挂断或意外退出?是否有一个易于使用的看门狗,线程友好?

    它的要点是:

    >您需要检测程序是否仍在运行而不是挂起.

    >如果程序未运行或挂起,则需要(重新)启动程序.

    有许多不同的方法可以做#1,但有两个想到的方法是:

    >在UNIX域套接字上侦听,以处理状态请求.然后,外部应用程序可以查询应用程序是否仍然正常.如果在某个超时时间内没有响应,则可以假定被查询的应用程序已死锁或已死.

    >定期触摸具有预选路径的文件.外部应用程序可以查看文件的时间戳,如果它是陈旧的,那么它可以假定应用程序已死或死锁.

    关于#2,杀死先前的PID并使用fork exec启动新进程是典型的.您也可以考虑将“连续”运行的应用程序放入运行一次的应用程序中,然后使用“cron”或其他应用程序连续重新运行该单次运行的应用程序.

    不幸的是,看门狗定时器和摆脱僵局是非常重要的问题.我不知道有什么通用的方法可以做到这一点,我见过的少数几个非常难看,而且不是100%没有bug.但是,tsan可以帮助检测静态分析中潜在的死锁情况和其他线程问题.

    展开全文
  • 进程监控和守护 linux C

    热门讨论 2011-08-12 09:17:56
    进程监控 进程守护 linux C语言 j进程重启 进程管理 利用linux C语言编写,读取配置文件里面要求启动的程序,并进行实时监控,若进程异常退出,就重新启动 主要功能: 1.读取配置文件程序 2.启动进程 3.监控进程,...
  • 服务器上运行的程序我们希望一直运行,长时间提供服务,但是在程序不稳定导致崩溃、系统重启的情况下不能自启动,所以需要提供一个守护程序能在异常的情况下重新启动要守护的程序已达到目的。 思路 1.使用一个...
  • 幸*启动配置文件当中的需要守护的程序 执行成功返回1,中途出错,返回-1 长界零家墨军零家零率家三哮零座零率零零容岸军零罕型率零零零零牢察座察零零零零季球军零容零 int moniter_ run(struct proc_struct"must...
  • golang使用linux共享内存及信号实现崩溃重启 最近项目里有用到共享内存,来实现程序崩溃自启,具体做法就是建立一个守护进程,守护进程实时监测一片共享内存,发现有程序崩溃的时候往里写的数据是某个程序崩溃前写进去...
  • 在第一部分本系列教程我们分享使用 MySQL 的如何崩溃或重启后启用的 Linux 服务自动启动一些实际的例子。 我们看到了如何从三个不同的初始化方式做到这一点:System V 的,Upstart,和 systemd。阅读第一个教程在其...
  • 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 /etc/syslogd,默认配置文件为 /etc/syslog.conf,任何希望生成日志的程序都可以向 syslog 发送信息。Linux系统内核和许多程序会产生各种错误...
  • linux c release库崩溃 objdump txdb 源码分析系列(三) https://blog.csdn.net/TuxedoLinux/article/details/80358677 tuxedo安装与配置入门 https://www.cnblogs.com/liuxinkai/p/9561017.html Tuxedo 介绍 ...
  • 我们的一台Linux(CentOS)服务器昨晚无法访问.除远程控制台外,服务器无法以任何方式访问.使用远程控制台登录后,结果发现我无法ping任何外部主机.一个简单的服务网络重启解决了这个问题,但我仍然想知道是什么导致了这...
  • 在 web 应用部署到线上后,需要保证应用一直处于运行状态,在...Supervisor 就是解决这种需求的工具,可以保证程序崩溃后,重新把程序启动起来等功能。 Supervisor 是一个用 Python 写的进程管理工具,可以很...
  • 提供:ZStack云计算 系列教程本教程为如何配置一项在崩溃或重启后自动启用的Linux服务系列两篇中的第二篇。内容介绍在本文中,我们将更为具体地解释上篇教程中提到的各init进程,帮助大家更好地理解其如何控制守护...
  • supervisor可以保证程序崩溃后,可以重新把程序启动起来等相关功能。 安装 yum install -y supervisor 安装好后在/etc/会生成一个supervisord.conf文件及一个supervisord.d文件目录 查看supervisor是否安装成功 ...
  • Linux内核漏洞浅析

    2020-03-04 11:39:15
    Linux的拒绝服务大多数都无须登录即可对系统发起拒绝 服务攻击,使系统或相关的应用程序崩溃或失去响应能力,这种方式属于利用系统本身漏洞或其守护进程缺陷及不正确设置进行攻击。由于tcp/ip本身的缺陷,导致很多...
  • flume 崩溃问题

    2017-04-23 20:18:14
    flume 如果使用 exec , tail -f 方式收集日志,会有已定概率丢失,崩溃。解决办法: 1 增加 restart 属性配置 ,可以稳定运行近一个月。...2 配置第二到保险,使用 crontab -e 增加一个linux守护任务 shell 脚本。
  • linux 日志

    千次阅读 2005-10-25 23:33:00
    前些日子,去了民生人寿保险公司,他们的邮件服务器崩溃了。为了解决责任归属问题,进行了log文件查找问题。 linux系统的日志服务是/etc/syslogd linux 系统的log文件都保存在 /var/log/中。其中最重要的就是...
  • MySql在Linux的启动方式

    万次阅读 2016-05-25 15:16:10
    Linux系统下,MySQL服务器通常有四种启动方式:mysqld守护进程启动,mysqld_safe启动,mysql.server启动,mysqld_multi多实例启动。1、mysqld守护进程启动一般的,我们通过这种方式手动的调用mysqld,如果不是出去...
  • windows程序崩溃对话框和异常处理

    万次阅读 2011-12-26 22:34:28
    经常碰到某些程序崩溃时弹出带红色叉叉...如果程序异常退出就会重启那个程序,这在linux下没问题,程序崩溃了就直接退出返回非零值,但是window就bug了,搞不好就给你弹出个错误对话框,你不点掉其实程序就没退出,守护
  • linux-进程与进程环境

    2019-10-13 21:06:06
    Linux系统中,根据进程的特点,进程可分为3大类:交互进程、批处理进程和守护进程。 l 交互进程:由Shell启动的进程,可在前后台运行,在执行过程中要求与用户进行交互操作; l 批处理进程:类...
  • 进程分类在Linux系统中,根据进程的特点,进程可分为3大类:交互进程、批处理进程和守护进程。l 交互进程:由Shell启动的进程,可在前后台运行,在执行过程中要求与用户进行交互操作;l 批处理进程:类
  • RED HAT LINUX 6大全

    热门讨论 2011-10-21 18:46:06
    13.2 启动和停止NFS守护程序 236 13.3 NFS状态 236 13.4 配置NFS服务器和客户 236 13.4.1 建立/etc/exports文件 237 13.4.2 使用mount加载一个导出的文 件系统 238 13.4.3 卸载文件系统 238 13.4.4 配置/etc/fstab...
  • ServerArk是Linux游戏服务器的应用程序,可在内核级别实时采样和分析传入的UDP数据包,以确定是否有任何数据包是UDP泛洪攻击的一部分。 游戏服务器上的泛洪攻击通常旨在使服务器上的玩家滞后到无法玩游戏的地步。 它...
  • 除此之外,我们还将保证我们的web应用程序作为一个守护进程来进行启动。我们需要配置一个进程管理工具来帮助我们在程序崩溃时恢复程序,以保证高可用性。 章节: 准备 复制你的应用程序 配置一个反向代理服务器 ...
  • Linux网络编程(张斌)

    热门讨论 2009-07-09 10:19:32
    · 6.7 守护进程(daemon process) · 6.8 超级服务器:inetd守护进程 · 6.9 小结 第7章 高级套接字函数 --------------------------------------------------------------------...
  • 一、背景Linux将大量事件记录到磁盘上,它们大部分以纯文本形式存储在/var/log目录中。大多数日志条目通过系统日志守护进程syslogd,并被写入系统日志。Ubuntu包括以图形方式或从命令行查看这些日志的方法。你也可以...

空空如也

空空如也

1 2 3 4
收藏数 69
精华内容 27
关键字:

linux守护崩溃

linux 订阅