diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-01-26 15:56:42 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-02-01 01:13:44 +0900 |
commit | dc4e2940e87f4f0969476b45a1d25322b5210643 (patch) | |
tree | 67e353ff59e4139f794c7a9d2607e972c2b1ad90 | |
parent | d2acb93dc52b23a9e5d36dda48c1988aa6e9adf1 (diff) | |
download | systemd-dc4e2940e87f4f0969476b45a1d25322b5210643.tar.gz |
core: set $SYSTEMD_EXEC_PID= environment variable for executed commands
It may be useful to detect a command is directly executed by systemd
manager, or indirectly as a child of another process.
-rw-r--r-- | man/systemd.exec.xml | 11 | ||||
-rw-r--r-- | src/core/execute.c | 7 |
2 files changed, 17 insertions, 1 deletions
diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml index 203fc0355d..5b5590a233 100644 --- a/man/systemd.exec.xml +++ b/man/systemd.exec.xml @@ -3044,6 +3044,17 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy </varlistentry> <varlistentry> + <term><varname>$SYSTEMD_EXEC_PID</varname></term> + + <listitem><para>The PID of the unit process (e.g. process invoked by + <varname>ExecStart=</varname>). The child process can use this information to determine + whether the process is directly invoked by the service manager or indirectly as a child of + another process by comparing this value with the current PID (as similar to the scheme used in + <citerefentry><refentrytitle>sd_listen_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry> + with <varname>$LISTEN_PID</varname> and <varname>$LISTEN_FDS</varname>).</para></listitem> + </varlistentry> + + <varlistentry> <term><varname>$TERM</varname></term> <listitem><para>Terminal type, set only for units connected to diff --git a/src/core/execute.c b/src/core/execute.c index b7d78f2197..29fe9f05b1 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -1794,7 +1794,7 @@ static int build_environment( assert(p); assert(ret); -#define N_ENV_VARS 16 +#define N_ENV_VARS 17 our_env = new0(char*, N_ENV_VARS + _EXEC_DIRECTORY_TYPE_MAX); if (!our_env) return -ENOMEM; @@ -1950,6 +1950,11 @@ static int build_environment( our_env[n_env++] = x; } + if (asprintf(&x, "SYSTEMD_EXEC_PID=" PID_FMT, getpid_cached()) < 0) + return -ENOMEM; + + our_env[n_env++] = x; + our_env[n_env++] = NULL; assert(n_env <= N_ENV_VARS + _EXEC_DIRECTORY_TYPE_MAX); #undef N_ENV_VARS |