summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-10-18 01:18:50 +0200
committerLennart Poettering <lennart@poettering.net>2012-10-18 01:18:50 +0200
commit97ae63e2a9c07ee64ab9f226b9b6121114f1d732 (patch)
tree75b10ba576630eef8805b28d8616131b99bd7b3d
parentc978343015c787713651dff571acb5207367f5f2 (diff)
service: when invoking service processes in --user mode set MANAGERPID to PID of systemd
-rw-r--r--man/systemd.service.xml19
-rw-r--r--src/core/service.c15
2 files changed, 23 insertions, 11 deletions
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index 11f600663..59ecf810f 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -365,6 +365,13 @@
explicitly to a shell implementation
of some kind. Example:
<literal>ExecStart=/bin/sh -c 'dmesg | tac'</literal></para>
+
+ <para>For services run by a user
+ instance of systemd the special
+ environment variable
+ <literal>MANAGERPID</literal> is set
+ to the PID of the systemd
+ instance.</para>
</listitem>
</varlistentry>
@@ -407,12 +414,12 @@
variable substitution is supported
here following the same scheme as for
<varname>ExecStart=</varname>. One
- special environment variable is set:
- if known <literal>$MAINPID</literal> is
- set to the main process of the
- daemon, and may be used for command
- lines like the following:
- <command>/bin/kill -HUP
+ additional special environment
+ variables is set: if known
+ <literal>$MAINPID</literal> is set to
+ the main process of the daemon, and
+ may be used for command lines like the
+ following: <command>/bin/kill -HUP
$MAINPID</command>.</para></listitem>
</varlistentry>
diff --git a/src/core/service.c b/src/core/service.c
index 7f9a53af4..5742968d9 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -1801,7 +1801,8 @@ static int service_spawn(
goto fail;
}
- if (!(our_env = new0(char*, 4))) {
+ our_env = new0(char*, 5);
+ if (!our_env) {
r = -ENOMEM;
goto fail;
}
@@ -1824,10 +1825,14 @@ static int service_spawn(
goto fail;
}
- if (!(final_env = strv_env_merge(2,
- UNIT(s)->manager->environment,
- our_env,
- NULL))) {
+ if (s->meta.manager->running_as != SYSTEMD_SYSTEM)
+ if (asprintf(our_env + n_env++, "MANAGERPID=%lu", (unsigned long) getpid()) < 0) {
+ r = -ENOMEM;
+ goto fail;
+ }
+
+ final_env = strv_env_merge(2, UNIT(s)->manager->environment, our_env, NULL);
+ if (!final_env) {
r = -ENOMEM;
goto fail;
}