@@ -61,6 +61,7 @@ typedef enum
6161 RELOAD_COMMAND ,
6262 STATUS_COMMAND ,
6363 PROMOTE_COMMAND ,
64+ LOGROTATE_COMMAND ,
6465 KILL_COMMAND ,
6566 REGISTER_COMMAND ,
6667 UNREGISTER_COMMAND ,
@@ -100,6 +101,7 @@ static char version_file[MAXPGPATH];
100101static char pid_file [MAXPGPATH ];
101102static char backup_file [MAXPGPATH ];
102103static char promote_file [MAXPGPATH ];
104+ static char logrotate_file [MAXPGPATH ];
103105
104106#ifdef WIN32
105107static DWORD pgctl_start_type = SERVICE_AUTO_START ;
@@ -125,6 +127,7 @@ static void do_restart(void);
125127static void do_reload (void );
126128static void do_status (void );
127129static void do_promote (void );
130+ static void do_logrotate (void );
128131static void do_kill (pgpid_t pid );
129132static void print_msg (const char * msg );
130133static void adjust_data_dir (void );
@@ -1171,6 +1174,62 @@ do_promote(void)
11711174 print_msg (_ ("server promoting\n" ));
11721175}
11731176
1177+ /*
1178+ * log rotate
1179+ */
1180+
1181+ static void
1182+ do_logrotate (void )
1183+ {
1184+ FILE * logrotatefile ;
1185+ pgpid_t pid ;
1186+
1187+ pid = get_pgpid (false);
1188+
1189+ if (pid == 0 ) /* no pid file */
1190+ {
1191+ write_stderr (_ ("%s: PID file \"%s\" does not exist\n" ), progname , pid_file );
1192+ write_stderr (_ ("Is server running?\n" ));
1193+ exit (1 );
1194+ }
1195+ else if (pid < 0 ) /* standalone backend, not postmaster */
1196+ {
1197+ pid = - pid ;
1198+ write_stderr (_ ("%s: cannot rotate log file; "
1199+ "single-user server is running (PID: %ld)\n" ),
1200+ progname , pid );
1201+ exit (1 );
1202+ }
1203+
1204+ snprintf (logrotate_file , MAXPGPATH , "%s/logrotate" , pg_data );
1205+
1206+ if ((logrotatefile = fopen (logrotate_file , "w" )) == NULL )
1207+ {
1208+ write_stderr (_ ("%s: could not create log rotation signal file \"%s\": %s\n" ),
1209+ progname , logrotate_file , strerror (errno ));
1210+ exit (1 );
1211+ }
1212+ if (fclose (logrotatefile ))
1213+ {
1214+ write_stderr (_ ("%s: could not write log rotation signal file \"%s\": %s\n" ),
1215+ progname , logrotate_file , strerror (errno ));
1216+ exit (1 );
1217+ }
1218+
1219+ sig = SIGUSR1 ;
1220+ if (kill ((pid_t ) pid , sig ) != 0 )
1221+ {
1222+ write_stderr (_ ("%s: could not send log rotation signal (PID: %ld): %s\n" ),
1223+ progname , pid , strerror (errno ));
1224+ if (unlink (logrotate_file ) != 0 )
1225+ write_stderr (_ ("%s: could not remove log rotation signal file \"%s\": %s\n" ),
1226+ progname , logrotate_file , strerror (errno ));
1227+ exit (1 );
1228+ }
1229+
1230+ print_msg (_ ("server signaled to rotate log file\n" ));
1231+ }
1232+
11741233
11751234/*
11761235 * utility routines
@@ -1912,19 +1971,20 @@ do_help(void)
19121971{
19131972 printf (_ ("%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n" ), progname );
19141973 printf (_ ("Usage:\n" ));
1915- printf (_ (" %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" ), progname );
1916- printf (_ (" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
1917- " [-o OPTIONS] [-p PATH] [-c]\n" ), progname );
1918- printf (_ (" %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" ), progname );
1919- printf (_ (" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
1920- " [-o OPTIONS] [-c]\n" ), progname );
1921- printf (_ (" %s reload [-D DATADIR] [-s]\n" ), progname );
1922- printf (_ (" %s status [-D DATADIR]\n" ), progname );
1923- printf (_ (" %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" ), progname );
1924- printf (_ (" %s kill SIGNALNAME PID\n" ), progname );
1974+ printf (_ (" %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" ), progname );
1975+ printf (_ (" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
1976+ " [-o OPTIONS] [-p PATH] [-c]\n" ), progname );
1977+ printf (_ (" %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" ), progname );
1978+ printf (_ (" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
1979+ " [-o OPTIONS] [-c]\n" ), progname );
1980+ printf (_ (" %s reload [-D DATADIR] [-s]\n" ), progname );
1981+ printf (_ (" %s status [-D DATADIR]\n" ), progname );
1982+ printf (_ (" %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" ), progname );
1983+ printf (_ (" %s logrotate [-D DATADIR] [-s]\n" ), progname );
1984+ printf (_ (" %s kill SIGNALNAME PID\n" ), progname );
19251985#ifdef WIN32
1926- printf (_ (" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
1927- " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" ), progname );
1986+ printf (_ (" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
1987+ " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" ), progname );
19281988 printf (_ (" %s unregister [-N SERVICENAME]\n" ), progname );
19291989#endif
19301990
@@ -2337,6 +2397,8 @@ main(int argc, char **argv)
23372397 ctl_command = STATUS_COMMAND ;
23382398 else if (strcmp (argv [optind ], "promote" ) == 0 )
23392399 ctl_command = PROMOTE_COMMAND ;
2400+ else if (strcmp (argv [optind ], "logrotate" ) == 0 )
2401+ ctl_command = LOGROTATE_COMMAND ;
23402402 else if (strcmp (argv [optind ], "kill" ) == 0 )
23412403 {
23422404 if (argc - optind < 3 )
@@ -2443,6 +2505,9 @@ main(int argc, char **argv)
24432505 case PROMOTE_COMMAND :
24442506 do_promote ();
24452507 break ;
2508+ case LOGROTATE_COMMAND :
2509+ do_logrotate ();
2510+ break ;
24462511 case KILL_COMMAND :
24472512 do_kill (killproc );
24482513 break ;
0 commit comments