亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

詳解Linux監控重要進程的實現方法

2024-09-01 13:54:40
字體:
來源:轉載
供稿:網友

不管后臺服務程序寫的多么健壯,還是可能會出現core dump等程序異常退出的情況,但是一般情況下需要在無

人為干預情況下,能夠自動重新啟動,保證服務進程能夠服務用戶。這時就需要一個監控程序來實現能夠讓服務進程自動重新啟動。查閱相關資料及嘗試一些方法之后,總結linux系統監控重要進程的實現方法:腳本檢測和子進程替換。

1、腳本檢測

(1) 基本思路: 通過shell命令(ps -e | grep "$1" | grep -v "grep" | wc -l) 獲取 $1 ($1 代表進程的名字)的進程數,腳本根據進程數來決定下一步的操作。通過一個死循環,每隔幾秒檢查一次系統中的指定程序的進程數,這里也可使用crontab來實現。

(2) 具體實現過程的代碼如下: [ supervisor.sh ]

#! /bin/sh # supervisor process   LOG_FILE=/var/log/supervisor_sh.log  # log function  function log() {   local t=$(date +"%F %X")   echo "[ $t ] $0 : $1 " >> ${LOG_FILE} }  # check process number  # $1 : process name  function check_process() {   if [ -z $1 ]; then     log "Input parameter is empty."     return 0      fi      p_num=$(ps -e | grep "$1" | grep -v "grep" | wc -l)   log "p_num = $p_num"    echo $p_num }  # supervisor process  while [ 1 ] do    declare -i ch_num   p_name="apache2"   ch_num=$(check_process $p_name)   if [ $ch_num -eq 0 ]; then     killall $p_name     service $p_name start    fi   sleep 3  done 

2、子進程替換

(1) 基本思路:

a. 使用fork函數創建一個新的進程,在進程表中創建一個新的表項,而創建者(即父進程)按原來的流程繼續執行,子進程執行自己的控制流程

b. 運用execv函數把當前進程替換為一個新的進程,新進程由path或file參數指定,可以使用execv函數將程序的執行從一個程序切換到另一個程序

c. 當fork啟動一個子進程時,子進程就有了它自己的生命周期并將獨立運行,此時可以在父進程中調用wait函數讓父進程等待子進程的結束

(2) 基本的實現步驟:

a. 首先使用fork系統調用,創建子進程

b. 在子進程中使用execv函數,執行需要自動重啟的程序

c. 在父進程中執行wait函數等待子進程的結束,然后重新創建一個新的子進程

(3) 具體實現的代碼如下: supervisor.c

/**  *  * supervisor  *  * date: 2016-08-10  *  */  #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <time.h>  #define LOG_FILE "/var/log/supervisor.log"  void s_log(char *text) {   time_t   t;   struct tm *tm;   char *log_file;   FILE *fp_log;   char date[128];      log_file = LOG_FILE;   fp_log = fopen(log_file, "a+");   if (NULL == fp_log) {     fprintf(stderr, "Could not open logfile '%s' for writing/n", log_file);   }      time(&t);   tm = localtime(&t);   strftime(date, 127, "%Y-%m-%d %H:%M:%S", tm);      /* write the message to stdout and/or logfile */     fprintf(fp_log, "[%s] %s/n", date, text);   fflush(fp_log);   fclose(fp_log); }   int main(int argc, char **argv) {   int ret, i, status;   char *child_argv[100] = {0};   pid_t pid;   if (argc < 2) {     fprintf(stderr, "Usage:%s <exe_path> <args...>", argv[0]);     return -1;   }      for (i = 1; i < argc; ++i) {     child_argv[i-1] = (char *)malloc(strlen(argv[i])+1);     strncpy(child_argv[i-1], argv[i], strlen(argv[i]));     //child_argv[i-1][strlen(argv[i])] = '0';   }      while(1) {     pid = fork();      if (pid == -1) {       fprintf(stderr, "fork() error.errno:%d error:%s", errno, strerror(errno));       break;     }     if (pid == 0) {       s_log(child_argv[0]);       ret = execv(child_argv[0], (char **)child_argv);       s_log("execv return");       if (ret < 0) {         fprintf(stderr, "execv ret:%d errno:%d error:%s", ret, errno, strerror(errno));         continue;       }       s_log("exit child process");       exit(0);     }     if (pid > 0) {       pid = wait(&status);       fprintf(stdout, "Child process id: %d/n", pid);       //fprintf(stdout, "wait return");       s_log("Wait child process return");     }   }      return 0; } 

