diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 09e6dfc..2426dfe 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -695,6 +695,23 @@ include 'filename'
+
+ cluster_name (string)
+
+ cluster_name> configuration parameter
+
+
+
+ Sets the cluster name that appears in the process title for all
+ processes in this cluster. No name is shown if this parameter is set
+ to the empty string ''> (which is the default). The
+ process title is typically viewed by the ps> command, or in
+ Windows by using the Process Explorer>.
+ This parameter can only be set at server start.
+
+
+
+
tcp_keepalives_idle (integer)
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 6902c23..c9dbb4c 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -443,6 +443,7 @@ int temp_file_limit = -1;
int num_temp_buffers = 1024;
+const char *cluster_name = "";
char *data_directory;
char *ConfigFileName;
char *HbaFileName;
@@ -3090,6 +3091,17 @@ static struct config_string ConfigureNamesString[] =
},
{
+ {"cluster_name", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ gettext_noop("Sets the name of the cluster that appears in 'ps' output."),
+ NULL,
+ GUC_IS_NAME
+ },
+ &cluster_name,
+ "",
+ NULL, NULL, NULL
+ },
+
+ {
/*
* Can't be set by ALTER SYSTEM as it can lead to recursive definition
* of data_directory.
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index d109394..e4e0411 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -74,6 +74,8 @@
# (change requires restart)
#bonjour_name = '' # defaults to the computer name
# (change requires restart)
+#cluster_name = '' # visible in ps output if set
+ # (change requires restart)
# - Security and Authentication -
diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c
index 3aeceae..471d890 100644
--- a/src/backend/utils/misc/ps_status.c
+++ b/src/backend/utils/misc/ps_status.c
@@ -29,6 +29,7 @@
#include "libpq/libpq.h"
#include "miscadmin.h"
#include "utils/ps_status.h"
+#include "utils/guc.h"
extern char **environ;
bool update_process_title = true;
@@ -264,15 +265,24 @@ init_ps_display(const char *username, const char *dbname,
* apparently setproctitle() already adds a `progname:' prefix to the ps
* line
*/
- snprintf(ps_buffer, ps_buffer_size,
- "%s %s %s ",
- username, dbname, host_info);
+#define PROGRAM_NAME_PREFIX ""
#else
- snprintf(ps_buffer, ps_buffer_size,
- "postgres: %s %s %s ",
- username, dbname, host_info);
+#define PROGRAM_NAME_PREFIX "postgres: "
#endif
+ if (*cluster_name == '\0')
+ {
+ snprintf(ps_buffer, ps_buffer_size,
+ PROGRAM_NAME_PREFIX "%s %s %s ",
+ username, dbname, host_info);
+ }
+ else
+ {
+ snprintf(ps_buffer, ps_buffer_size,
+ PROGRAM_NAME_PREFIX "%s %s %s %s ",
+ cluster_name, username, dbname, host_info);
+ }
+
ps_buffer_cur_len = ps_buffer_fixed_size = strlen(ps_buffer);
set_ps_display(initial_str, true);
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 1493d2c..d3cdf68 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -224,6 +224,7 @@ extern int temp_file_limit;
extern int num_temp_buffers;
+extern const char *cluster_name;
extern char *data_directory;
extern char *ConfigFileName;
extern char *HbaFileName;