From 402668f3e05259bfc135fc097136428feda01006 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 10 Oct 2011 15:28:58 +0200 Subject: [PATCH] server: write pid file for backgrounded server to specified file Signed-off-by: Jens Axboe --- init.c | 9 +++++---- server.c | 34 ++++++++++++++++++++++++++++++---- server.h | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/init.c b/init.c index f25bbe65..e8fef21e 100644 --- a/init.c +++ b/init.c @@ -194,7 +194,7 @@ static struct option l_opts[FIO_NR_OPTIONS] = { .val = 'S', }, { .name = (char *) "daemonize", - .has_arg = no_argument, + .has_arg = required_argument, .val = 'D', }, { @@ -1121,6 +1121,7 @@ static void usage(const char *name) printf("\t--warnings-fatal Fio parser warnings are fatal\n"); printf("\t--max-jobs\tMaximum number of threads/processes to support\n"); printf("\t--server=args\tStart a backend fio server\n"); + printf("\t--daemonize=pidfile Background fio server, write pid to file\n"); printf("\t--client=hostname Talk to remote backend fio server at hostname\n"); printf("\nFio was written by Jens Axboe "); printf("\n Jens Axboe \n"); @@ -1253,7 +1254,7 @@ int parse_cmd_line(int argc, char *argv[]) struct thread_data *td = NULL; int c, ini_idx = 0, lidx, ret = 0, do_exit = 0, exit_val = 0; char *ostr = cmd_optstr; - int daemonize_server = 0; + void *pid_file = NULL; void *cur_client = NULL; int backend = 0; @@ -1408,7 +1409,7 @@ int parse_cmd_line(int argc, char *argv[]) backend = 1; break; case 'D': - daemonize_server = 1; + pid_file = strdup(optarg); break; case 'C': if (is_backend) { @@ -1445,7 +1446,7 @@ int parse_cmd_line(int argc, char *argv[]) } if (is_backend && backend) - return fio_start_server(daemonize_server); + return fio_start_server(pid_file); if (td) { if (!ret) diff --git a/server.c b/server.c index cf3a48ef..2de65ad2 100644 --- a/server.c +++ b/server.c @@ -924,22 +924,42 @@ static void server_signal_handler(void) sigaction(SIGTERM, &act, NULL); } -int fio_start_server(int daemonize) +static void write_pid(pid_t pid, const char *pidfile) +{ + FILE *fpid; + + fpid = fopen(pidfile, "w"); + if (!fpid) { + log_err("fio: failed opening pid file %s\n", pidfile); + return; + } + + fprintf(fpid, "%u\n", (unsigned int) pid); +} + +/* + * If pidfile is specified, background us. + */ +int fio_start_server(char *pidfile) { pid_t pid; + int ret; server_signal_handler(); - if (!daemonize) + if (!pidfile) return fio_server(); openlog("fio", LOG_NDELAY|LOG_NOWAIT|LOG_PID, LOG_USER); pid = fork(); if (pid < 0) { syslog(LOG_ERR, "failed server fork"); + free(pidfile); return -1; - } else if (pid) + } else if (pid) { + write_pid(pid, pidfile); exit(0); + } setsid(); close(STDIN_FILENO); @@ -948,7 +968,13 @@ int fio_start_server(int daemonize) f_out = NULL; f_err = NULL; log_syslog = 1; - return fio_server(); + + ret = fio_server(); + + closelog(); + unlink(pidfile); + free(pidfile); + return ret; } void fio_server_set_arg(const char *arg) diff --git a/server.h b/server.h index 9f7eeaec..72e4cc88 100644 --- a/server.h +++ b/server.h @@ -75,7 +75,7 @@ struct cmd_line_pdu { struct cmd_single_line_pdu options[0]; }; -extern int fio_start_server(int); +extern int fio_start_server(char *); extern int fio_server_text_output(const char *, unsigned int len); extern int fio_server_log(const char *format, ...); extern int fio_net_send_cmd(int, uint16_t, const void *, off_t, uint64_t); -- 2.25.1