Commit 88adb119 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

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: default avatarJiri 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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3cda0625
......@@ -56,6 +56,10 @@ START COMMAND
-------------
The start command creates the daemon process.
-f::
--foreground::
Do not put the process in background.
CONFIG 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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment