write MaxScale PID into pidfile
write MaxScale PID into pidfile
This commit is contained in:
@ -31,10 +31,11 @@
|
|||||||
* 19/06/13 Mark Riddoch Extract the epoll functionality
|
* 19/06/13 Mark Riddoch Extract the epoll functionality
|
||||||
* 21/06/13 Mark Riddoch Added initial config support
|
* 21/06/13 Mark Riddoch Added initial config support
|
||||||
* 27/06/13
|
* 27/06/13
|
||||||
* 28/06/13 Vilho Raatikka Added necessary headers, example functions and
|
* 28/06/13 Vilho Raatikka Added necessary headers, example functions and
|
||||||
* calls to log manager and to query classifier.
|
* calls to log manager and to query classifier.
|
||||||
* Put example code behind SS_DEBUG macros.
|
* Put example code behind SS_DEBUG macros.
|
||||||
* 05/02/14 Mark Riddoch Addition of version string
|
* 05/02/14 Mark Riddoch Addition of version string
|
||||||
|
* 29/06/14 Massimiliano Pinto Addition of pidfile
|
||||||
*
|
*
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
@ -109,6 +110,9 @@ static char* server_groups[] = {
|
|||||||
/* The data directory we created for this gateway instance */
|
/* The data directory we created for this gateway instance */
|
||||||
static char datadir[PATH_MAX+1] = "";
|
static char datadir[PATH_MAX+1] = "";
|
||||||
|
|
||||||
|
/* The data directory we created for this gateway instance */
|
||||||
|
static char pidfile[PATH_MAX+1] = "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* exit flag for log flusher.
|
* exit flag for log flusher.
|
||||||
*/
|
*/
|
||||||
@ -126,6 +130,8 @@ static bool daemon_mode = true;
|
|||||||
|
|
||||||
static void log_flush_shutdown(void);
|
static void log_flush_shutdown(void);
|
||||||
static void log_flush_cb(void* arg);
|
static void log_flush_cb(void* arg);
|
||||||
|
static int write_pid_file(char *); /* write MaxScale pidfile */
|
||||||
|
static void unlink_pidfile(void); /* remove pidfile */
|
||||||
static void libmysqld_done(void);
|
static void libmysqld_done(void);
|
||||||
static bool file_write_header(FILE* outfile);
|
static bool file_write_header(FILE* outfile);
|
||||||
static bool file_write_footer(FILE* outfile);
|
static bool file_write_footer(FILE* outfile);
|
||||||
@ -1018,6 +1024,7 @@ int main(int argc, char **argv)
|
|||||||
goto return_main;
|
goto return_main;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!daemon_mode)
|
if (!daemon_mode)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -1137,6 +1144,8 @@ int main(int argc, char **argv)
|
|||||||
rc = MAXSCALE_INTERNALERROR;
|
rc = MAXSCALE_INTERNALERROR;
|
||||||
goto return_main;
|
goto return_main;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* register exit function for embedded MySQL library */
|
||||||
l = atexit(libmysqld_done);
|
l = atexit(libmysqld_done);
|
||||||
|
|
||||||
if (l != 0) {
|
if (l != 0) {
|
||||||
@ -1148,6 +1157,7 @@ int main(int argc, char **argv)
|
|||||||
rc = MAXSCALE_INTERNALERROR;
|
rc = MAXSCALE_INTERNALERROR;
|
||||||
goto return_main;
|
goto return_main;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*<
|
/*<
|
||||||
* If MaxScale home directory wasn't set by command-line argument.
|
* If MaxScale home directory wasn't set by command-line argument.
|
||||||
* Next, resolve it from environment variable and further on,
|
* Next, resolve it from environment variable and further on,
|
||||||
@ -1323,6 +1333,10 @@ int main(int argc, char **argv)
|
|||||||
"MaxScale is running in process %i",
|
"MaxScale is running in process %i",
|
||||||
getpid())));
|
getpid())));
|
||||||
|
|
||||||
|
/* Write process pid into MaxScale pidfile */
|
||||||
|
write_pid_file(home_dir);
|
||||||
|
|
||||||
|
/* Init MaxScale poll system */
|
||||||
poll_init();
|
poll_init();
|
||||||
|
|
||||||
/*<
|
/*<
|
||||||
@ -1363,6 +1377,7 @@ int main(int argc, char **argv)
|
|||||||
* Serve clients.
|
* Serve clients.
|
||||||
*/
|
*/
|
||||||
poll_waitevents((void *)0);
|
poll_waitevents((void *)0);
|
||||||
|
|
||||||
/*<
|
/*<
|
||||||
* Wait server threads' completion.
|
* Wait server threads' completion.
|
||||||
*/
|
*/
|
||||||
@ -1389,6 +1404,9 @@ int main(int argc, char **argv)
|
|||||||
LOGFILE_MESSAGE,
|
LOGFILE_MESSAGE,
|
||||||
"MaxScale shutdown completed.")));
|
"MaxScale shutdown completed.")));
|
||||||
|
|
||||||
|
/* Remove Pidfile */
|
||||||
|
unlink_pidfile();
|
||||||
|
|
||||||
return_main:
|
return_main:
|
||||||
return rc;
|
return rc;
|
||||||
} /*< End of main */
|
} /*< End of main */
|
||||||
@ -1435,3 +1453,59 @@ static void log_flush_cb(
|
|||||||
LOGIF(LM, (skygw_log_write(LOGFILE_MESSAGE,
|
LOGIF(LM, (skygw_log_write(LOGFILE_MESSAGE,
|
||||||
"Finished MaxScale log flusher.")));
|
"Finished MaxScale log flusher.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlink pid file, called at program exit
|
||||||
|
*/
|
||||||
|
static void unlink_pidfile(void)
|
||||||
|
{
|
||||||
|
if (strlen(pidfile)) {
|
||||||
|
if (unlink(pidfile)) {
|
||||||
|
fprintf(stderr, "MaxScale failed to remove pidfile %s: error %d, %s\n", pidfile, errno, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write process pid into pidfile anc close it
|
||||||
|
* Parameters:
|
||||||
|
* @param home_dir The MaxScale home dir
|
||||||
|
* @return 0 on success, 1 on failure
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int write_pid_file(char *home_dir) {
|
||||||
|
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
|
snprintf(pidfile, PATH_MAX, "%s/log/maxscale.pid", home_dir);
|
||||||
|
|
||||||
|
fd = open(pidfile, O_WRONLY | O_CREAT | O_TRUNC, 0777);
|
||||||
|
if (fd == -1) {
|
||||||
|
fprintf(stderr, "MaxScale failed to open pidFile %s: error %d, %s\n", pidfile, errno, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
char pidstr[50]="";
|
||||||
|
/* truncate pidfile content */
|
||||||
|
if (ftruncate(fd, 0) == -1) {
|
||||||
|
fprintf(stderr, "MaxScale failed to truncate pidfile %s: error %d, %s\n", pidfile, errno, strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(pidstr, sizeof(pidstr)-1, "%d", getpid());
|
||||||
|
|
||||||
|
if (pwrite(fd, pidstr, strlen(pidstr), 0) != (ssize_t)strlen(pidstr)) {
|
||||||
|
fprintf(stderr, "MaxScale failed to write into pidfile %s: error %d, %s\n", pidfile, errno, strerror(errno));
|
||||||
|
/* close file and return */
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close file */
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
fprintf(stderr, "MaxScale PID %s in pidfile %s\n", pidstr, pidfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* success */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user