forked from Minki/linux
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:
parent
3cda062520
commit
88adb1194c
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user