更多"C/C++、PostgreSQL、编译原理、计算机原理、TCP/IP、数据结构&算法、Linux编程”等技术文章更新于公众号: 君子黎
1. 辅助进程自带前缀“postgres: ”
在 【PostgreSQL教程】· SysLogger日志收集器工作原理 中的1.1.1节里分析了PostgreSQL内核中是如何为每个辅助进程创建进程名的原理过程。首先,它是在初始化每个进程的入口函数中,对应初始化 MyBackendType 变量,然后调用函数GetBackendTypeDesc()来获取对应的进程名。之后启动postmaster进程,得到的所有辅助进程名前面均带有“postmaster: ”前缀,如下图所示:
1.1 编译不带“postgres: ”前缀的辅助进程
PostgreSQL内核源码中的init_ps_display()函数,会对运行的辅助进程添加了前缀操作,如下:
#if defined(PS_USE_SETPROCTITLE) || defined(PS_USE_SETPROCTITLE_FAST) #define PROGRAM_NAME_PREFIX "" #else #define PROGRAM_NAME_PREFIX "postgres: " #endif if (*cluster_name == '\0') { snprintf(ps_buffer, ps_buffer_size, PROGRAM_NAME_PREFIX "%s ", fixed_part); } else { snprintf(ps_buffer, ps_buffer_size, PROGRAM_NAME_PREFIX "%s: %s ", cluster_name, fixed_part); }
其中fixed_part是每个辅助进程的名字,通过snprintf指定的格式化之后,ps_buffer缓存中的数据即为: postgres: process_name。 比如是初始化logger日志辅助进程,则ps_buffer中的结果为 postgres: logger 。若想运行的postmaster服务中的辅助进程不带postgres前缀,则需要修改PostgreSQL内核源码中的ps_status.c文件。该文件位于src/backend/misc/ps_status.c。具体修改位置是init_ps_display()函数中的宏PROGRAM_NAME_PREFIX。修改之后,重新编译安装PostgreSQL。 即指向以下三步骤:
(1) ./configure
若最初选择了参数--prefix指定安装的位置,则这里也需要保持一致。
(2) make -j
(3) make install
之后再重新启动postmaster进程,就可以看到辅助进程已经没有前缀了。如下图所示:
2. 为postmaster辅助进程添加自定义前缀
默认的postmaster中所有辅助进程名都带有“postgres:”前缀,除此之外,你还可以在具体进程名,“postgres:”前缀之后添加自定义的前缀名字。直接上图看效果:
2.1 postgresql.conf配置文件中两个重要参数
若想要为辅助进程名添加名字前缀,则需要同时开启以下两个配置参数,分别是:
(1) update_process_title,配置为on,则表示开启该功能,反之off,则不停用。
(2) cluster_name 自定义辅助进程前缀名。此处我填写为: cluster_name = 'lixiaogang5'。默认为空,即cluster_name = ''。
##################################### postgresql.conf配置文件 ##################### #------------------------------------------------------------------------------ # PROCESS TITLE #------------------------------------------------------------------------------ #cluster_name = '' # added to process titles if nonempty cluster_name = 'lixiaogang5' # (change requires restart) update_process_title = on
当postmaster服务运行时修改,则需要重启生效。