diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml index 31a1262fca48121e1cc4d035aa65835c71fb0770..29bea24cdd4b8f02051ef0940ae7886e77b511d0 100644 --- a/doc/src/sgml/ref/pg_ctl-ref.sgml +++ b/doc/src/sgml/ref/pg_ctl-ref.sgml @@ -102,6 +102,12 @@ PostgreSQL documentation <arg>-U <replaceable>username</replaceable></arg> <arg>-P <replaceable>password</replaceable></arg> <arg>-D <replaceable>datadir</replaceable></arg> + <arg>-S + <group choice="plain"> + <arg>a[uto]</arg> + <arg>d[emand]</arg> + </group> + </arg> <arg>-w</arg> <arg>-t <replaceable>seconds</replaceable></arg> <arg>-o <replaceable>options</replaceable></arg> @@ -203,7 +209,9 @@ PostgreSQL documentation <para> <option>register</option> mode allows you to register a system service - on <productname>Microsoft Windows</>. + on <productname>Microsoft Windows</>. The <option>-S</option> option + allows selection of service start type, either <quote>auto</quote> (start + service automatically on system startup), on <quote>demand</quote>. </para> <para> @@ -261,7 +269,7 @@ PostgreSQL documentation Specifies the shutdown mode. <replaceable>mode</replaceable> can be <literal>smart</literal>, <literal>fast</literal>, or <literal>immediate</literal>, or the first letter of one of - these three. + these three. If this is omitted, <literal>smart</literal> is used. </para> </listitem> </varlistentry> @@ -384,6 +392,18 @@ PostgreSQL documentation </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>-S <replaceable class="parameter">start-type</replaceable></option></term> + <listitem> + <para> + Start type of the system service to register. start-type can + be <literal>auto</literal>, or <literal>demand</literal>, or + the first letter of one of these two. If this is omitted, + <literal>auto</literal> is used. + </para> + </listitem> + </varlistentry> </variablelist> </refsect2> diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 4af639bfee4d8fc2ab1797bfc2bf322e1bfd0d32..14d36b5fac1e4d6040dc50a1ce0b5df877df8b08 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -121,6 +121,7 @@ static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *); static void pgwin32_doRunAsService(void); static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service); +static DWORD pgctl_start_type = SERVICE_AUTO_START; static SERVICE_STATUS status; static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0; static HANDLE shutdownHandles[2]; @@ -1163,8 +1164,8 @@ pgwin32_doRegister(void) } if ((hService = CreateService(hSCM, register_servicename, register_servicename, - SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, + SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, + pgctl_start_type, SERVICE_ERROR_NORMAL, pgwin32_CommandLine(true), NULL, NULL, "RPCSS\0", register_username, register_password)) == NULL) { @@ -1603,7 +1604,7 @@ do_help(void) printf(_(" %s kill SIGNALNAME PID\n"), progname); #if defined(WIN32) || defined(__CYGWIN__) printf(_(" %s register [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]\n" - " [-w] [-t SECS] [-o \"OPTIONS\"]\n"), progname); + " [-S START-TYPE] [-w] [-t SECS] [-o \"OPTIONS\"]\n"), progname); printf(_(" %s unregister [-N SERVICENAME]\n"), progname); #endif @@ -1644,6 +1645,11 @@ do_help(void) printf(_(" -N SERVICENAME service name with which to register PostgreSQL server\n")); printf(_(" -P PASSWORD password of account to register PostgreSQL server\n")); printf(_(" -U USERNAME user name of account to register PostgreSQL server\n")); + printf(_(" -S START-TYPE service start type to register PostgreSQL server\n")); + + printf(_("\nStart types are:\n")); + printf(_(" auto start service automatically during system startup (default)\n")); + printf(_(" demand start service on demand\n")); #endif printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); @@ -1708,10 +1714,26 @@ set_sig(char *signame) do_advice(); exit(1); } - } +#if defined(WIN32) || defined(__CYGWIN__) +static void +set_starttype(char *starttypeopt) +{ + if (strcmp(starttypeopt, "a") == 0 || strcmp(starttypeopt, "auto") == 0) + pgctl_start_type = SERVICE_AUTO_START; + else if (strcmp(starttypeopt, "d") == 0 || strcmp(starttypeopt, "demand") == 0) + pgctl_start_type = SERVICE_DEMAND_START; + else + { + write_stderr(_("%s: unrecognized start type \"%s\"\n"), progname, starttypeopt); + do_advice(); + exit(1); + } +} +#endif + int main(int argc, char **argv) @@ -1789,7 +1811,7 @@ main(int argc, char **argv) /* process command-line options */ while (optind < argc) { - while ((c = getopt_long(argc, argv, "cD:l:m:N:o:p:P:st:U:wW", long_options, &option_index)) != -1) + while ((c = getopt_long(argc, argv, "cD:l:m:N:o:p:P:sS:t:U:wW", long_options, &option_index)) != -1) { switch (c) { @@ -1836,6 +1858,15 @@ main(int argc, char **argv) case 's': silent_mode = true; break; + case 'S': +#if defined(WIN32) || defined(__CYGWIN__) + set_starttype(optarg); +#else + write_stderr(_("%s: -S option not supported on this platform\n"), + progname); + exit(1); +#endif + break; case 't': wait_seconds = atoi(optarg); break; @@ -1944,8 +1975,7 @@ main(int argc, char **argv) if (pg_data == NULL && ctl_command != KILL_COMMAND && ctl_command != UNREGISTER_COMMAND) { - write_stderr(_("%s: no database directory specified " - "and environment variable PGDATA unset\n"), + write_stderr(_("%s: no database directory specified and environment variable PGDATA unset\n"), progname); do_advice(); exit(1);