Designing a monitor process for monitoring and restarting processes

前端 未结 4 1519
灰色年华
灰色年华 2020-12-19 22:33

I am designing a monitor process. The job of the monitor process is to monitor a few set of configured processes. When the monitor process detects that a process has gone do

相关标签:
4条回答
  • 2020-12-19 23:34

    Let's see if I've understood you. You have a list of children and you are running a loop on /proc on your SIGCLD handler to see which children are still alive, isn't it?

    That's not very usual,... and it's a but ugly,

    What you usually do is run a while((pid = waitpid(-1, &status, WNOHANG))) loop on your SIGCLD handler, and use the returned pid and the Wxxx macros to maintain your children list up to date.

    Notice that wait() and waitpid() are async-signal-safe. The functions you are calling to examine /proc are probably not.

    0 讨论(0)
  • 2020-12-19 23:34

    Look into supervisord. It works great.

    0 讨论(0)
  • 2020-12-19 23:37

    You should not be checking /proc to determine which process has exited - it's possible for another, unrelated, process to start in the meantime and be coincidentally assigned the same PID.

    Instead, within your SIGCHLD handler you should use the waitpid() system call, in a loop such as:

    int status;
    pid_t child;
    
    while ((child = waitpid(-1, &status, WNOHANG)) > 0)
    {
        /* Process with PID 'child' has exited, handle it */
    }
    

    (The loop is needed because multiple child processes may exit within a short period of time, but only one SIGCHLD may result).

    0 讨论(0)
  • 2020-12-19 23:40

    You can easily tell if a process is alive by issuing a kill() system call to its pid. If the child is not alive, kill() will not succeed.

    Also, calling waitpid() with the WNOHANG option will return zero immediately if the process is still alive.

    IMHO, reading proc files or piping to ps is a nasty way to do it.

    0 讨论(0)
提交回复
热议问题