`
superisaac
  • 浏览: 64341 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

unix 下程序monitor的简单实现

阅读更多
用c/c++编的程序, 有时会因为某种错误而终止, 如果我们希望终止了也能及时重启. 那么可以考虑monitor/worker模式.

父进程作为monitor, 子进程作真实的工作, 每次子进程终止的时候, monitor通过wait得知, 然后重新fork一个工作子进程, 当monitor被信号杀死的时候, 则杀掉子进程, 唯一的问题是当monitor 被SIGKILL杀死的时候, 无法添加信号回调函数, 也就无法杀掉子进程.

/**
 * Monitor to respawn a working process 
 */
bool terminating = false;
pid_t child_pid = 0;

// This function will be called on calling exit() or return of main()
static void on_monitor_exit()
{
  if(child_pid != 0) {
    terminating = true;
    kill(child_pid, SIGINT);
  }
}

static void stop_monitor(int v) {
  if(child_pid != 0) {
    // Send sigint to child worker
    terminating = true;
    kill(child_pid, SIGINT);
  } else {
    exit(128+v); // 128 + signal is the default exit status on signal
  }
}

static void reload(int v) {
  // doesnot terminate monitor, restart child instead
  if(child_pid != 0) {
    kill(child_pid, SIGINT);
  } else {
    exit(128+v);  // 128 + signal is the default exit status on signal
  }
}

int main(int argc, char ** argv) {
  static bool monitor_initialized = false;
  while(!terminating) {
    child_pid = fork();
    if(child_pid == 0) {
      // In child process, do the actual work
      return child_run(argc, argv);
    } else {
      if(!monitor_initialized) {
	signal(SIGINT, stop_monitor);
	signal(SIGTERM, stop_monitor);
	signal(SIGHUP, reload);
	atexit(on_monitor_exit);
	monitor_initialized = true;
      }

      // Wait for child return
      int child_status;
      pid_t pid = wait(&child_status);
      if(pid != child_pid) {
	break;
      }
    }
  }
  // Monitor stops
}

分享到:
评论

相关推荐

    使用HostMonitor实现运维自动化监控

    ### 使用HostMonitor实现运维自动化监控的关键知识点 #### 一、前言与程序介绍 - **HostMonitor**是一款功能强大的IT基础设施监控工具,适用于各种规模的企业。它可以自动化地监控网络设备和服务的状态,帮助管理员...

    简单网络数据包分析程序

    9. **工具介绍**:市面上有许多知名的数据包分析工具,如Wireshark(开源且功能强大)、Microsoft Network Monitor、Tcpdump(命令行工具,主要在Unix-like系统上使用)等,每款工具都有其特点和适用场景。...

    java检测程序系统

    5. **线程与并发**:为了实现持续监控,程序可能采用多线程设计,其中一个线程负责数据采集,另一个线程负责更新界面。 6. **用户界面**:系统可能提供简单的命令行界面或GUI界面,让用户能够交互式查看和控制监控...

    Simple Unix MONitor (sumon)-开源

    **Simple Unix Monitor (SUMON)** 是一个开源项目,专门设计用于监控UNIX和Linux系统的健康状况。SUMON提供了直观的Web界面,使得系统管理员能够轻松地查看和管理他们的服务器集群,确保其性能稳定并能及时发现潜在...

    UNIX 操作系统基础实验 - 用户登录监测.pdf

    这份文档介绍了一个简单的脚本程序,用于监控特定用户的登录情况。以下是对这个实验内容的详细解释: 1. **shell脚本**: 脚本中的`check_user()`函数是循环执行的,它会每隔5秒检查一次用户登录状态。如果脚本...

    ip包捕获的应用程序

    3. Microsoft Network Monitor:这是Microsoft提供的网络分析工具,特别适合Windows环境下的网络问题诊断。 三、IP包捕获的应用场景 1. 故障排查:当网络连接出现问题时,可以通过捕获数据包来查找错误根源,例如丢...

    中等规模的并发程序设计.ppt

    Herb Sutter预测,从2007年到2012年,并发程序设计将变得更加普及和简单。在这个变革中,开发者有机会利用新的技术框架,如Executor、Future和Blocking Queue,以及lock-free数据结构来构建并发程序。 **线程模型**...

    多线程应用程序ppt课件

    1. **单线程程序设计**:在单线程环境下,程序按照预定顺序执行,简单易懂,且可预测性强。由于只有一个执行流,所以变量的访问和修改都是有序的,不会出现数据竞争问题。 2. **多进程程序设计**:Unix等操作系统...

    network_monitor:愚蠢的脚本,用于将定期的Internet可用性和速度测试上载到同一仓库

    关于标签"Shell",这表明`network_monitor`使用的是Shell编程语言,如bash或sh,这种语言广泛用于Unix和Linux系统中,用于编写简单的系统管理任务和自动化流程。Shell脚本通常包含一系列命令行指令,可以读取输入、...

    TUXEDO模拟运行程序

    1. **服务代码**:展示了如何定义和实现一个简单的TUXEDO服务。 2. **客户端代码**:演示了如何使用ATMI API调用服务,进行数据交互。 3. **配置文件**:可能包含`tuxconfig`文件,用于设置服务器的启动参数。 4....

    python编写守护进程实现当python进程被杀后重启进程的源代码

    在Unix-like操作系统中,守护进程通常在用户登录会话之外运行,避免受到用户退出或终端关闭的影响。为了将一个进程转换为守护进程,我们需要遵循以下步骤: 1. **脱离控制终端**:通过`os.setsid()`创建一个新的...

    第四次实验报告1

    MiniX提供了对核心操作系统概念的简单实现,便于理解。 1. **内存管理**: - `brk`系统调用:在Unix系统中,`brk`是改变程序数据段结束地址的函数,用于动态分配内存。通过调整堆的边界,`brk`可以扩展或收缩程序...

    Linux系统下ARM远程调试环境的构建.pdf

    GDB(GNU Debugger)是GNU开源组织发布的一款强大的Unix下的程序调试工具。由于嵌入式系统资源有限,无法直接在目标系统上运行GDB,所以需要在主机上运行GDB,并在目标系统上运行GDB Server,通过网络连接实现远程...

    如何提高Linux Java性能的分析

    获取Java线程堆的常见方法是在Unix系统中向JVM发送SIGQUIT信号,这通常可以通过`kill -3 <进程ID>`命令实现。这个操作不会导致应用程序停止,而是生成一个线程堆的输出,帮助开发者了解程序执行的实时状态。 例如,...

    Dbus简介和例程

    DBus是Linux系统中的一种消息总线服务,它允许不同的应用程序之间进行通信,实现了进程间通信(IPC,Inter-Process Communication)。DBus的核心理念是提供一种简单、高效且安全的方式来协调和同步多个运行在相同...

    TASKCTL-5.0-新手体验指南

    无论是Windows还是Linux/Unix环境下的安装,还是通过Designer或Monitor进行开发和监控,亦或是通过命令行工具进行高级管理操作,都能让使用者更加高效地完成工作任务。希望本指南能够为您的学习之旅提供有价值的参考...

    Linux 监控tomcat,自动重启tomcat服务

    本文将详细介绍如何通过编写一个简单的Shell脚本来实现这一目标。 #### 二、关键知识点解析 ##### 1. **监控脚本的基本结构** - **脚本头部声明**:`#!/bin/sh` 指定了此脚本使用`/bin/sh`作为解释器。 - **变量...

    monit-4.9.tar

    Monit 是一款在 Unix-like 系统中广泛使用的开源监控工具,主要用于监控系统服务、文件、目录、程序以及网络资源的状态。"monit-4.9.tar" 是这个软件的一个特定版本,通常以 tar 归档文件的形式提供,用于在各种 ...

    文件或目录监控

    在Windows环境下,使用`FileSystemWatcher`类,我们可以轻松实现文件或目录的监控。首先,需要创建一个`FileSystemWatcher`实例,并配置其属性,如`Path`(要监视的目录)、`Filter`(要监视的特定文件类型)以及`...

    黑客反汇编揭秘(第二版).part2.rar

    第8章 在UNIX与Linux下的特殊调试技术 123 8.1 GDB的基础——ptrace 124 8.1.1 ptrace及其命令 126 8.1.2 GDB对多进程的支持 127 8.1.3 GDB简介 128 8.1.4 跟踪系统调用 131 8.2 用GDB调试二进制文件 133 ...

Global site tag (gtag.js) - Google Analytics