posts - 5, comments - 14, trackbacks - 0, articles - 11

          linux進程監(jiān)控

          Posted on 2007-02-12 16:30 東舟 閱讀(1327) 評論(4)  編輯  收藏 所屬分類: Linux

          ?


          #include?
          < sys / wait.h >
          #include?
          < sys / types.h >
          #include?
          < unistd.h >
          #include?
          < errno.h >
          #include?
          < stdarg.h >
          #include?
          < stdio.h >
          #include?
          < string.h >

          int ?startprocess( char * ?path[], char * ?name[], int ?pid[ 3 ]);
          int ?watchprocess( int ?ppid);
          int ?rebootpocess( char * ?path[], char * ?name[], int ?ppid, int ?num);
          int ?main( int ?argc,? char ? * argv[],? char ? * envp[]) {
          ?
          ??
          ??
          char * ?path[ 3 ];
          ???path[
          0 ]? = ? " /home/tony/testmysql/source/mysqlDB/test " ;
          ???path[
          1 ]? = ? " /home/tony/testmysql/source/mysqlDB/test1 " ;
          ???path[
          2 ]? = ? " /home/tony/testmysql/source/mysqlDB/test2 " ;
          ???
          char * ?name[ 3 ];
          ???name[
          0 ] = " test " ;
          ???name[
          1 ] = " test1 " ;
          ???name[
          2 ] = " test2 " ;
          ?
          ???
          int ?pid[ 3 ]; int ?ppid;
          ???
          ???
          ???startprocess(path,name,pid);
          ???
          // printf("%d\n",pid[0]);
          ???
          ???
          for (;;) {
          ????
          int ?j;
          ????
          for (j = 0 ;j < 3 ;j ++ ) {
          ?????
          if (watchprocess(pid[j]) < 0 )
          ????????rebootpocess(path,name,pid[j],j);
          ????}

          ????sleep(
          30 );
          ???}

          ???
          ??
          // if(watchprocess(3025)<0)
          ??????
          // ?rebootpocess(path,name,5317,2);
          ?? return ? 0 ;
          }

          int ?startprocess( char * ?path[], char * ?name[], int ?pid[ 3 ]) {
          ?
          ?
          int ?i = 0 ;
          ?
          for (i = 0 ;i < 3 ;i ++ ) {
          ???
          int ?fd;
          ???fd
          = fork();
          ???
          if (fd < 0 )
          ??????
          {
          ???????
          return ? - 1 ;?
          ??????}

          ??????
          if (fd == 0 )
          ?????????
          {
          ??????????execl(path[i],name[i],(
          char ? * ?) 0 );
          ??????????exit(
          0 );
          ?????????}

          ??????
          else
          ???????
          {??
          ????????????pid[i]
          = fd;
          ??????????
          continue ;
          ???????}

          ??}
          ?
          ??
          ??
          ??
          return ? 0 ;
          }

          int ?watchprocess( int ?ppid) {
          ?
          ??printf(
          " ======watchprocess========\n " );
          ??printf(
          " %d\n " ,ppid);
          ?
          ??
          char * ?filename = ( char ? * )malloc( 100 );
          ??sprintf(filename,
          " /proc/%d/status " ,ppid);
          ??FILE?
          * ?pFile;
          ??
          char ? * ?line? = ?NULL;
          ???size_t?len?
          = ? 0 ;
          ???ssize_t?read;
          ???pFile?
          = ?fopen?(filename, " r " );
          ???
          if ?(pFile == NULL)? {
          ????printf(
          " %s\n " ,? " Config?file?is?not?exist!\n " );
          ????
          return ? - 1 ;
          ???}

          ???
          int ?linenum = 0 ;
          ???
          char ? * ?tmp;
          ???
          // char*?tmp1?=?(char*)malloc(20);
          ??? while ?((read? = ?getline( & line,? & len,?pFile))? != ? - 1 ? && ?linenum? < ? 3 )? {
          ???????linenum
          ++ ;?????
          ???????strtok(line,?
          " \t " );
          ???????tmp?
          = ?strtok(NULL, " ? " );
          ???????
          if (?linenum? == ? 2 ? && ?((strcmp(tmp, " S " ) == 0 )? || (strcmp(tmp, " R " ) == 0 ))?) {
          ??????????
          // printf("sdfsdlfw2rwW$#@^$%&YERGHFDGDFGERYG\n");
          ??????????fclose(pFile);
          ??????????pFile?
          = ?NULL;
          ??????????
          return ? 0 ;
          ????????}
          ?????
          ???}

          ???free(filename);
          ???fclose(pFile);
          ???pFile?
          = ?NULL;?
          ??
          return ? - 1 ;
          ?}

          int ?rebootpocess( char * ?path[], char * ?name[], int ?ppid, int ?num) {
          ?
          ?printf(
          " ======rebootpocess========\n " );
          ?printf(
          " %d\n " ,num);
          ?
          if (kill(ppid,SIGKILL) == 0 )
          ????
          {???
          ????
          int ?fd;???
          ?????????fd
          = fork();
          ???????
          if (fd == 0 )
          ???????????
          {?????
          ????????????execl(path[num],name[num],NULL);
          ????????????exit(
          0 );
          ??????????????}

          ???????
          else
          ?????????
          {
          ??????
          return ? 0 ;
          ??????}

          ?????}

          ???
          else
          ?????
          {
          ??????printf(
          " Kill?the?process?failed! " );
          ?????
          return ? - 1 ;?
          ????}

          ?
          ?
          return ? 0 ;
          ?}

          Feedback

          # re: linux進程監(jiān)控[未登錄]  回復  更多評論   

          2007-12-09 15:15 by zhan
          我很想知道你這個進程監(jiān)控程序大概的思路,尤其是他是怎么樣對我想監(jiān)控的進程進行監(jiān)控的,是怎樣判斷的是不是那個進程。謝謝!!
          我的郵箱:zhanshicai8139@163.com

          # 可以告訴我你的思路嗎?  回復  更多評論   

          2008-03-05 13:49 by jiangminjie
          我的郵箱是:jiangminjie2008@hotmail.com

          # re: linux進程監(jiān)控[未登錄]  回復  更多評論   

          2012-08-07 21:05 by jiang
          我的郵箱:jlyh225@163.com
          我也想知道你的思路

          # re: linux進程監(jiān)控  回復  更多評論   

          2012-10-12 17:24 by avrtercel
          你好,最近在學習進程監(jiān)控這一塊,想請教博主的這段程序的進程監(jiān)控的原理,我的郵箱avrtercel@163.com,辛苦了!謝謝!

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 迭部县| 柯坪县| 商南县| 合阳县| 米脂县| 永定县| 慈溪市| 静乐县| 湖州市| 台中市| 仙居县| 梓潼县| 萍乡市| 灵川县| 雷波县| 清丰县| 黄平县| 金门县| 丹凤县| 长岛县| 富顺县| 分宜县| 凌云县| 庄河市| 驻马店市| 丰宁| 石台县| 大悟县| 曲松县| 共和县| 巴彦淖尔市| 朝阳市| 五寨县| 汉沽区| 右玉县| 旌德县| 长子县| 白银市| 湄潭县| 吉林市| 体育|