织梦CMS - 轻松建站从此开始!

罗索

处理僵尸进程

jackyhwei 发布于 2011-06-23 23:27 点击:次 
前几天,连续四天,让控制器晚上跑着,第二天早上去看,shell挂掉了,其他进程都还好好的,细细用PS命令看,发现一个进程后跟着一个"僵尸"的shell
TAG:

前几天,连续四天,让控制器晚上跑着,第二天早上去看,shell挂掉了,其他进程都还好好的,细细用PS命令看,发现一个进程后跟着一个"僵尸"的shell 
......
125                    685 S                monitor
126                       Z                  [sh]
......
在网上查了查僵尸进程的处理方法,

找到了两种:
1.忽略掉signal(SIGCHLD,SIG_IGN);
2.写个信号处理函数

  1. void check_ps() 
  2.  char buf[1024]; 
  3.  int ps_map[EXEC_FILES_NUM]; 
  4.  int nptr=0; 
  5.  int i; 
  6.  FILE *bc; 
  7.  char str_cmd[200]; 
  8.  int retu=0; 
  9.  char tmpchar[30]={0}; 
  10.  char debug_message[128]={0}; 
  11.  
  12.  FILE *fp; 
  13.  char line_buffer[128]= 
  14.  { 0 }; 
  15.  int i_len=0; 
  16.  
  17.  // 执行程序列表 
  18.  char run_file[10][20]; 
  19.  memset(run_file, 0, sizeof(run_file)); 
  20. //////////////////////////////////////////////////////////// 
  21.  
  22.  memset(cSTAR, 0, sizeof(cSTAR)); 
  23. ///////////////////////////////////////////////// 
  24.   
  25.  .......... 
  26.  
  27.  bc= popen("ps""r"); 
  28.  if (!bc) 
  29.  { 
  30.   printf("WATCH::进程表打开错误...\n"); 
  31.  } 
  32.  // 
  33.  memset(buf, 0, sizeof(buf)); 
  34.  while (readline(bc, buf)) 
  35.  { 
  36.   for (i=0; i< i_len; i++) 
  37.   {  
  38.   retu=chuli_run_file(run_file[i],tmpchar); 
  39.    nptr = str_find(buf, tmpchar); 
  40.    if (nptr == 0) 
  41.    { 
  42.     if (ps_map[i]==0) 
  43.     { 
  44.      ps_map[i]=0; 
  45.     } 
  46.  
  47.    } 
  48.    else 
  49.    { 
  50.     ps_map[i]=1; 
  51.    } 
  52.   } 
  53.  
  54.  } 
  55.  memset(buf, 0, sizeof(buf)); 
  56.  // 
  57.  for (i=0; i< i_len; i++) 
  58.  { 
  59.   if (ps_map[i]==0) 
  60.   { 
  61.    memset(str_cmd, 0, sizeof(str_cmd)); 
  62.    strcat(str_cmd, "exec  "); 
  63.    strcat(str_cmd, run_file[i]); 
  64.    printf("WATCH::发现[%s]模块没有运行,重新启动该模块...\n", str_cmd); 
  65.    //system(str_cmd); 
  66.    strcpy(cSTAR[iSTAR],str_cmd); 
  67.    iSTAR++; 
  68.    break
  69.   } 
  70.  } 
  71.  
  72.  for (i=0; i< EXEC_FILES_NUM; i++) 
  73.   ps_map[i]=0; 
  74.  i_len=0; 
  75.  
  76. void process_zombie() 
  77. {      
  78.  pid_t   pid; 
  79.  int   stat; 
  80.  while((pid = waitpid(-1, &stat, WNOHANG)) > 0); 
  81.  
  82.  return
  83. // 
  84. void init_sigaction2() 
  85.  struct sigaction act; 
  86.  act.sa_handler=process_zombie; 
  87.  act.sa_flags=0; 
  88.  sigemptyset(&act.sa_mask); 
  89.  sigaction(SIGCHLD, &act, NULL); 
  90.  
  91. int main(int argc, char *argv[]) 
  92.   //线程返回值 
  93.   int res01; 
  94.   //线程标记 
  95.   pthread_t a_thread01; 
  96.  
  97.   int fdd,cmp=0; 
  98.   char out[20]={0}; 
  99. ........ 
  100. ////////////////////////////////////////////////////////////////by lanhai 
  101.  //signal(SIGCHLD,SIG_IGN);//处理僵尸进程 
  102.  init_sigaction2(); 
  103.  //////////////////////////////////////////////////////////////////////// 
  104.  _procid=getpid(); 
  105.  cfg_InitSIGNINFO(); 
  106.  InitShmInfo(1); 
  107.  init_wdog(); 
  108.  init_sigaction(); 
  109.  set_STIMER(10); 
  110.  CREATE_PUB_PIPE(FIFO_N); 
  111.  res01 = pthread_create(&a_thread01, NULL, thread_PIPE_RECV, FIFO_N); 
  112.  if (res01 != 0) 
  113.  { 
  114.   perror("Thread creation failed"); 
  115.  } 
  116.  
  117.  while (1) 
  118.  { 
  119.   int i=0; 
  120.   watchdog(); 
  121.   if(iSTAR!=0) 
  122.   { 
  123.    for(i=0;i<iSTAR;i++) 
  124.    { 
  125.     system(cSTAR[i]); 
  126.     sleep(1); 
  127.    } 
  128.    iSTAR=0; 
  129.  } 
  130.  } 
  131.  return 0; 


重新编译好后,重新下载运行

果然,
126                       Z                  [sh]
没有了

仔细想想,这里没有fork出什么子进程出来啊,怎么会有僵尸进程出来,好好看了看代码,初步怀疑到system函数上,对上述代码添加了写调试信息,发现每隔一段时间,就可以捕捉到一个SIGCHLD信号,与system函数的运行几率不符,下班回家好好查了查《UNIX环境高级编程》,才发现popen也fork出来了子进程,而且到了最后也没有调用pclose安全退出.基本怀疑问题在此,明天把pclose加上再试试

(yufangbo)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14605.html]
本文出处:blog.csdn.net/yufangbo 作者:yufangbo
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容