From c28f44e4090321bbc6a844f2a01a42314e2a6f7b Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Loyet?= Date: Fri, 12 Nov 2010 00:30:35 +0000 Subject: [PATCH] - Fixed #52660 (custom process title for FPM) --- NEWS | 1 + sapi/fpm/config.m4 | 2 +- sapi/fpm/fpm/fpm.c | 2 +- sapi/fpm/fpm/fpm_conf.c | 23 +++++----- sapi/fpm/fpm/fpm_env.c | 96 +++++++++++++++++++++++++++++++++++++++++ sapi/fpm/fpm/fpm_env.h | 3 ++ 6 files changed, 112 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index d5ab071ff8..582aff8837 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ (Andrey) - Improved support for is_link and related functions on Windows. (Pierre) +- Added custom process title for FPM. (fat) - Added '-t/--test' to php-fpm to check and validate FPM conf file. (fat) - Added statistics about listening socket queue length for FPM. (andrei dot nigmatulin at gmail dot com, fat) diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index fc5de67804..59cfda5dfa 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -219,7 +219,7 @@ dnl }}} dnl configure checks {{{ AC_DEFUN([AC_FPM_STDLIBS], [ - AC_CHECK_FUNCS(setenv clearenv) + AC_CHECK_FUNCS(setenv clearenv setproctitle) AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(inet_addr, nsl) diff --git a/sapi/fpm/fpm/fpm.c b/sapi/fpm/fpm/fpm.c index fd4617350e..871d764546 100644 --- a/sapi/fpm/fpm/fpm.c +++ b/sapi/fpm/fpm/fpm.c @@ -33,9 +33,9 @@ int fpm_init(int argc, char **argv, char *config, struct event_base **base) /* { 0 > fpm_stdio_init_main() || 0 > fpm_conf_init_main() || 0 > fpm_unix_init_main() || + 0 > fpm_pctl_init_main() || 0 > fpm_env_init_main() || 0 > fpm_signals_init_main() || - 0 > fpm_pctl_init_main() || 0 > fpm_children_init_main() || 0 > fpm_sockets_init_main() || 0 > fpm_worker_pool_init_main() || diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c index 296f669b64..ff0ae7fcdb 100644 --- a/sapi/fpm/fpm/fpm_conf.c +++ b/sapi/fpm/fpm/fpm_conf.c @@ -698,6 +698,7 @@ static void fpm_conf_cleanup(int which, void *arg) /* {{{ */ free(fpm_global_config.error_log); fpm_global_config.pid_file = 0; fpm_global_config.error_log = 0; + efree(fpm_globals.config); } /* }}} */ @@ -1010,38 +1011,34 @@ int fpm_conf_load_ini_file(char *filename TSRMLS_DC) /* {{{ */ int fpm_conf_init_main() /* {{{ */ { - char *filename = fpm_globals.config; - int free = 0; int ret; TSRMLS_FETCH(); - if (filename == NULL) { - spprintf(&filename, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR); - free = 1; + if (fpm_globals.config == NULL) { + spprintf(&fpm_globals.config, 0, "%s/php-fpm.conf", PHP_SYSCONFDIR); + if (!fpm_globals.config) { + zlog(ZLOG_SYSERROR, "spprintf() failed (\"%s/php-fpm.conf\")", PHP_SYSCONFDIR); + return -1; + } } - ret = fpm_conf_load_ini_file(filename TSRMLS_CC); + ret = fpm_conf_load_ini_file(fpm_globals.config TSRMLS_CC); if (0 > ret) { - zlog(ZLOG_ERROR, "failed to load configuration file '%s'", filename); - if (free) efree(filename); + zlog(ZLOG_ERROR, "failed to load configuration file '%s'", fpm_globals.config); return -1; } if (0 > fpm_conf_post_process()) { zlog(ZLOG_ERROR, "failed to post process the configuration"); - if (free) efree(filename); return -1; } if (fpm_globals.test_conf) { - zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", filename); - if (free) efree(filename); + zlog(ZLOG_NOTICE, "configuration file %s test is successful\n", fpm_globals.config); return -1; } - if (free) efree(filename); - if (0 > fpm_cleanup_add(FPM_CLEANUP_ALL, fpm_conf_cleanup, 0)) { return -1; } diff --git a/sapi/fpm/fpm/fpm_env.c b/sapi/fpm/fpm/fpm_env.c index ddc4705ecb..aa647d15bc 100644 --- a/sapi/fpm/fpm/fpm_env.c +++ b/sapi/fpm/fpm/fpm_env.c @@ -12,8 +12,16 @@ #include #include "fpm_env.h" +#include "fpm.h" #include "zlog.h" +#ifndef HAVE_SETPROCTITLE +#ifdef __linux__ +static char **fpm_env_argv = NULL; +static size_t fpm_env_argv_len = 0; +#endif +#endif + #ifndef HAVE_SETENV # ifdef (__sparc__ || __sparc) int setenv(char *name, char *value, int clobber) /* {{{ */ @@ -111,9 +119,30 @@ static char * nvmatch(char *s1, char *s2) /* {{{ */ /* }}} */ #endif +void fpm_env_setproctitle(char *title) /* {{{ */ +{ +#ifdef HAVE_SETPROCTITLE + setproctitle("%s", title); +#else +#ifdef __linux__ + if (fpm_env_argv != NULL && fpm_env_argv_len > strlen(SETPROCTITLE_PREFIX) + 3) { + memset(fpm_env_argv[0], 0, fpm_env_argv_len); + strncpy(fpm_env_argv[0], SETPROCTITLE_PREFIX, fpm_env_argv_len - 2); + strncpy(fpm_env_argv[0] + strlen(SETPROCTITLE_PREFIX), title, fpm_env_argv_len - strlen(SETPROCTITLE_PREFIX) - 2); + fpm_env_argv[1] = NULL; + } +#endif +#endif +} +/* }}} */ + int fpm_env_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ { struct key_value_s *kv; + char *title; + spprintf(&title, 0, "pool %s", wp->config->name); + fpm_env_setproctitle(title); + efree(title); clearenv(); @@ -169,12 +198,79 @@ static int fpm_env_conf_wp(struct fpm_worker_pool_s *wp) /* {{{ */ int fpm_env_init_main() /* {{{ */ { struct fpm_worker_pool_s *wp; + int i; + char *first = NULL; + char *last = NULL; + char *title; for (wp = fpm_worker_all_pools; wp; wp = wp->next) { if (0 > fpm_env_conf_wp(wp)) { return -1; } } +#ifndef HAVE_SETPROCTITLE +#ifdef __linux__ + /* + * This piece of code has been inspirated from nginx and pureftpd code, whic + * are under BSD licence. + * + * To change the process title in Linux we have to set argv[1] to NULL + * and to copy the title to the same place where the argv[0] points to. + * However, argv[0] may be too small to hold a new title. Fortunately, Linux + * store argv[] and environ[] one after another. So we should ensure that is + * the continuous memory and then we allocate the new memory for environ[] + * and copy it. After this we could use the memory starting from argv[0] for + * our process title. + */ + + for (i = 0; i < fpm_globals.argc; i++) { + if (first == NULL) { + first = fpm_globals.argv[i]; + } + if (last == NULL || fpm_globals.argv[i] == last + 1) { + last = fpm_globals.argv[i] + strlen(fpm_globals.argv[i]); + } + } + if (environ) { + for (i = 0; environ[i]; i++) { + if (first == NULL) { + first = environ[i]; + } + if (last == NULL || environ[i] == last + 1) { + last = environ[i] + strlen(environ[i]); + } + } + } + if (first == NULL || last == NULL) { + return 0; + } + + fpm_env_argv_len = last - first; + fpm_env_argv = fpm_globals.argv; + if (environ != NULL) { + char **new_environ; + unsigned int env_nb = 0U; + + while (environ[env_nb]) { + env_nb++; + } + + if ((new_environ = malloc((1U + env_nb) * sizeof (char *))) == NULL) { + return -1; + } + new_environ[env_nb] = NULL; + while (env_nb > 0U) { + env_nb--; + new_environ[env_nb] = strdup(environ[env_nb]); + } + environ = new_environ; + } +#endif +#endif + + spprintf(&title, 0, "master process (%s)", fpm_globals.config); + fpm_env_setproctitle(title); + efree(title); return 0; } /* }}} */ diff --git a/sapi/fpm/fpm/fpm_env.h b/sapi/fpm/fpm/fpm_env.h index 0f79ed7869..bf472368da 100644 --- a/sapi/fpm/fpm/fpm_env.h +++ b/sapi/fpm/fpm/fpm_env.h @@ -7,8 +7,11 @@ #include "fpm_worker_pool.h" +#define SETPROCTITLE_PREFIX "php-fpm: " + int fpm_env_init_child(struct fpm_worker_pool_s *wp); int fpm_env_init_main(); +void fpm_env_setproctitle(char *title); extern char **environ; -- 2.40.0