linux更改执行进程名称_nginx

 

前几天网上搜索如何更改执行进程的进程名称,并没有得到一个好的答案.

刚刚阅读nginx的源码,发现这样一种解决方案,记录之:

网上说的比较多的是直接更改argv[0],但是如上图中所示,nginx中指出,必须将argv[1]置为NULL才行,而且要注意,系统给argv[0]提供的空间可能不足以存储你所要求的新title,解决方案是重新给环境变量申请内存区域,然后将环境变量复制过去(environ是全局变量),参数argv和环境变量在连续的存储空间

 

linux更改执行进程名称_linux_02

这里将argv[1]置为NULL,要注意的是,因为有这一步,所以以后想通过argv[]引用参数应该是不可能的了,所以需要在此之前做好参数的复制存储,而且不能仅仅是复制参数的指针给另一个变量。

之后原本argv参数和environ所使用的区域都可以被你填充新的进程名字(记得null-terminal)

 

nginx实现:

 

  1. extern char **environ; 
  2.      
  3. static char *ngx_os_argv_last; 
  4.      
  5. ngx_int_t 
  6. ngx_init_setproctitle(ngx_log_t *log) 
  7. {    
  8.     u_char      *p;  
  9.     size_t       size; 
  10.     ngx_uint_t   i; 
  11.  
  12.     size = 0; 
  13.      
  14.     for (i = 0; environ[i]; i++) { 
  15.         size += ngx_strlen(environ[i]) + 1; 
  16.     }   
  17.          
  18.     p = ngx_alloc(size, log); 
  19.     if (p == NULL) { 
  20.         return NGX_ERROR; 
  21.     } 
  22.  
  23.     ngx_os_argv_last = ngx_os_argv[0]; 
  24.  
  25.     for (i = 0; ngx_os_argv[i]; i++) { 
  26.         if (ngx_os_argv_last == ngx_os_argv[i]) { 
  27.             ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1; 
  28.         } 
  29.     }   
  30.  
  31.     for (i = 0; environ[i]; i++) { 
  32.         if (ngx_os_argv_last == environ[i]) { 
  33.  
  34.             size = ngx_strlen(environ[i]) + 1; 
  35.             ngx_os_argv_last = environ[i] + size; 
  36.  
  37.             ngx_cpystrn(p, (u_char *) environ[i], size); 
  38.             environ[i] = (char *) p; 
  39.             p += size; 
  40.         } 
  41.     } 
  42.  
  43.     ngx_os_argv_last--; 
  44.  
  45.     return NGX_OK; 
  46.  
  47.  
  48. void 
  49. ngx_setproctitle(char *title) 
  50.     u_char     *p; 
  51.  
  52. #if (NGX_SOLARIS) 
  53.  
  54.     ngx_int_t   i; 
  55.     size_t      size; 
  56.  
  57. #endif 
  58.  
  59.     ngx_os_argv[1] = NULL; 
  60.  
  61.     p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: "
  62.                     ngx_os_argv_last - ngx_os_argv[0]); 
  63.  
  64.     p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p);//进程名字就是:nginx:$title 
  65.  
  66. #if (NGX_SOLARIS) 
  67.  
  68.     size = 0; 
  69.  
  70.     for (i = 0; i < ngx_argc; i++) { 
  71.         size += ngx_strlen(ngx_argv[i]) + 1; 
  72.     } 
  73.                          if (size > (size_t) ((char *) p - ngx_os_argv[0])) { 
  74.  
  75.         /* 
  76.          * ngx_setproctitle() is too rare operation so we use 
  77.          * the non-optimized copies 
  78.          */ 
  79.  
  80.         p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p); 
  81.  
  82.         for (i = 0; i < ngx_argc; i++) { 
  83.             p = ngx_cpystrn(p, (u_char *) ngx_argv[i], 
  84.                             ngx_os_argv_last - (char *) p); 
  85.             p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p); 
  86.         } 
  87.  
  88.         if (*(p - 1) == ' ') { 
  89.             *(p - 1) = ')'
  90.         } 
  91.     } 
  92.  
  93. #endif 
  94.  
  95.     if (ngx_os_argv_last - (char *) p) { 
  96.         ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p); 
  97.     } 
  98.  
  99.     ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, 
  100.                    "setproctitle: \"%s\"", ngx_os_argv[0]); 
  101.  
  102.               

//代码中有些ngx_xxx的函数就是一个简单的包装

 

 

另记:这是我的第一篇博客文章,写的不好,但希望是一个好的开始,希望自己能够坚持,欢迎大家拍砖,谢谢