@@ -85,6 +85,7 @@ static char *pg_config = NULL;
85
85
static char * pgdata_opt = NULL ;
86
86
static char * post_opts = NULL ;
87
87
static const char * progname ;
88
+ static bool idempotent = false;
88
89
static char * log_file = NULL ;
89
90
static char * exec_path = NULL ;
90
91
static char * register_servicename = "PostgreSQL" ; /* FIXME: + version ID? */
@@ -773,9 +774,15 @@ do_start(void)
773
774
{
774
775
old_pid = get_pgpid ();
775
776
if (old_pid != 0 )
776
- write_stderr (_ ("%s: another server might be running; "
777
- "trying to start server anyway\n" ),
778
- progname );
777
+ {
778
+ if (idempotent )
779
+ exit (0 );
780
+ else
781
+ {
782
+ write_stderr (_ ("%s: another server might be running\n" ), progname );
783
+ exit (1 );
784
+ }
785
+ }
779
786
}
780
787
781
788
read_post_opts ();
@@ -859,6 +866,8 @@ do_stop(void)
859
866
860
867
if (pid == 0 ) /* no pid file */
861
868
{
869
+ if (idempotent )
870
+ exit (0 );
862
871
write_stderr (_ ("%s: PID file \"%s\" does not exist\n" ), progname , pid_file );
863
872
write_stderr (_ ("Is server running?\n" ));
864
873
exit (1 );
@@ -1763,9 +1772,9 @@ do_help(void)
1763
1772
printf (_ ("%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n" ), progname );
1764
1773
printf (_ ("Usage:\n" ));
1765
1774
printf (_ (" %s init[db] [-D DATADIR] [-s] [-o \"OPTIONS\"]\n" ), progname );
1766
- printf (_ (" %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" ), progname );
1767
- printf (_ (" %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n" ), progname );
1768
- printf (_ (" %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
1775
+ printf (_ (" %s start [-w] [-t SECS] [-D DATADIR] [-s] [-I] [- l FILENAME] [-o \"OPTIONS\"]\n" ), progname );
1776
+ printf (_ (" %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-I] [- m SHUTDOWN-MODE]\n" ), progname );
1777
+ printf (_ (" %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
1769
1778
" [-o \"OPTIONS\"]\n" ), progname );
1770
1779
printf (_ (" %s reload [-D DATADIR] [-s]\n" ), progname );
1771
1780
printf (_ (" %s status [-D DATADIR]\n" ), progname );
@@ -1798,6 +1807,8 @@ do_help(void)
1798
1807
printf (_ (" -o OPTIONS command line options to pass to postgres\n"
1799
1808
" (PostgreSQL server executable) or initdb\n" ));
1800
1809
printf (_ (" -p PATH-TO-POSTGRES normally not necessary\n" ));
1810
+ printf (_ ("\nOptions for start or stop:\n" ));
1811
+ printf (_ (" -I, --idempotent don't error if server already running or stopped\n" ));
1801
1812
printf (_ ("\nOptions for stop, restart, or promote:\n" ));
1802
1813
printf (_ (" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" ));
1803
1814
@@ -1980,6 +1991,7 @@ main(int argc, char **argv)
1980
1991
{"silent" , no_argument , NULL , 's' },
1981
1992
{"timeout" , required_argument , NULL , 't' },
1982
1993
{"core-files" , no_argument , NULL , 'c' },
1994
+ {"idempotent" , no_argument , NULL , 'I' },
1983
1995
{NULL , 0 , NULL , 0 }
1984
1996
};
1985
1997
@@ -2045,7 +2057,7 @@ main(int argc, char **argv)
2045
2057
/* process command-line options */
2046
2058
while (optind < argc )
2047
2059
{
2048
- while ((c = getopt_long (argc , argv , "cD:l :m:N:o:p:P:sS:t:U:wW" , long_options , & option_index )) != -1 )
2060
+ while ((c = getopt_long (argc , argv , "cD:Il :m:N:o:p:P:sS:t:U:wW" , long_options , & option_index )) != -1 )
2049
2061
{
2050
2062
switch (c )
2051
2063
{
@@ -2071,6 +2083,9 @@ main(int argc, char **argv)
2071
2083
pgdata_D );
2072
2084
break ;
2073
2085
}
2086
+ case 'I' :
2087
+ idempotent = true;
2088
+ break ;
2074
2089
case 'l' :
2075
2090
log_file = pg_strdup (optarg );
2076
2091
break ;
0 commit comments