diff options
author | Jiri Olsa | 2021-02-08 21:08:52 +0100 |
---|---|---|
committer | Arnaldo Carvalho de Melo | 2021-02-11 10:02:54 -0300 |
commit | 88adb1194cc51a4d3f1930ddd6c8f0b0f9f3a936 (patch) | |
tree | 00b9f91df9c4c21e76ba703cff400420e3821f2d /tools | |
parent | 3cda062520ab841479c56436421319cad94a151d (diff) |
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 <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: https://lore.kernel.org/r/20210208200908.1019149-9-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/Documentation/perf-daemon.txt | 4 | ||||
-rw-r--r-- | tools/perf/builtin-daemon.c | 62 |
2 files changed, 66 insertions, 0 deletions
diff --git a/tools/perf/Documentation/perf-daemon.txt b/tools/perf/Documentation/perf-daemon.txt index 173b3f9f3a41..af5916d1c3e0 100644 --- a/tools/perf/Documentation/perf-daemon.txt +++ b/tools/perf/Documentation/perf-daemon.txt @@ -56,6 +56,10 @@ START COMMAND ------------- The start command creates the daemon process. +-f:: +--foreground:: + Do not put the process in background. + CONFIG FILE ----------- 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); |