(4) 測試驗證

a. 假設需要自動重啟的程序為demo.c,其代碼實現如下所示:

/* * * demo  * */ #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <time.h>  #define LOG_FILE "/var/log/demo.log"  void demo_log(int num) {   time_t   t;   struct tm *tm;   char *log_file;   FILE *fp_log;   char date[128];      log_file = LOG_FILE;   fp_log = fopen(log_file, "a+");   if (NULL == fp_log) {     fprintf(stderr, "Could not open logfile '%s' for writing/n", log_file);   }      time(&t);   tm = localtime(&t);   strftime(date,127,"%Y-%m-%d %H:%M:%S",tm);      /* write the message to stdout and/or logfile */     fprintf(fp_log, "[%s] num = %d/n", date, num);   fflush(fp_log);   fclose(fp_log); }   int main(int argc, char **argv[]) {   int num = 0;      while(1) {     sleep(10);     num++;     demo_log(num);   } } 

b. 測試準備和說明:

b1. 以上相關服務程序編譯后的二進制文件為: supervisor 和 demo

b2. 執行如下測試命令 ./supervisor ./demo 

c. 測試的結果:

c1. execv(progname, arg) 執行成功后,其后的代碼不會執行;只有當執行錯誤時,才會返回 -1。原來調用execv進程的代碼段會被progname應用程序的代碼段替換。

c2. 當kill掉子進程時,父進程wait函數會接收到子進程退出的信號,進而循環再啟動子進程,此過程實時性非常高。

c3. 當kill掉父進程時,子進程會被init進程接管,如果此時再kill掉子進程,則子進程會退出。

