.val = 'S',
},
{ .name = (char *) "daemonize",
- .has_arg = no_argument,
+ .has_arg = required_argument,
.val = 'D',
},
{
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 <jens.axboe@oracle.com>");
printf("\n Jens Axboe <jaxboe@fusionio.com>\n");
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;
backend = 1;
break;
case 'D':
- daemonize_server = 1;
+ pid_file = strdup(optarg);
break;
case 'C':
if (is_backend) {
}
if (is_backend && backend)
- return fio_start_server(daemonize_server);
+ return fio_start_server(pid_file);
if (td) {
if (!ret)
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);
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)
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);