From 88adb1194cc51a4d3f1930ddd6c8f0b0f9f3a936 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Mon, 8 Feb 2021 21:08:52 +0100 Subject: perf daemon: Add background support Add support to put the daemon process in the background. It's now enabled by default and -f option is added to keep the daemon process on the console for debugging. Signed-off-by: Jiri Olsa Cc: Alexander Shishkin Cc: Alexei Budankov Cc: Ian Rogers Cc: Ingo Molnar Cc: Mark Rutland Cc: Michael Petlan Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20210208200908.1019149-9-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-daemon.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'tools/perf/builtin-daemon.c') diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c index f33fc5c3249e..2241d0e36d92 100644 --- a/tools/perf/builtin-daemon.c +++ b/tools/perf/builtin-daemon.c @@ -675,10 +675,61 @@ static int setup_config(struct daemon *daemon) return daemon->config_real ? 0 : -1; } +static int go_background(struct daemon *daemon) +{ + int pid, fd; + + pid = fork(); + if (pid < 0) + return -1; + + if (pid > 0) + return 1; + + if (setsid() < 0) + return -1; + + umask(0); + + if (chdir(daemon->base)) { + perror("failed: chdir"); + return -1; + } + + fd = open("output", O_RDWR|O_CREAT|O_TRUNC, 0644); + if (fd < 0) { + perror("failed: open"); + return -1; + } + + if (fcntl(fd, F_SETFD, FD_CLOEXEC)) { + perror("failed: fcntl FD_CLOEXEC"); + close(fd); + return -1; + } + + close(0); + dup2(fd, 1); + dup2(fd, 2); + close(fd); + + daemon->out = fdopen(1, "w"); + if (!daemon->out) { + close(1); + close(2); + return -1; + } + + setbuf(daemon->out, NULL); + return 0; +} + static int __cmd_start(struct daemon *daemon, struct option parent_options[], int argc, const char **argv) { + bool foreground = false; struct option start_options[] = { + OPT_BOOLEAN('f', "foreground", &foreground, "stay on console"), OPT_PARENT(parent_options), OPT_END() }; @@ -699,6 +750,17 @@ static int __cmd_start(struct daemon *daemon, struct option parent_options[], if (setup_server_config(daemon)) return -1; + if (!foreground) { + err = go_background(daemon); + if (err) { + /* original process, exit normally */ + if (err == 1) + err = 0; + daemon__exit(daemon); + return err; + } + } + debug_set_file(daemon->out); debug_set_display_time(true); -- cgit