- linkend="postmaster-start-failures">.) The relevant kernel
+ linkend="server-start-failures">.) The relevant kernel
parameters are named consistently across different systems;
linkend="sysvipc-parameters"> gives an overview. The methods to set
them, however, vary. Suggestions for some platforms are given below.
optimal for
PostgreSQL. Because of the
way that the kernel implements memory overcommit, the kernel may
terminate the
PostgreSQL server (the
- postmaster process) if the memory demands of
+ master server process) if the memory demands of
another process cause the system to run out of virtual memory.
this (consult your system documentation and configuration on where
to look for such a message):
-Out of Memory: Killed process 12345 (postmaster).
+Out of Memory: Killed process 12345 (postgres).
- This indicates that the postmaster process
+ This indicates that the postgres process
has been terminated due to memory pressure.
Although existing database connections will continue to function
normally, no new connections will be accepted. To recover,
- postmaster-shutdown">
+ server-shutdown">
Shutting Down the Server
- postmaster-shutdown">
+ server-shutdown">
There are several ways to shut down the database server. You control
- the type of shutdown by sending different signals to the
- postmaster process.
+ the type of shutdown by sending different signals to the master
+ postgres process.
This is the Immediate Shutdown, which
- will cause the postmaster process to send a
+ will cause the master postgres process to send a
SIGQUIT to all child processes and exit
immediately, without properly shutting itself down. The child processes
likewise exit immediately upon receiving
Alternatively, you can send the signal directly using kill>.
- The
PID> of the postmaster process can be
+ The
PID> of the postgres process can be
found using the ps program, or from the file
postmaster.pid in the data directory. For
example, to do a fast shutdown:
the server. Doing so will prevent the server from releasing
shared memory and semaphores, which may then have to be done
manually before a new server can be started. Furthermore,
- SIGKILL kills the postmaster
+ SIGKILL kills the postgres
process without letting it relay the signal to its subprocesses,
so it will be necessary to kill the individual subprocesses by hand as
well.
-
+
Getting Started
connections to the database from client applications, and
performs actions on the database on behalf of the clients. The
database server program is called
- postmaster.
+ postgres.
starts (forks
) a new process for each connection.
From that point on, the client and the new server process
communicate without intervention by the original
- postmaster process. Thus, the
- postmaster is always running, waiting for
+ postgres process. Thus, the
+ master server process is always running, waiting for
client connections, whereas client and associated server processes
come and go. (All of this is of course invisible to the user. We
only mention it here for completeness.)
-
+
directory, commonly referred to as PGDATA> (after the name of the
environment variable that can be used to define it). A common location for
PGDATA> is /var/lib/pgsql/data>. Multiple clusters,
-managed by different postmasters, can exist on the same machine.
+managed by different server instances, can exist on the same machine.
|
postmaster.opts>
- A file recording the command-line options the postmaster was
+ A file recording the command-line options the server was
last started with
|
postmaster.pid>
- A lock file recording the current postmaster PID and shared memory
-segment ID (not present after postmaster shutdown)
+ A lock file recording the current server PID and shared memory
+segment ID (not present after server shutdown)
#
# Copyright (c) 1994, Regents of the University of California
#
-# $PostgreSQL: pgsql/src/backend/Makefile,v 1.114 2006/01/05 01:56:29 momjian Exp $
+# $PostgreSQL: pgsql/src/backend/Makefile,v 1.115 2006/06/18 15:38:36 petere Exp $
#
#-------------------------------------------------------------------------
-PGFILEDESC = "PostgreSQL Database Backend"
+PGFILEDESC = "PostgreSQL Server"
subdir = src/backend
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.216 2006/06/08 23:55:48 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.217 2006/06/18 15:38:36 petere Exp $
*
*-------------------------------------------------------------------------
*/
#define ALLOC(t, c) ((t *) calloc((unsigned)(c), sizeof(t)))
-static void usage(void);
static void bootstrap_signals(void);
static void ShutdownDummyProcess(int code, Datum arg);
static hashnode *AddStr(char *str, int strlength, int mderef);
if (!IsUnderPostmaster)
InitializeGUCOptions();
- /* Ignore the initial -boot argument, if present */
- if (argc > 1 && strcmp(argv[1], "-boot") == 0)
+ /* Ignore the initial --boot argument, if present */
+ if (argc > 1 && strcmp(argv[1], "--boot") == 0)
{
argv++;
argc--;
break;
}
default:
- usage();
+ write_stderr("Try \"%s --help\" for more information.\n",
+ progname);
+ proc_exit(1);
break;
}
}
optind++;
}
if (!dbname || argc != optind)
- usage();
+ {
+ write_stderr("%s: invalid command-line arguments\n", progname);
+ proc_exit(1);
+ }
/*
* Identify myself via ps
* ----------------------------------------------------------------
*/
-/* usage:
- * usage help for the bootstrap backend
- */
-static void
-usage(void)
-{
- fprintf(stderr, _("This is the PostgreSQL bootstrap process.\n\n"));
- fprintf(stderr, _("Usage:\n postgres -boot [OPTION]... DBNAME\n\n"));
- fprintf(stderr, _("Options:\n"));
- fprintf(stderr, _(" -B NBUFFERS number of shared buffers\n"));
- fprintf(stderr, _(" -c NAME=VALUE set run-time parameter\n"));
- fprintf(stderr, _(" -d 1-5 debugging level\n"));
- fprintf(stderr, _(" -D DATADIR database directory\n"));
- fprintf(stderr, _(" -F turn fsync off\n"));
- fprintf(stderr, _(" -r FILENAME send stdout and stderr to given file\n"));
- fprintf(stderr, _(" -x NUM internal use\n"));
-
- proc_exit(1);
-}
-
/*
* Set up signal handling for a bootstrap process
*/
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.102 2006/06/12 16:17:20 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.103 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
#include
#undef ASSEMBLER
#endif
+
#if defined(__NetBSD__)
#include
#endif
#include "libpq/pqsignal.h"
#endif
+
const char *progname;
-int
-main(int argc, char *argv[])
-{
-#ifndef WIN32
- struct passwd *pw;
-#endif
- char *pw_name_persist;
- /*
- * Place platform-specific startup hacks here. This is the right place to
- * put code that must be executed early in launch of either a postmaster,
- * a standalone backend, or a standalone bootstrap run. Note that this
- * code will NOT be executed when a backend or sub-bootstrap run is forked
- * by the postmaster.
- *
- * XXX The need for code here is proof that the platform in question is
- * too brain-dead to provide a standard C execution environment without
- * help. Avoid adding more here, if you can.
- */
+static void startup_hacks(const char *progname);
+static void help(const char *progname);
+static void check_root(const char *progname);
+static char *get_current_username(const char *progname);
-#if defined(__alpha) /* no __alpha__ ? */
-#ifdef NOFIXADE
- int buffer[] = {SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT};
-#endif
-#endif /* __alpha */
-#ifdef WIN32
- char *env_locale;
-#endif
+int
+main(int argc, char *argv[])
+{
progname = get_progname(argv[0]);
/*
- * On some platforms, unaligned memory accesses result in a kernel trap;
- * the default kernel behavior is to emulate the memory access, but this
- * results in a significant performance penalty. We ought to fix PG not to
- * make such unaligned memory accesses, so this code disables the kernel
- * emulation: unaligned accesses will result in SIGBUS instead.
- */
-#ifdef NOFIXADE
-
-#if defined(ultrix4)
- syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
-#endif
-
-#if defined(__alpha) /* no __alpha__ ? */
- if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
- (unsigned long) NULL) < 0)
- write_stderr("%s: setsysinfo failed: %s\n",
- argv[0], strerror(errno));
-#endif
-#endif /* NOFIXADE */
-
-#if defined(WIN32)
- {
- WSADATA wsaData;
- int err;
-
- /* Make output streams unbuffered by default */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- /* Prepare Winsock */
- err = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (err != 0)
- {
- write_stderr("%s: WSAStartup failed: %d\n",
- argv[0], err);
- exit(1);
- }
-
- /* In case of general protection fault, don't show GUI popup box */
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
- }
-#endif
-
- /*
- * Not-quite-so-platform-specific startup environment checks. Still best
- * to minimize these.
+ * Platform-specific startup hacks
*/
+ startup_hacks(progname);
/*
* Remember the physical location of the initially given argv[] array for
set_pglocale_pgservice(argv[0], "postgres");
#ifdef WIN32
-
/*
* Windows uses codepages rather than the environment, so we work around
* that by querying the environment explicitly first for LC_COLLATE and
* LC_CTYPE. We have to do this because initdb passes those values in the
* environment. If there is nothing there we fall back on the codepage.
*/
+ {
+ char *env_locale;
- if ((env_locale = getenv("LC_COLLATE")) != NULL)
- pg_perm_setlocale(LC_COLLATE, env_locale);
- else
- pg_perm_setlocale(LC_COLLATE, "");
+ if ((env_locale = getenv("LC_COLLATE")) != NULL)
+ pg_perm_setlocale(LC_COLLATE, env_locale);
+ else
+ pg_perm_setlocale(LC_COLLATE, "");
- if ((env_locale = getenv("LC_CTYPE")) != NULL)
- pg_perm_setlocale(LC_CTYPE, env_locale);
- else
- pg_perm_setlocale(LC_CTYPE, "");
+ if ((env_locale = getenv("LC_CTYPE")) != NULL)
+ pg_perm_setlocale(LC_CTYPE, env_locale);
+ else
+ pg_perm_setlocale(LC_CTYPE, "");
+ }
#else
pg_perm_setlocale(LC_COLLATE, "");
pg_perm_setlocale(LC_CTYPE, "");
unsetenv("LC_ALL");
/*
- * Skip permission checks if we're just trying to do --help or --version;
- * otherwise root will get unhelpful failure messages from initdb.
+ * Catch standard options before doing much else
*/
- if (!(argc > 1
- && (strcmp(argv[1], "--help") == 0 ||
- strcmp(argv[1], "-?") == 0 ||
- strcmp(argv[1], "--version") == 0 ||
- strcmp(argv[1], "-V") == 0)))
+ if (argc > 1)
{
-#ifndef WIN32
- /*
- * Make sure we are not running as root.
- */
- if (geteuid() == 0)
- {
- write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n"
- "The server must be started under an unprivileged user ID to prevent\n"
- "possible system security compromise. See the documentation for\n"
- "more information on how to properly start the server.\n");
- exit(1);
- }
-
- /*
- * Also make sure that real and effective uids are the same. Executing
- * Postgres as a setuid program from a root shell is a security hole,
- * since on many platforms a nefarious subroutine could setuid back to
- * root if real uid is root. (Since nobody actually uses Postgres as
- * a setuid program, trying to actively fix this situation seems more
- * trouble than it's worth; we'll just expend the effort to check for
- * it.)
- */
- if (getuid() != geteuid())
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
{
- write_stderr("%s: real and effective user IDs must match\n",
- argv[0]);
- exit(1);
+ help(progname);
+ exit(0);
}
-#else /* WIN32 */
- if (pgwin32_is_admin())
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
{
- write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n"
- "permitted.\n"
- "The server must be started under an unprivileged user ID to prevent\n"
- "possible system security compromises. See the documentation for\n"
- "more information on how to properly start the server.\n");
- exit(1);
+ puts("postgres (PostgreSQL) " PG_VERSION);
+ exit(0);
}
-#endif /* !WIN32 */
}
/*
- * Now dispatch to one of PostmasterMain, PostgresMain, GucInfoMain,
- * SubPostmasterMain, or BootstrapMain depending on the program name (and
- * possibly first argument) we were called with. The lack of consistency
- * here is historical.
+ * Make sure we are not running as root.
*/
- if (strcmp(progname, "postmaster") == 0)
- {
- /* Called as "postmaster" */
- exit(PostmasterMain(argc, argv));
- }
+ check_root(progname);
/*
- * If the first argument begins with "-fork", then invoke
- * SubPostmasterMain. This is used for forking postmaster child processes
- * on systems where we can't simply fork.
+ * Dispatch to one of various subprograms depending on first
+ * argument.
*/
+
#ifdef EXEC_BACKEND
- if (argc > 1 && strncmp(argv[1], "-fork", 5) == 0)
+ if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)
exit(SubPostmasterMain(argc, argv));
#endif
#ifdef WIN32
-
/*
* Start our win32 signal implementation
*
pgwin32_signal_initialize();
#endif
- /*
- * If the first argument is "-boot", then invoke bootstrap mode. (This
- * path is taken only for a standalone bootstrap process.)
- */
- if (argc > 1 && strcmp(argv[1], "-boot") == 0)
+ if (argc > 1 && strcmp(argv[1], "--boot") == 0)
exit(BootstrapMain(argc, argv));
- /*
- * If the first argument is "--describe-config", then invoke runtime
- * configuration option display mode.
- */
if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
exit(GucInfoMain());
+ if (argc > 1 && strcmp(argv[1], "--single") == 0)
+ exit(PostgresMain(argc, argv, get_current_username(progname)));
+
+ exit(PostmasterMain(argc, argv));
+}
+
+
+
+/*
+ * Place platform-specific startup hacks here. This is the right
+ * place to put code that must be executed early in launch of either a
+ * postmaster, a standalone backend, or a standalone bootstrap run.
+ * Note that this code will NOT be executed when a backend or
+ * sub-bootstrap run is forked by the server.
+ *
+ * XXX The need for code here is proof that the platform in question
+ * is too brain-dead to provide a standard C execution environment
+ * without help. Avoid adding more here, if you can.
+ */
+static void
+startup_hacks(const char *progname)
+{
+#if defined(__alpha) /* no __alpha__ ? */
+#ifdef NOFIXADE
+ int buffer[] = {SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT};
+#endif
+#endif /* __alpha */
+
+
+ /*
+ * On some platforms, unaligned memory accesses result in a kernel
+ * trap; the default kernel behavior is to emulate the memory
+ * access, but this results in a significant performance penalty.
+ * We ought to fix PG not to make such unaligned memory accesses,
+ * so this code disables the kernel emulation: unaligned accesses
+ * will result in SIGBUS instead.
+ */
+#ifdef NOFIXADE
+
+#if defined(ultrix4)
+ syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
+#endif
+
+#if defined(__alpha) /* no __alpha__ ? */
+ if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
+ (unsigned long) NULL) < 0)
+ write_stderr("%s: setsysinfo failed: %s\n",
+ progname, strerror(errno));
+#endif
+
+#endif /* NOFIXADE */
+
+
+#ifdef WIN32
+ {
+ WSADATA wsaData;
+ int err;
+
+ /* Make output streams unbuffered by default */
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+
+ /* Prepare Winsock */
+ err = WSAStartup(MAKEWORD(2, 2), &wsaData);
+ if (err != 0)
+ {
+ write_stderr("%s: WSAStartup failed: %d\n",
+ progname, err);
+ exit(1);
+ }
+
+ /* In case of general protection fault, don't show GUI popup box */
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+ }
+#endif /* WIN32 */
+}
+
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s is the PostgreSQL server.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]...\n\n"), progname);
+ printf(_("Options:\n"));
+#ifdef USE_ASSERT_CHECKING
+ printf(_(" -A 1|0 enable/disable run-time assert checking\n"));
+#endif
+ printf(_(" -B NBUFFERS number of shared buffers\n"));
+ printf(_(" -c NAME=VALUE set run-time parameter\n"));
+ printf(_(" -d 1-5 debugging level\n"));
+ printf(_(" -D DATADIR database directory\n"));
+ printf(_(" -e use European date input format (DMY)\n"));
+ printf(_(" -F turn fsync off\n"));
+ printf(_(" -h HOSTNAME host name or IP address to listen on\n"));
+ printf(_(" -i enable TCP/IP connections\n"));
+ printf(_(" -k DIRECTORY Unix-domain socket location\n"));
+#ifdef USE_SSL
+ printf(_(" -l enable SSL connections\n"));
+#endif
+ printf(_(" -N MAX-CONNECT maximum number of allowed connections\n"));
+ printf(_(" -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n"));
+ printf(_(" -p PORT port number to listen on\n"));
+ printf(_(" -s show statistics after each query\n"));
+ printf(_(" -S WORK-MEM set amount of memory for sorts (in kB)\n"));
+ printf(_(" --NAME=VALUE set run-time parameter\n"));
+ printf(_(" --describe-config describe configuration parameters, then exit\n"));
+ printf(_(" --help show this help, then exit\n"));
+ printf(_(" --version output version information, then exit\n"));
+
+ printf(_("\nDeveloper options:\n"));
+ printf(_(" -f s|i|n|m|h forbid use of some plan types\n"));
+ printf(_(" -n do not reinitialize shared memory after abnormal exit\n"));
+ printf(_(" -O allow system table structure changes\n"));
+ printf(_(" -P disable system indexes\n"));
+ printf(_(" -t pa|pl|ex show timings after each query\n"));
+ printf(_(" -T send SIGSTOP to all backend servers if one dies\n"));
+ printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n"));
+
+ printf(_("\nOptions for single-user mode:\n"));
+ printf(_(" --single selects single-user mode (must be first argument)\n"));
+ printf(_(" DBNAME database name (defaults to user name)\n"));
+ printf(_(" -d 0-5 override debugging level\n"));
+ printf(_(" -E echo statement before execution\n"));
+ printf(_(" -j do not use newline as interactive query delimiter\n"));
+ printf(_(" -r FILENAME send stdout and stderr to given file\n"));
+
+ printf(_("\nOptions for bootstrapping mode:\n"));
+ printf(_(" --boot selects bootstrapping mode (must be first argument)\n"));
+ printf(_(" DBNAME database name (mandatory argument in bootstrapping mode)\n"));
+ printf(_(" -r FILENAME send stdout and stderr to given file\n"));
+ printf(_(" -x NUM internal use\n"));
+
+ printf(_("\nPlease read the documentation for the complete list of run-time\n"
+ "configuration settings and how to set them on the command line or in\n"
+ "the configuration file.\n\n"
+ "Report bugs to
.\n"));
+}
+
+
+
+static void
+check_root(const char *progname)
+{
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n"
+ "The server must be started under an unprivileged user ID to prevent\n"
+ "possible system security compromise. See the documentation for\n"
+ "more information on how to properly start the server.\n");
+ exit(1);
+ }
+
/*
- * Otherwise we're a standalone backend. Invoke PostgresMain, specifying
- * current userid as the "authenticated" Postgres user name.
+ * Also make sure that real and effective uids are the same.
+ * Executing as a setuid program from a root shell is a security
+ * hole, since on many platforms a nefarious subroutine could
+ * setuid back to root if real uid is root. (Since nobody
+ * actually uses postgres as a setuid program, trying to
+ * actively fix this situation seems more trouble than it's worth;
+ * we'll just expend the effort to check for it.)
*/
+ if (getuid() != geteuid())
+ {
+ write_stderr("%s: real and effective user IDs must match\n",
+ progname);
+ exit(1);
+ }
+#else /* WIN32 */
+ if (pgwin32_is_admin())
+ {
+ write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n"
+ "permitted.\n"
+ "The server must be started under an unprivileged user ID to prevent\n"
+ "possible system security compromises. See the documentation for\n"
+ "more information on how to properly start the server.\n");
+ exit(1);
+ }
+#endif /* WIN32 */
+}
+
+
+
+static char *
+get_current_username(const char *progname)
+{
#ifndef WIN32
+ struct passwd *pw;
+
pw = getpwuid(geteuid());
if (pw == NULL)
{
write_stderr("%s: invalid effective UID: %d\n",
- argv[0], (int) geteuid());
+ progname, (int) geteuid());
exit(1);
}
- /* Allocate new memory because later getpwuid() calls can overwrite it */
- pw_name_persist = strdup(pw->pw_name);
+ /* Allocate new memory because later getpwuid() calls can overwrite it. */
+ return strdup(pw->pw_name);
#else
- {
- long namesize = 256 /* UNLEN */ + 1;
+ long namesize = 256 /* UNLEN */ + 1;
+ char *name;
- pw_name_persist = malloc(namesize);
- if (!GetUserName(pw_name_persist, &namesize))
- {
- write_stderr("%s: could not determine user name (GetUserName failed)\n",
- argv[0]);
- exit(1);
- }
+ name = malloc(namesize);
+ if (!GetUserName(name, &namesize))
+ {
+ write_stderr("%s: could not determine user name (GetUserName failed)\n",
+ progname);
+ exit(1);
}
-#endif /* WIN32 */
- exit(PostgresMain(argc, argv, pw_name_persist));
+ return name;
+#endif
}
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.19 2006/05/19 15:15:37 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.20 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
int ac = 0;
av[ac++] = "postgres";
- av[ac++] = "-forkautovac";
+ av[ac++] = "--forkautovac";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
av[ac] = NULL;
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.22 2006/05/30 17:08:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.23 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
av[ac++] = "postgres";
- av[ac++] = "-forkarch";
+ av[ac++] = "--forkarch";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
*
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.127 2006/05/30 02:35:39 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.128 2006/06/18 15:38:37 petere Exp $
* ----------
*/
#include "postgres.h"
switch (procType)
{
case STAT_PROC_BUFFER:
- av[ac++] = "-forkbuf";
+ av[ac++] = "--forkbuf";
break;
case STAT_PROC_COLLECTOR:
- av[ac++] = "-forkcol";
+ av[ac++] = "--forkcol";
break;
default:
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.485 2006/06/07 22:24:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.486 2006/06/18 15:38:37 petere Exp $
*
* NOTES
*
static void BackendInitialize(Port *port);
static int BackendRun(Port *port);
static void ExitPostmaster(int status);
-static void usage(const char *);
static int ServerLoop(void);
static int BackendStartup(Port *port);
static int ProcessStartupPacket(Port *port, bool SSLdone);
IsPostmasterEnvironment = true;
- /*
- * Catch standard options before doing much else. This even works on
- * systems without getopt_long.
- */
- if (argc > 1)
- {
- if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
- {
- usage(progname);
- ExitPostmaster(0);
- }
- if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
- {
- puts("postmaster (PostgreSQL) " PG_VERSION);
- ExitPostmaster(0);
- }
- }
-
-#ifdef WIN32
- /* Start our win32 signal implementation */
- pgwin32_signal_initialize();
-#endif
-
/*
* for security, no dir or file created can be group or other accessible
*/
}
-/*
- * Print out help message
- */
-static void
-usage(const char *progname)
-{
- printf(_("%s is the PostgreSQL server.\n\n"), progname);
- printf(_("Usage:\n %s [OPTION]...\n\n"), progname);
- printf(_("Options:\n"));
-#ifdef USE_ASSERT_CHECKING
- printf(_(" -A 1|0 enable/disable run-time assert checking\n"));
-#endif
- printf(_(" -B NBUFFERS number of shared buffers\n"));
- printf(_(" -c NAME=VALUE set run-time parameter\n"));
- printf(_(" -d 1-5 debugging level\n"));
- printf(_(" -D DATADIR database directory\n"));
- printf(_(" -e use European date input format (DMY)\n"));
- printf(_(" -F turn fsync off\n"));
- printf(_(" -h HOSTNAME host name or IP address to listen on\n"));
- printf(_(" -i enable TCP/IP connections\n"));
- printf(_(" -k DIRECTORY Unix-domain socket location\n"));
-#ifdef USE_SSL
- printf(_(" -l enable SSL connections\n"));
-#endif
- printf(_(" -N MAX-CONNECT maximum number of allowed connections\n"));
- printf(_(" -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n"));
- printf(_(" -p PORT port number to listen on\n"));
- printf(_(" -s show statistics after each query\n"));
- printf(_(" -S WORK-MEM set amount of memory for sorts (in kB)\n"));
- printf(_(" --NAME=VALUE set run-time parameter\n"));
- printf(_(" --help show this help, then exit\n"));
- printf(_(" --version output version information, then exit\n"));
-
- printf(_("\nDeveloper options:\n"));
- printf(_(" -f s|i|n|m|h forbid use of some plan types\n"));
- printf(_(" -n do not reinitialize shared memory after abnormal exit\n"));
- printf(_(" -O allow system table structure changes\n"));
- printf(_(" -P disable system indexes\n"));
- printf(_(" -t pa|pl|ex show timings after each query\n"));
- printf(_(" -T send SIGSTOP to all backend servers if one dies\n"));
- printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n"));
-
- printf(_("\nPlease read the documentation for the complete list of run-time\n"
- "configuration settings and how to set them on the command line or in\n"
- "the configuration file.\n\n"
- "Report bugs to
.\n"));
-}
-
-
/*
* Main idle loop of postmaster
*/
int ac = 0;
av[ac++] = "postgres";
- av[ac++] = "-forkbackend";
+ av[ac++] = "--forkbackend";
av[ac++] = NULL; /* filled in by internal_forkexec */
av[ac] = NULL;
/* Make sure caller set up argv properly */
Assert(argc >= 3);
Assert(argv[argc] == NULL);
- Assert(strncmp(argv[1], "-fork", 5) == 0);
+ Assert(strncmp(argv[1], "--fork", 6) == 0);
Assert(argv[2] == NULL);
- /* Insert temp file name after -fork argument */
+ /* Insert temp file name after --fork argument */
argv[2] = tmpfilename;
/* Fire off execv in child */
/* Make sure caller set up argv properly */
Assert(argc >= 3);
Assert(argv[argc] == NULL);
- Assert(strncmp(argv[1], "-fork", 5) == 0);
+ Assert(strncmp(argv[1], "--fork", 6) == 0);
Assert(argv[2] == NULL);
/* Verify that there is room in the child list */
return -1;
}
- /* Insert temp file name after -fork argument */
+ /* Insert temp file name after --fork argument */
sprintf(paramHandleStr, "%lu", (DWORD) paramHandle);
argv[2] = paramHandleStr;
* to what it would be if we'd simply forked on Unix, and then
* dispatch to the appropriate place.
*
- * The first two command line arguments are expected to be "-forkFOO"
+ * The first two command line arguments are expected to be "--forkFOO"
* (where FOO indicates which postmaster child we are to become), and
* the name of a variables file that we can read to load data that would
* have been inherited by fork() on Unix. Remaining arguments go to the
* to do this before going any further to ensure that we can attach at the
* same address the postmaster used.
*/
- if (strcmp(argv[1], "-forkbackend") == 0 ||
- strcmp(argv[1], "-forkautovac") == 0 ||
- strcmp(argv[1], "-forkboot") == 0)
+ if (strcmp(argv[1], "--forkbackend") == 0 ||
+ strcmp(argv[1], "--forkautovac") == 0 ||
+ strcmp(argv[1], "--forkboot") == 0)
PGSharedMemoryReAttach();
/*
read_nondefault_variables();
/* Run backend or appropriate child */
- if (strcmp(argv[1], "-forkbackend") == 0)
+ if (strcmp(argv[1], "--forkbackend") == 0)
{
Assert(argc == 3); /* shouldn't be any more args */
/* And run the backend */
proc_exit(BackendRun(&port));
}
- if (strcmp(argv[1], "-forkboot") == 0)
+ if (strcmp(argv[1], "--forkboot") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
BootstrapMain(argc - 2, argv + 2);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkautovac") == 0)
+ if (strcmp(argv[1], "--forkautovac") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
AutoVacMain(argc - 2, argv + 2);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkarch") == 0)
+ if (strcmp(argv[1], "--forkarch") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
PgArchiverMain(argc, argv);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkbuf") == 0)
+ if (strcmp(argv[1], "--forkbuf") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
PgstatBufferMain(argc, argv);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkcol") == 0)
+ if (strcmp(argv[1], "--forkcol") == 0)
{
/*
* Do NOT close postmaster sockets here, because we are forking from
PgstatCollectorMain(argc, argv);
proc_exit(0);
}
- if (strcmp(argv[1], "-forklog") == 0)
+ if (strcmp(argv[1], "--forklog") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(true);
av[ac++] = "postgres";
#ifdef EXEC_BACKEND
- av[ac++] = "-forkboot";
+ av[ac++] = "--forkboot";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
#endif
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.24 2006/06/07 22:24:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.25 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
char numbuf[2][32];
av[ac++] = "postgres";
- av[ac++] = "-forklog";
+ av[ac++] = "--forklog";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
/* static variables (those not passed by write_backend_variables) */
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.487 2006/06/11 15:49:28 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.488 2006/06/18 15:38:37 petere Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
}
-static void
-usage(const char *progname)
-{
- printf(_("%s is the PostgreSQL stand-alone backend. It is not\nintended to be used by normal users.\n\n"), progname);
-
- printf(_("Usage:\n %s [OPTION]... DBNAME\n\n"), progname);
- printf(_("Options:\n"));
-#ifdef USE_ASSERT_CHECKING
- printf(_(" -A 1|0 enable/disable run-time assert checking\n"));
-#endif
- printf(_(" -B NBUFFERS number of shared buffers\n"));
- printf(_(" -c NAME=VALUE set run-time parameter\n"));
- printf(_(" -d 0-5 debugging level\n"));
- printf(_(" -D DATADIR database directory\n"));
- printf(_(" -e use European date input format (DMY)\n"));
- printf(_(" -E echo statement before execution\n"));
- printf(_(" -F turn fsync off\n"));
- printf(_(" -j do not use newline as interactive query delimiter\n"));
- printf(_(" -r FILENAME send stdout and stderr to given file\n"));
- printf(_(" -s show statistics after each query\n"));
- printf(_(" -S WORK-MEM set amount of memory for sorts (in kB)\n"));
- printf(_(" --NAME=VALUE set run-time parameter\n"));
- printf(_(" --describe-config describe configuration parameters, then exit\n"));
- printf(_(" --help show this help, then exit\n"));
- printf(_(" --version output version information, then exit\n"));
- printf(_("\nDeveloper options:\n"));
- printf(_(" -f s|i|n|m|h forbid use of some plan types\n"));
- printf(_(" -O allow system table structure changes\n"));
- printf(_(" -P disable system indexes\n"));
- printf(_(" -t pa|pl|ex show timings after each query\n"));
- printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n"));
- printf(_("\nReport bugs to
.\n"));
-}
-
-
/*
* set_debug_options --- apply "-d N" command line option
*
(guc_names = lappend(guc_names, pstrdup(name)), \
guc_values = lappend(guc_values, pstrdup(val)))
- /*
- * Catch standard options before doing much else. This even works on
- * systems without getopt_long.
- */
- if (!IsUnderPostmaster && argc > 1)
- {
- if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
- {
- usage(argv[0]);
- exit(0);
- }
- if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
- {
- puts(PG_VERSIONSTR);
- exit(0);
- }
- }
-
/*
* initialize globals (already done if under postmaster, but not if
* standalone; cheap enough to do over)
* ----------------
*/
+ /* Ignore the initial --single argument, if present */
+ if (argc > 1 && strcmp(argv[1], "--single") == 0)
+ {
+ argv++;
+ argc--;
+ }
+
/* all options are allowed until '-p' */
secure = true;
ctx = PGC_POSTMASTER;
*
* initdb creates (initializes) a PostgreSQL database cluster (site,
* instance, installation, whatever). A database cluster is a
- * collection of PostgreSQL databases all managed by the same postmaster.
+ * collection of PostgreSQL databases all managed by the same server.
*
* To create the database cluster, we create the directory that contains
* all its data, create the files that hold the global tables, create
* Portions Copyright (c) 1994, Regents of the University of California
* Portions taken from FreeBSD.
*
- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.117 2006/06/07 22:24:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.118 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
* (no quoting to worry about).
*/
static const char *boot_options = "-F";
-static const char *backend_options = "-F -O -c search_path=pg_catalog -c exit_on_error=true";
+static const char *backend_options = "--single -F -O -c search_path=pg_catalog -c exit_on_error=true";
/* path to 'initdb' binary directory */
test_max_fsm = FSM_FOR_BUFS(test_buffs);
snprintf(cmd, sizeof(cmd),
- "%s\"%s\" -boot -x0 %s "
+ "%s\"%s\" --boot -x0 %s "
"-c max_connections=%d "
"-c shared_buffers=%d "
"-c max_fsm_pages=%d "
test_max_fsm = FSM_FOR_BUFS(test_buffs);
snprintf(cmd, sizeof(cmd),
- "%s\"%s\" -boot -x0 %s "
+ "%s\"%s\" --boot -x0 %s "
"-c max_connections=%d "
"-c shared_buffers=%d "
"-c max_fsm_pages=%d "
unsetenv("PGCLIENTENCODING");
snprintf(cmd, sizeof(cmd),
- "\"%s\" -boot -x1 %s %s template1",
+ "\"%s\" --boot -x1 %s %s template1",
backend_exec, boot_options, talkargs);
PG_CMD_OPEN;
get_parent_directory(bin_dir);
printf(_("\nSuccess. You can now start the database server using:\n\n"
- " %s%s%spostmaster%s -D %s%s%s\n"
+ " %s%s%spostgres%s -D %s%s%s\n"
"or\n"
" %s%s%spg_ctl%s -D %s%s%s -l logfile start\n\n"),
QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
*
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.68 2006/06/07 22:24:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.69 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
#define WHITESPACE "\f\n\r\t\v" /* as defined by isspace() */
-/* postmaster version ident string */
-#define PM_VERSIONSTR "postmaster (PostgreSQL) " PG_VERSION "\n"
+/* postgres version ident string */
+#define PM_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
typedef enum
{
old_pid = get_pgpid();
if (old_pid != 0)
- write_stderr(_("%s: another postmaster may be running; "
- "trying to start postmaster anyway\n"),
+ write_stderr(_("%s: another server may be running; "
+ "trying to start server anyway\n"),
progname);
}
postmaster_path = pg_malloc(MAXPGPATH);
- if ((ret = find_other_exec(argv0, "postmaster", PM_VERSIONSTR,
+ if ((ret = find_other_exec(argv0, "postgres", PM_VERSIONSTR,
postmaster_path)) < 0)
{
char full_path[MAXPGPATH];
StrNCpy(full_path, progname, MAXPGPATH);
if (ret == -1)
- write_stderr(_("The program \"postmaster\" is needed by %s "
+ write_stderr(_("The program \"postgres\" is needed by %s "
"but was not found in the\n"
"same directory as \"%s\".\n"
"Check your installation.\n"),
progname, full_path);
else
- write_stderr(_("The program \"postmaster\" was found by \"%s\"\n"
+ write_stderr(_("The program \"postgres\" was found by \"%s\"\n"
"but was not the same version as %s.\n"
"Check your installation.\n"),
full_path, progname);
exitcode = start_postmaster();
if (exitcode != 0)
{
- write_stderr(_("%s: could not start postmaster: exit code was %d\n"),
+ write_stderr(_("%s: could not start server: exit code was %d\n"),
progname, exitcode);
exit(1);
}
pid = get_pgpid();
if (pid == old_pid)
{
- write_stderr(_("%s: could not start postmaster\n"
+ write_stderr(_("%s: could not start server\n"
"Examine the log output.\n"),
progname);
exit(1);
if (do_wait)
{
- print_msg(_("waiting for postmaster to start..."));
+ print_msg(_("waiting for server to start..."));
if (test_postmaster_connection() == false)
{
- printf(_("could not start postmaster\n"));
+ printf(_("could not start server\n"));
exit(1);
}
else
{
print_msg(_(" done\n"));
- print_msg(_("postmaster started\n"));
+ print_msg(_("server started\n"));
}
}
else
- print_msg(_("postmaster starting\n"));
+ print_msg(_("server starting\n"));
}
if (pid == 0) /* no pid file */
{
write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
- write_stderr(_("Is postmaster running?\n"));
+ write_stderr(_("Is server running?\n"));
exit(1);
}
else if (pid < 0) /* standalone backend, not postmaster */
{
pid = -pid;
- write_stderr(_("%s: cannot stop postmaster; "
- "postgres is running (PID: %ld)\n"),
+ write_stderr(_("%s: cannot stop server; "
+ "single-user server is running (PID: %ld)\n"),
progname, pid);
exit(1);
}
if (!do_wait)
{
- print_msg(_("postmaster shutting down\n"));
+ print_msg(_("server shutting down\n"));
return;
}
else
{
- print_msg(_("waiting for postmaster to shut down..."));
+ print_msg(_("waiting for server to shut down..."));
for (cnt = 0; cnt < wait_seconds; cnt++)
{
{
print_msg(_(" failed\n"));
- write_stderr(_("%s: postmaster does not shut down\n"), progname);
+ write_stderr(_("%s: server does not shut down\n"), progname);
exit(1);
}
print_msg(_(" done\n"));
- printf(_("postmaster stopped\n"));
+ printf(_("server stopped\n"));
}
}
{
write_stderr(_("%s: PID file \"%s\" does not exist\n"),
progname, pid_file);
- write_stderr(_("Is postmaster running?\n"));
- write_stderr(_("starting postmaster anyway\n"));
+ write_stderr(_("Is server running?\n"));
+ write_stderr(_("starting server anyway\n"));
do_start();
return;
}
pid = -pid;
if (postmaster_is_alive((pid_t) pid))
{
- write_stderr(_("%s: cannot restart postmaster; "
- "postgres is running (PID: %ld)\n"),
+ write_stderr(_("%s: cannot restart server; "
+ "single-user server is running (PID: %ld)\n"),
progname, pid);
- write_stderr(_("Please terminate postgres and try again.\n"));
+ write_stderr(_("Please terminate the single-user server and try again.\n"));
exit(1);
}
}
exit(1);
}
- print_msg(_("waiting for postmaster to shut down..."));
+ print_msg(_("waiting for server to shut down..."));
/* always wait for restart */
{
print_msg(_(" failed\n"));
- write_stderr(_("%s: postmaster does not shut down\n"), progname);
+ write_stderr(_("%s: server does not shut down\n"), progname);
exit(1);
}
print_msg(_(" done\n"));
- printf(_("postmaster stopped\n"));
+ printf(_("server stopped\n"));
}
else
{
- write_stderr(_("%s: old postmaster process (PID: %ld) seems to be gone\n"),
+ write_stderr(_("%s: old server process (PID: %ld) seems to be gone\n"),
progname, pid);
- write_stderr(_("starting postmaster anyway\n"));
+ write_stderr(_("starting server anyway\n"));
}
do_start();
if (pid == 0) /* no pid file */
{
write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
- write_stderr(_("Is postmaster running?\n"));
+ write_stderr(_("Is server running?\n"));
exit(1);
}
else if (pid < 0) /* standalone backend, not postmaster */
{
pid = -pid;
- write_stderr(_("%s: cannot reload postmaster; "
- "postgres is running (PID: %ld)\n"),
+ write_stderr(_("%s: cannot reload server; "
+ "single-user server is running (PID: %ld)\n"),
progname, pid);
- write_stderr(_("Please terminate postgres and try again.\n"));
+ write_stderr(_("Please terminate the single-user server and try again.\n"));
exit(1);
}
exit(1);
}
- print_msg(_("postmaster signaled\n"));
+ print_msg(_("server signaled\n"));
}
/*
pid = -pid;
if (postmaster_is_alive((pid_t) pid))
{
- printf(_("%s: a standalone backend \"postgres\" is running (PID: %ld)\n"),
+ printf(_("%s: single-user server is running (PID: %ld)\n"),
progname, pid);
return;
}
{
char **optlines;
- printf(_("%s: postmaster is running (PID: %ld)\n"),
+ printf(_("%s: server is running (PID: %ld)\n"),
progname, pid);
optlines = readfile(postopts_file);
}
}
}
- printf(_("%s: neither postmaster nor postgres running\n"), progname);
+ printf(_("%s: no server running\n"), progname);
exit(1);
}
}
else
{
- ret = find_other_exec(argv0, "postmaster", PM_VERSIONSTR, cmdLine);
+ ret = find_other_exec(argv0, "postgres", PM_VERSIONSTR, cmdLine);
if (ret != 0)
{
- write_stderr(_("%s: could not find postmaster program executable\n"), progname);
+ write_stderr(_("%s: could not find postgres program executable\n"), progname);
exit(1);
}
}
printf(_("\nOptions for start or restart:\n"));
printf(_(" -l, --log FILENAME write (or append) server log to FILENAME\n"));
- printf(_(" -o OPTIONS command line options to pass to the postmaster\n"
+ printf(_(" -o OPTIONS command line options to pass to postgres\n"
" (PostgreSQL server executable)\n"));
- printf(_(" -p PATH-TO-POSTMASTER normally not necessary\n"));
+ printf(_(" -p PATH-TO-POSTGRES normally not necessary\n"));
printf(_("\nOptions for stop or restart:\n"));
printf(_(" -m SHUTDOWN-MODE may be \"smart\", \"fast\", or \"immediate\"\n"));