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>
This commit is contained in:
Jiri Olsa 2021-02-08 21:08:52 +01:00 committed by Arnaldo Carvalho de Melo
parent 3cda062520
commit 88adb1194c
2 changed files with 66 additions and 0 deletions

View file

@ -56,6 +56,10 @@ START COMMAND
-------------
The start command creates the daemon process.
-f::
--foreground::
Do not put the process in background.
CONFIG FILE
-----------

View file

@ -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);