c4. 當同時kill掉父子進程,則父子進程都會退出。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人av在线| 日韩中文理论片| 97视频免费观看| 自拍视频国产精品| 欧美电影在线观看网站| 欧美肥老太性生活视频| 国产精品久久久久久五月尺| 国产精品第一第二| 亚洲欧洲日韩国产| 亚洲成人亚洲激情| 久久在线免费观看视频| 中文字幕亚洲在线| 亚洲网在线观看| 亚洲3p在线观看| 日韩一二三在线视频播| 欧美激情第99页| 26uuu亚洲国产精品| 97精品国产97久久久久久春色| 精品国偷自产在线视频| 亚洲精品欧美一区二区三区| 亚洲电影免费在线观看| 欧美日韩xxx| 日韩av在线一区二区| 日韩av男人的天堂| 日日骚av一区| 久久久久国产精品免费网站| 国产999视频| 日韩欧美成人精品| 日韩av在线天堂网| 久久中文字幕国产| 国产精品av在线播放| 久久久成人av| 日韩av在线免播放器| 国产精品久久久久久久久久久新郎| 色综合五月天导航| 久久久久免费精品国产| 亚洲精品一区中文字幕乱码| 亚洲成人性视频| 亚洲精品v天堂中文字幕| 国产精品视频网址| 欧美视频不卡中文| 色哟哟亚洲精品一区二区| 久久久久久久国产精品视频| 欧美日韩中国免费专区在线看| 欧美黑人巨大xxx极品| 亚洲欧洲在线视频| 色综合久久88色综合天天看泰| 久久男人资源视频| 成人国产精品久久久久久亚洲| 日韩在线www| 亚洲丁香婷深爱综合| 欧美激情视频给我| 亚洲欧美三级在线| 久久精品99久久久久久久久| 51色欧美片视频在线观看| 成人乱人伦精品视频在线观看| 久久久久亚洲精品国产| 亚洲91精品在线| 亚洲精品不卡在线| 欧美中文在线观看| 欧美精品日韩www.p站| 成人免费大片黄在线播放| 一区三区二区视频| 麻豆国产精品va在线观看不卡| 亚洲精品一区久久久久久| 午夜精品福利在线观看| 欧美丝袜一区二区| 亚洲午夜精品视频| 亚洲成人激情图| 亚洲成人久久电影| 欧美黄色片视频| 色中色综合影院手机版在线观看| 美女视频久久黄| 日韩中文字幕在线看| 久久久久久久一区二区| 国产成人一区二区三区小说| 亚洲国产欧美自拍| 日韩乱码在线视频| 2019亚洲日韩新视频| 国内揄拍国内精品少妇国语| 国产精品久久不能| 国产精品久久久久久久久久东京| 国产91精品黑色丝袜高跟鞋| 欧美大片va欧美在线播放| 色综合久久天天综线观看| 九九热这里只有在线精品视| 国产女精品视频网站免费| 亚洲国产精品嫩草影院久久| 日韩av免费在线播放| 成人网中文字幕| 国产欧美一区二区三区久久人妖| 亚洲一区二区三区成人在线视频精品| 亚洲精品国产福利| 久久激情五月丁香伊人| 粉嫩老牛aⅴ一区二区三区| 亚洲国产福利在线| 亚洲精品久久久久中文字幕二区| 国产亚洲美女久久| 久久九九免费视频| 国产精品情侣自拍| 欧美在线视频播放| 亚洲女人天堂色在线7777| 欧美丝袜一区二区三区| 国产一区红桃视频| 久久91超碰青草是什么| 性色av香蕉一区二区| 欧洲永久精品大片ww免费漫画| 国产日韩精品电影| 97精品免费视频| 欧美国产视频一区二区| 欧美自拍视频在线观看| 国产成人精品久久二区二区| www.午夜精品| 91亚洲精华国产精华| 亚洲第一精品久久忘忧草社区| 欧美精品免费在线观看| 亚洲精品福利视频| 在线视频日本亚洲性| 成人午夜黄色影院| 成人写真福利网| 欧美伊久线香蕉线新在线| 精品亚洲精品福利线在观看| 日韩av在线免费播放| 欧美性xxxxxxx| 亚洲系列中文字幕| 97久久精品人搡人人玩| 欧美激情高清视频| 九九精品视频在线观看| 日韩欧美亚洲国产一区| 亚洲va电影大全| 欧美激情视频一区二区三区不卡| 亚洲最大的成人网| 日韩高清电影免费观看完整版| 国内精品久久影院| 久久精品影视伊人网| 欧美大尺度在线观看| 欧美专区在线观看| 欧美在线www| 91久久久精品| 国产日韩换脸av一区在线观看| 亚洲社区在线观看| 久久成人精品一区二区三区| 亚洲国产精品热久久| 色哟哟亚洲精品一区二区| 欧美极品少妇xxxxⅹ免费视频| 九九热精品视频国产| 久久亚洲私人国产精品va| 91成人性视频| 国产精品久久久久秋霞鲁丝| 美乳少妇欧美精品| 久久久久中文字幕| 精品亚洲国产成av人片传媒| 国产丝袜一区视频在线观看| 国产精品第一页在线| 国产综合在线观看视频| 国产精品一区二区电影| 精品国产乱码久久久久久天美| 日韩电影在线观看免费| 91国自产精品中文字幕亚洲| 欧美亚洲在线播放| 亚洲肉体裸体xxxx137| 欧美韩日一区二区| 国产综合在线看| 久久久精品视频在线观看|