added handling of a PID file

This commit is contained in:
Christian Kruse
2014-01-09 13:04:40 +01:00
parent 634fdff303
commit 0e8ff1730e

View File

@@ -22,6 +22,9 @@
#include <signal.h> #include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@@ -103,6 +106,8 @@ char repmgr_schema[MAXLEN];
bool failover_done = false; bool failover_done = false;
char *pid_file = NULL;
/* /*
* should initialize with {0} to be ANSI complaint ? but this raises * should initialize with {0} to be ANSI complaint ? but this raises
* error with gcc -Wall * error with gcc -Wall
@@ -154,6 +159,7 @@ main(int argc, char **argv)
{"verbose", no_argument, NULL, 'v'}, {"verbose", no_argument, NULL, 'v'},
{"monitoring-history", no_argument, NULL, 'm'}, {"monitoring-history", no_argument, NULL, 'm'},
{"daemonize", no_argument, NULL, 'd'}, {"daemonize", no_argument, NULL, 'd'},
{"pid-file", required_argument, NULL, 'p'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
@@ -179,7 +185,7 @@ main(int argc, char **argv)
} }
} }
while ((c = getopt_long(argc, argv, "f:v:md", long_options, &optindex)) != -1) while ((c = getopt_long(argc, argv, "f:v:mdp:", long_options, &optindex)) != -1)
{ {
switch (c) switch (c)
{ {
@@ -195,6 +201,9 @@ main(int argc, char **argv)
case 'd': case 'd':
daemonize = true; daemonize = true;
break; break;
case 'p':
pid_file = optarg;
break;
default: default:
usage(); usage();
exit(ERR_BAD_CONFIG); exit(ERR_BAD_CONFIG);
@@ -225,6 +234,28 @@ main(int argc, char **argv)
} }
} }
if (pid_file)
{
struct stat st;
FILE *fd;
if (stat(pid_file, &st) != -1)
{
log_err("PID file %s exists. If repmgrd is no longer alive remove the file and restart repmgrd.\n", pid_file);
exit(ERR_BAD_CONFIG);
}
fd = fopen(pid_file, "w");
if (fd == NULL)
{
log_err("Could not open PID file %s!\n", pid_file);
exit(ERR_BAD_CONFIG);
}
fprintf(fd, "%d", getpid());
fclose(fd);
}
#ifndef WIN32 #ifndef WIN32
setup_event_handlers(); setup_event_handlers();
#endif #endif
@@ -1151,6 +1182,7 @@ void help(const char *progname)
printf(_(" --monitoring-history track advance or lag of the replication in every standby in repl_monitor\n")); printf(_(" --monitoring-history track advance or lag of the replication in every standby in repl_monitor\n"));
printf(_(" -f, --config_file=PATH configuration file\n")); printf(_(" -f, --config_file=PATH configuration file\n"));
printf(_(" -d, --daemonize detach process from foreground\n")); printf(_(" -d, --daemonize detach process from foreground\n"));
printf(_(" -p, --pid-file=PATH write a PID file\n"));
printf(_("\n%s monitors a cluster of servers.\n"), progname); printf(_("\n%s monitors a cluster of servers.\n"), progname);
} }
@@ -1161,6 +1193,12 @@ handle_sigint(SIGNAL_ARGS)
{ {
CloseConnections(); CloseConnections();
logger_shutdown(); logger_shutdown();
if (pid_file)
{
remove(pid_file);
}
exit(1); exit(1);
} }
@@ -1176,6 +1214,7 @@ setup_event_handlers(void)
{ {
pqsignal(SIGHUP, handle_sighup); pqsignal(SIGHUP, handle_sighup);
pqsignal(SIGINT, handle_sigint); pqsignal(SIGINT, handle_sigint);
pqsignal(SIGTERM, handle_sigint);
} }
#endif #endif