代码之家  ›  专栏  ›  技术社区  ›  Waxhead

Linux下segfault的自重启程序

  •  3
  • Waxhead  · 技术社区  · 14 年前

    在Linux下,通过在crashhandler中捕获异常(例如在segfault上),程序在崩溃时重启自己的最佳方式是什么?

    7 回复  |  直到 14 年前
        1
  •  6
  •   llasram    14 年前

    fork() ,在子级中执行真正的工作,只需等待子级并在父级中检查其退出状态。您还可以使用一个系统,以类似的方式监视和重新启动程序,例如daemontools、runit等。

        2
  •  11
  •   Anycorn    14 年前

    while [ 1 ]; do ./program && break; done
    

    基本上,运行程序直到返回0,然后中断。

        3
  •  7
  •   dmckee --- ex-moderator kitten    14 年前

    SIGSEGV man 3 signal man 2 sigaction ),程序可以调用 exec SIGFPE , SIGILL , SIGBUS , SIGSYS

    不过,在做这件事之前我会想一想。对于unix程序来说,这是一种相当不寻常的策略,您可能会给用户带来惊喜(也不一定是以一种令人愉快的方式)。

    无论如何,一定要 SIGTERM SIGKILL 你会留下一团糟。

        4
  •  3
  •   Roman Nikitchenko    14 年前

    作为对此处提议的补充:

    它可能看起来像下面的文件片段。明显的优势这意味着相当标准,它允许通过运行级别控制您的守护进程。

    # Run gettys in standard runlevels
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2
    3:2345:respawn:/sbin/mingetty tty3
    4:2345:respawn:/sbin/mingetty tty4
    5:2345:respawn:/sbin/mingetty tty5
    6:2345:respawn:/sbin/mingetty tty6
    
        5
  •  1
  •   Shaggy Frog    14 年前

    进程不能自己重新启动,但是可以使用 crontab(1) 安排脚本以定期检查进程是否仍处于活动状态。

        6
  •  1
  •   Ciarán    14 年前

    程序本身显然不应该检查它是否正在运行:)

    ps() 对于给定的字符串,并在满足某些条件的情况下执行操作—即,如果找不到进程,则调用开始脚本。

        7
  •  1
  •   enthusiasticgeek    12 年前

    如果特定于segfault,请尝试以下代码。可以根据需要进行修改。

    #include <stdio.h> 
    #include <signal.h> 
    #include <setjmp.h> 
    #include <poll.h>
    
    sigjmp_buf buf; 
    void handler(int sig) { 
    siglongjmp(buf, 1); 
    } 
    int main() { 
    //signal(SIGINT, handler); 
    //register all signals
    struct sigaction new_action, old_action;
    new_action.sa_handler = handler;
    sigemptyset (&new_action.sa_mask);
    new_action.sa_flags = 0;
    
    sigaction (SIGSEGV, NULL, &old_action);
    if (old_action.sa_handler != SIG_IGN)
    sigaction (SIGSEGV, &new_action, NULL);
    
    if (!sigsetjmp(buf, 1)){
    printf("starting\n"); 
    //code or function/method here
    }
    else{  
    printf("restarting\n"); 
     //code or function/method here
    }
    while(1) {
    poll(NULL,0,100); //ideally use usleep or nanosleep. for now using poll() as a timer
    printf("processing...\n");
    }
    return 0; //or exit(SUCESS)
    }