From 3631c545b8e3256c5aba2269491912e3f568cd99 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Mon, 18 Sep 2017 12:16:27 -0700 Subject: [PATCH] init: add exec_background command This command functions similarly to `exec` except that it does not cause init to halt executing commands until the process has terminated. It is useful for launching simple one time background tasks. Bug: 65736247 Test: create an exec_background service and see it function properly Change-Id: I719c8b85479b65201770aedc0a13191303007c11 --- init/README.md | 5 +++++ init/builtins.cpp | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/init/README.md b/init/README.md index 7df37ff62..d7edf21ac 100644 --- a/init/README.md +++ b/init/README.md @@ -381,6 +381,11 @@ Commands within _argument_. Init halts executing commands until the forked process exits. +`exec_background [ [ [ \* ] ] ] -- [ \* ]` +> Fork and execute command with the given arguments. This is handled similarly + to the `exec` command. The difference is that init does not halt executing + commands until the process exits for `exec_background`. + `exec_start ` > Start a given service and halt the processing of additional init commands until it returns. The command functions similarly to the `exec` command, diff --git a/init/builtins.cpp b/init/builtins.cpp index 886c57240..269e5561e 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -148,6 +148,19 @@ static Result do_exec(const std::vector& args) { return Success(); } +static Result do_exec_background(const std::vector& args) { + auto service = Service::MakeTemporaryOneshotService(args); + if (!service) { + return Error() << "Could not create exec background service"; + } + if (auto result = service->Start(); !result) { + return Error() << "Could not start exec background service: " << result.error(); + } + + ServiceList::GetInstance().AddService(std::move(service)); + return Success(); +} + static Result do_exec_start(const std::vector& args) { Service* service = ServiceList::GetInstance().FindService(args[1]); if (!service) { @@ -959,6 +972,7 @@ const BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const { {"domainname", {1, 1, do_domainname}}, {"enable", {1, 1, do_enable}}, {"exec", {1, kMax, do_exec}}, + {"exec_background", {1, kMax, do_exec_background}}, {"exec_start", {1, 1, do_exec_start}}, {"export", {2, 2, do_export}}, {"hostname", {1, 1, do_hostname}},