快速业务通道

linux更改执行进程名称

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-07

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

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

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

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

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

nginx实现:

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号