diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 203fc0355d7..5b5590a2336 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -3043,6 +3043,17 @@ StandardInputData=SWNrIHNpdHplIGRhIHVuJyBlc3NlIEtsb3BzLAp1ZmYgZWVtYWwga2xvcHAncy
+
+ $SYSTEMD_EXEC_PID
+
+ The PID of the unit process (e.g. process invoked by
+ ExecStart=). 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
+ sd_listen_fds3
+ with $LISTEN_PID and $LISTEN_FDS).
+
+
$TERM
diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c
index 31718afebda..3b953ac4720 100644
--- a/src/analyze/analyze.c
+++ b/src/analyze/analyze.c
@@ -2446,7 +2446,7 @@ static int run(int argc, char *argv[]) {
setlocale(LC_ALL, "");
setlocale(LC_NUMERIC, "C"); /* we want to format/parse floats in C style */
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c
index 717f0475cac..f3d53d64625 100644
--- a/src/backlight/backlight.c
+++ b/src/backlight/backlight.c
@@ -380,7 +380,7 @@ static int run(int argc, char *argv[]) {
unsigned max_brightness, brightness;
int r;
- log_setup_service();
+ log_setup();
if (strv_contains(strv_skip(argv, 1), "--help"))
return help();
diff --git a/src/basic/env-util.c b/src/basic/env-util.c
index 96c024afd77..a75186015e3 100644
--- a/src/basic/env-util.c
+++ b/src/basic/env-util.c
@@ -12,6 +12,8 @@
#include "extract-word.h"
#include "macro.h"
#include "parse-util.h"
+#include "process-util.h"
+#include "stdio-util.h"
#include "string-util.h"
#include "strv.h"
#include "utf8.h"
@@ -749,3 +751,24 @@ int set_unset_env(const char *name, const char *value, bool overwrite) {
return -errno;
return 0;
}
+
+int setenv_systemd_exec_pid(bool update_only) {
+ char str[DECIMAL_STR_MAX(pid_t)];
+ const char *e;
+
+ /* Update $SYSTEMD_EXEC_PID=pid except when '*' is set for the variable. */
+
+ e = secure_getenv("SYSTEMD_EXEC_PID");
+ if (!e && update_only)
+ return 0;
+
+ if (streq_ptr(e, "*"))
+ return 0;
+
+ xsprintf(str, PID_FMT, getpid_cached());
+
+ if (setenv("SYSTEMD_EXEC_PID", str, 1) < 0)
+ return -errno;
+
+ return 1;
+}
diff --git a/src/basic/env-util.h b/src/basic/env-util.h
index 6684b3350f0..5d8afec0289 100644
--- a/src/basic/env-util.h
+++ b/src/basic/env-util.h
@@ -55,3 +55,5 @@ int getenv_bool_secure(const char *p);
/* Like setenv, but calls unsetenv if value == NULL. */
int set_unset_env(const char *name, const char *value, bool overwrite);
+
+int setenv_systemd_exec_pid(bool update_only);
diff --git a/src/basic/log.c b/src/basic/log.c
index 59181910ebc..6a86fab3986 100644
--- a/src/basic/log.c
+++ b/src/basic/log.c
@@ -1157,20 +1157,38 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
return 0;
}
-void log_parse_environment(void) {
- if (getpid_cached() == 1 || get_ctty_devnr(0, NULL) < 0)
- /* Only try to read the command line in daemons. We assume that anything that has a
- * controlling tty is user stuff. For PID1 we do a special check in case it hasn't
- * closed the console yet. */
- (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
+static bool should_parse_proc_cmdline(void) {
+ const char *e;
+ pid_t p;
- log_parse_environment_cli();
+ /* PID1 always reads the kernel command line. */
+ if (getpid_cached() == 1)
+ return true;
+
+ /* If the process is directly executed by PID1 (e.g. ExecStart= or generator), systemd-importd,
+ * or systemd-homed, then $SYSTEMD_EXEC_PID= is set, and read the command line. */
+ e = getenv("SYSTEMD_EXEC_PID");
+ if (!e)
+ return false;
+
+ if (streq(e, "*"))
+ /* For testing. */
+ return true;
+
+ if (parse_pid(e, &p) < 0)
+ /* We know that systemd sets the variable correctly. Something else must have set it. */
+ log_debug("Failed to parse \"$SYSTEMD_EXEC_PID=%s\". Ignoring.", e);
+
+ return getpid_cached() == p;
}
-void log_parse_environment_cli(void) {
+void log_parse_environment(void) {
+ const char *e;
+
/* Do not call from library code. */
- const char *e;
+ if (should_parse_proc_cmdline())
+ (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
e = getenv("SYSTEMD_LOG_TARGET");
if (e && log_set_target_from_string(e) < 0)
@@ -1460,22 +1478,10 @@ int log_dup_console(void) {
return 0;
}
-void log_setup_service(void) {
- /* Sets up logging the way it is most appropriate for running a program as a service. Note that using this
- * doesn't make the binary unsuitable for invocation on the command line, as log output will still go to the
- * terminal if invoked interactively. */
-
+void log_setup(void) {
log_set_target(LOG_TARGET_AUTO);
log_parse_environment();
(void) log_open();
-}
-
-void log_setup_cli(void) {
- /* Sets up logging the way it is most appropriate for running a program as a CLI utility. */
-
- log_set_target(LOG_TARGET_AUTO);
- log_parse_environment_cli();
- (void) log_open();
if (log_on_console() && show_color < 0)
log_show_color(true);
}
diff --git a/src/basic/log.h b/src/basic/log.h
index 9b106c57d8a..60e67270dbd 100644
--- a/src/basic/log.h
+++ b/src/basic/log.h
@@ -69,7 +69,6 @@ void log_close(void);
void log_forget_fds(void);
void log_parse_environment(void);
-void log_parse_environment_cli(void);
int log_dispatch_internal(
int level,
@@ -301,5 +300,4 @@ int log_syntax_invalid_utf8_internal(
#define DEBUG_LOGGING _unlikely_(log_get_max_level() >= LOG_DEBUG)
-void log_setup_service(void);
-void log_setup_cli(void);
+void log_setup(void);
diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c
index ecb9d90a781..f6b72e0bae8 100644
--- a/src/binfmt/binfmt.c
+++ b/src/binfmt/binfmt.c
@@ -190,7 +190,7 @@ static int run(int argc, char *argv[]) {
if (r <= 0)
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c
index 02648957db1..7774aeac7c2 100644
--- a/src/busctl/busctl.c
+++ b/src/busctl/busctl.c
@@ -2565,7 +2565,7 @@ static int busctl_main(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c
index 30fd743d11c..6868049c18f 100644
--- a/src/cgls/cgls.c
+++ b/src/cgls/cgls.c
@@ -163,7 +163,7 @@ static void show_cg_info(const char *controller, const char *path) {
static int run(int argc, char *argv[]) {
int r, output_flags;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/cgroups-agent/cgroups-agent.c b/src/cgroups-agent/cgroups-agent.c
index eeb4ba80f5f..071cba30996 100644
--- a/src/cgroups-agent/cgroups-agent.c
+++ b/src/cgroups-agent/cgroups-agent.c
@@ -22,7 +22,7 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- log_setup_service();
+ log_setup();
fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
if (fd < 0) {
diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
index f63a7173e66..d0fa69ff88d 100644
--- a/src/cgtop/cgtop.c
+++ b/src/cgtop/cgtop.c
@@ -915,7 +915,7 @@ static int run(int argc, char *argv[]) {
CGroupMask mask;
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/core/execute.c b/src/core/execute.c
index b7d78f2197e..29fe9f05b12 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
diff --git a/src/core/manager.c b/src/core/manager.c
index 68589501079..1881cde0366 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -4108,7 +4108,8 @@ static int manager_run_environment_generators(Manager *m) {
RUN_WITH_UMASK(0022)
r = execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC, gather_environment,
- args, NULL, m->transient_environment, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ args, NULL, m->transient_environment,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS | EXEC_DIR_SET_SYSTEMD_EXEC_PID);
return r;
}
@@ -4143,7 +4144,8 @@ static int manager_run_generators(Manager *m) {
RUN_WITH_UMASK(0022)
(void) execute_directories((const char* const*) paths, DEFAULT_TIMEOUT_USEC, NULL, NULL,
- (char**) argv, m->transient_environment, EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS);
+ (char**) argv, m->transient_environment,
+ EXEC_DIR_PARALLEL | EXEC_DIR_IGNORE_ERRORS | EXEC_DIR_SET_SYSTEMD_EXEC_PID);
r = 0;
diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c
index d546e1b8f66..bc8d34952be 100644
--- a/src/coredump/coredump.c
+++ b/src/coredump/coredump.c
@@ -861,7 +861,7 @@ static int process_socket(int fd) {
assert(fd >= 0);
- log_setup_service();
+ log_setup();
log_debug("Processing coredump received on stdin...");
diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c
index 20bd97c1fce..55283a93ae2 100644
--- a/src/coredump/coredumpctl.c
+++ b/src/coredump/coredumpctl.c
@@ -1108,7 +1108,7 @@ static int run(int argc, char *argv[]) {
int r, units_active;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
/* The journal merging logic potentially needs a lot of fds. */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c
index 9cef31398f1..2df7633dac7 100644
--- a/src/cryptsetup/cryptsetup.c
+++ b/src/cryptsetup/cryptsetup.c
@@ -1395,7 +1395,7 @@ static int run(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program requires at least two arguments.");
- log_setup_service();
+ log_setup();
cryptsetup_enable_logging(cd);
diff --git a/src/delta/delta.c b/src/delta/delta.c
index a50cb36ee39..21be1b8f549 100644
--- a/src/delta/delta.c
+++ b/src/delta/delta.c
@@ -643,7 +643,7 @@ static int parse_argv(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
int r, k, n_found = 0;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/detect-virt/detect-virt.c b/src/detect-virt/detect-virt.c
index be0db85d7ce..bfdede6ce7a 100644
--- a/src/detect-virt/detect-virt.c
+++ b/src/detect-virt/detect-virt.c
@@ -127,7 +127,7 @@ static int run(int argc, char *argv[]) {
* to detect whether we are being run in a virtualized
* environment or not */
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/escape/escape.c b/src/escape/escape.c
index 24c53bf14b3..a2fdce790ee 100644
--- a/src/escape/escape.c
+++ b/src/escape/escape.c
@@ -158,7 +158,7 @@ static int run(int argc, char *argv[]) {
char **i;
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c
index 6982cf2eed6..904612ab4a6 100644
--- a/src/firstboot/firstboot.c
+++ b/src/firstboot/firstboot.c
@@ -1271,7 +1271,7 @@ static int run(int argc, char *argv[]) {
if (r <= 0)
return r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
index 04752fe9dc6..cd012f0f3ae 100644
--- a/src/fsck/fsck.c
+++ b/src/fsck/fsck.c
@@ -256,7 +256,7 @@ static int run(int argc, char *argv[]) {
int r, exit_status;
pid_t pid;
- log_setup_service();
+ log_setup();
if (argc > 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
diff --git a/src/hibernate-resume/hibernate-resume.c b/src/hibernate-resume/hibernate-resume.c
index d8f91f4e663..58e35e403eb 100644
--- a/src/hibernate-resume/hibernate-resume.c
+++ b/src/hibernate-resume/hibernate-resume.c
@@ -20,7 +20,7 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/home/homectl.c b/src/home/homectl.c
index 0b414898978..176f041114c 100644
--- a/src/home/homectl.c
+++ b/src/home/homectl.c
@@ -3346,7 +3346,7 @@ static int run(int argc, char *argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = redirect_bus_mgr();
if (r < 0)
diff --git a/src/home/homed-home.c b/src/home/homed-home.c
index 38b7e20ca61..2ea0f7c81d9 100644
--- a/src/home/homed-home.c
+++ b/src/home/homed-home.c
@@ -1038,6 +1038,10 @@ static int home_start_work(Home *h, const char *verb, UserRecord *hr, UserRecord
_exit(EXIT_FAILURE);
}
+ r = setenv_systemd_exec_pid(true);
+ if (r < 0)
+ log_warning_errno(r, "Failed to update $SYSTEMD_EXEC_PID, ignoring: %m");
+
r = rearrange_stdio(stdin_fd, stdout_fd, STDERR_FILENO);
if (r < 0) {
log_error_errno(r, "Failed to rearrange stdin/stdout/stderr: %m");
diff --git a/src/home/homed.c b/src/home/homed.c
index e4d64bdfda1..807d25e2735 100644
--- a/src/home/homed.c
+++ b/src/home/homed.c
@@ -17,7 +17,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
int r;
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-homed.service",
"A service to create, remove, change or inspect home areas.",
diff --git a/src/home/homework.c b/src/home/homework.c
index 35f3206bb0a..bb5a774f81c 100644
--- a/src/home/homework.c
+++ b/src/home/homework.c
@@ -1633,7 +1633,7 @@ static int run(int argc, char *argv[]) {
start = now(CLOCK_MONOTONIC);
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index 4482608b285..62da90b1212 100644
--- a/src/hostname/hostnamectl.c
+++ b/src/hostname/hostnamectl.c
@@ -443,7 +443,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index 35c2c37f924..0e4dd02b49f 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -1064,7 +1064,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
int r;
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-hostnamed.service",
"Manage the system hostname and related metadata.",
diff --git a/src/id128/id128.c b/src/id128/id128.c
index 70ea4d0a690..435a56d4f34 100644
--- a/src/id128/id128.c
+++ b/src/id128/id128.c
@@ -249,7 +249,7 @@ static int id128_main(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/import/importd.c b/src/import/importd.c
index 15914cc8853..65fe3701c62 100644
--- a/src/import/importd.c
+++ b/src/import/importd.c
@@ -11,6 +11,7 @@
#include "bus-log-control-api.h"
#include "bus-polkit.h"
#include "def.h"
+#include "env-util.h"
#include "fd-util.h"
#include "float.h"
#include "hostname-util.h"
@@ -403,6 +404,10 @@ static int transfer_start(Transfer *t) {
_exit(EXIT_FAILURE);
}
+ r = setenv_systemd_exec_pid(true);
+ if (r < 0)
+ log_warning_errno(r, "Failed to update $SYSTEMD_EXEC_PID, ignoring: %m");
+
switch (t->type) {
case TRANSFER_IMPORT_TAR:
@@ -1361,7 +1366,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(manager_unrefp) Manager *m = NULL;
int r;
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-importd.service",
"VM and container image import and export service.",
diff --git a/src/initctl/initctl.c b/src/initctl/initctl.c
index e0b78334f5d..d818f452f7f 100644
--- a/src/initctl/initctl.c
+++ b/src/initctl/initctl.c
@@ -317,7 +317,7 @@ static int run(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program does not take arguments.");
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/journal-remote/journal-gatewayd.c b/src/journal-remote/journal-gatewayd.c
index 17216c8e20c..4ece66b51bb 100644
--- a/src/journal-remote/journal-gatewayd.c
+++ b/src/journal-remote/journal-gatewayd.c
@@ -995,7 +995,7 @@ static int run(int argc, char *argv[]) {
MHD_USE_THREAD_PER_CONNECTION;
int r, n;
- log_setup_service();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c
index 685ce5a16b8..972c13566f6 100644
--- a/src/journal-remote/journal-remote-main.c
+++ b/src/journal-remote/journal-remote-main.c
@@ -1121,7 +1121,7 @@ static int run(int argc, char **argv) {
int r;
log_show_color(true);
- log_parse_environment_cli();
+ log_parse_environment();
/* The journal merging logic potentially needs a lot of fds. */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
diff --git a/src/journal-remote/journal-upload.c b/src/journal-remote/journal-upload.c
index 2d84bdcae5e..455a6c942ef 100644
--- a/src/journal-remote/journal-upload.c
+++ b/src/journal-remote/journal-upload.c
@@ -820,7 +820,7 @@ static int run(int argc, char **argv) {
int r;
log_show_color(true);
- log_parse_environment_cli();
+ log_parse_environment();
/* The journal merging logic potentially needs a lot of fds. */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
diff --git a/src/journal/cat.c b/src/journal/cat.c
index 223af8da1ed..6599e64296a 100644
--- a/src/journal/cat.c
+++ b/src/journal/cat.c
@@ -129,7 +129,7 @@ static int run(int argc, char *argv[]) {
_cleanup_close_ int outfd = -1, errfd = -1, saved_stderr = -1;
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index dee0a0835b1..94fc3472bec 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -2145,7 +2145,7 @@ int main(int argc, char *argv[]) {
int n_shown = 0, r, poll_fd = -1;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
/* Increase max number of open files if we can, we might needs this when browsing journal files, which might be
* split up into many files. */
diff --git a/src/locale/localectl.c b/src/locale/localectl.c
index 692a259275d..c267db9edd9 100644
--- a/src/locale/localectl.c
+++ b/src/locale/localectl.c
@@ -506,7 +506,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/locale/localed.c b/src/locale/localed.c
index 12073bd6f38..97d6592cb81 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -830,7 +830,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
int r;
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-localed.service",
"Manage system locale settings and key mappings.",
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index 995bcbff760..f61f9eca04e 100644
--- a/src/login/loginctl.c
+++ b/src/login/loginctl.c
@@ -1464,7 +1464,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
/* The journal merging logic potentially needs a lot of fds. */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
diff --git a/src/login/logind.c b/src/login/logind.c
index 3ddc7a074af..3dae6955548 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -1160,7 +1160,7 @@ static int run(int argc, char *argv[]) {
int r;
log_set_facility(LOG_AUTH);
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-logind.service",
"Manager for user logins and devices and privileged operations.",
diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c
index e254e255599..1771abc0775 100644
--- a/src/machine/machinectl.c
+++ b/src/machine/machinectl.c
@@ -2876,7 +2876,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
/* The journal merging logic potentially needs a lot of fds. */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
diff --git a/src/machine/machined.c b/src/machine/machined.c
index 1d820599858..241be42c913 100644
--- a/src/machine/machined.c
+++ b/src/machine/machined.c
@@ -324,7 +324,7 @@ static int run(int argc, char *argv[]) {
int r;
log_set_facility(LOG_AUTH);
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-machined.service",
"Manage registrations of local VMs and containers.",
diff --git a/src/modules-load/modules-load.c b/src/modules-load/modules-load.c
index ba690f52cab..9cfd2920116 100644
--- a/src/modules-load/modules-load.c
+++ b/src/modules-load/modules-load.c
@@ -165,7 +165,7 @@ static int run(int argc, char *argv[]) {
if (r <= 0)
return r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/network/networkctl.c b/src/network/networkctl.c
index 3b9a7d6485e..4381f63a2d0 100644
--- a/src/network/networkctl.c
+++ b/src/network/networkctl.c
@@ -2822,7 +2822,7 @@ static void warn_networkd_missing(void) {
static int run(int argc, char* argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/network/networkd.c b/src/network/networkd.c
index ac2bc90d974..24b3cb57af9 100644
--- a/src/network/networkd.c
+++ b/src/network/networkd.c
@@ -22,7 +22,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(notify_on_cleanup) const char *notify_message = NULL;
int r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/network/wait-online/wait-online.c b/src/network/wait-online/wait-online.c
index 2de3e79c3c7..ca0116e7f30 100644
--- a/src/network/wait-online/wait-online.c
+++ b/src/network/wait-online/wait-online.c
@@ -184,7 +184,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(notify_on_cleanup) const char *notify_message = NULL;
int r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
index a5b44519136..2e331e267f7 100644
--- a/src/oom/oomd.c
+++ b/src/oom/oomd.c
@@ -122,7 +122,7 @@ static int run(int argc, char *argv[]) {
unsigned long long s = 0;
int r;
- log_setup_service();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/partition/growfs.c b/src/partition/growfs.c
index 367644e3c9e..15c56d05843 100644
--- a/src/partition/growfs.c
+++ b/src/partition/growfs.c
@@ -201,7 +201,7 @@ static int run(int argc, char *argv[]) {
dev_t devno;
int r;
- log_setup_service();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/partition/makefs.c b/src/partition/makefs.c
index fd924d2231c..7c94fbfedb1 100644
--- a/src/partition/makefs.c
+++ b/src/partition/makefs.c
@@ -24,7 +24,7 @@ static int run(int argc, char *argv[]) {
struct stat st;
int r;
- log_setup_service();
+ log_setup();
if (argc != 3)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c
index ee1c7b69651..edfd74d540d 100644
--- a/src/portable/portablectl.c
+++ b/src/portable/portablectl.c
@@ -1113,7 +1113,7 @@ static int run(int argc, char *argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/portable/portabled.c b/src/portable/portabled.c
index f008f84e53c..8a17f09365a 100644
--- a/src/portable/portabled.c
+++ b/src/portable/portabled.c
@@ -135,7 +135,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(manager_unrefp) Manager *m = NULL;
int r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/pstore/pstore.c b/src/pstore/pstore.c
index db8a71fbab2..c642a3252cb 100644
--- a/src/pstore/pstore.c
+++ b/src/pstore/pstore.c
@@ -367,7 +367,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(pstore_entries_reset) PStoreList list = {};
int r;
- log_setup_service();
+ log_setup();
if (argc == 3) {
arg_sourcedir = argv[1];
diff --git a/src/quotacheck/quotacheck.c b/src/quotacheck/quotacheck.c
index d617b0bf3d6..575965c470e 100644
--- a/src/quotacheck/quotacheck.c
+++ b/src/quotacheck/quotacheck.c
@@ -58,7 +58,7 @@ static void test_files(void) {
static int run(int argc, char *argv[]) {
int r;
- log_setup_service();
+ log_setup();
if (argc > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c
index 8f8766cdd70..4caf9678071 100644
--- a/src/random-seed/random-seed.c
+++ b/src/random-seed/random-seed.c
@@ -110,7 +110,7 @@ static int run(int argc, char *argv[]) {
ssize_t k;
int r;
- log_setup_service();
+ log_setup();
if (argc != 2)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c
index 9668a49dc46..d747d60d5db 100644
--- a/src/remount-fs/remount-fs.c
+++ b/src/remount-fs/remount-fs.c
@@ -77,7 +77,7 @@ static int run(int argc, char *argv[]) {
struct mntent* me;
int r;
- log_setup_service();
+ log_setup();
if (argc > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
diff --git a/src/reply-password/reply-password.c b/src/reply-password/reply-password.c
index a73334e2b88..a9aa4b832a9 100644
--- a/src/reply-password/reply-password.c
+++ b/src/reply-password/reply-password.c
@@ -39,7 +39,7 @@ static int run(int argc, char *argv[]) {
size_t length = 0;
int r;
- log_setup_service();
+ log_setup();
if (argc != 3)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Wrong number of arguments.");
diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c
index b1779a6418a..318528b419c 100644
--- a/src/resolve/resolvectl.c
+++ b/src/resolve/resolvectl.c
@@ -3296,7 +3296,7 @@ static int run(int argc, char **argv) {
int r;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
if (streq(program_invocation_short_name, "resolvconf"))
r = resolvconf_parse_argv(argc, argv);
diff --git a/src/resolve/resolved.c b/src/resolve/resolved.c
index 4c42b6591d0..aabaa266e99 100644
--- a/src/resolve/resolved.c
+++ b/src/resolve/resolved.c
@@ -26,7 +26,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
int r;
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-resolved.service",
"Provide name resolution with caching using DNS, mDNS, LLMNR.",
diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c
index c38716842b2..91dc72f425f 100644
--- a/src/rfkill/rfkill.c
+++ b/src/rfkill/rfkill.c
@@ -276,7 +276,7 @@ static int run(int argc, char *argv[]) {
if (argc > 1)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires no arguments.");
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/shared/exec-util.c b/src/shared/exec-util.c
index bdea60ca02c..6355ce8ce42 100644
--- a/src/shared/exec-util.c
+++ b/src/shared/exec-util.c
@@ -34,7 +34,7 @@
/* Put this test here for a lack of better place */
assert_cc(EAGAIN == EWOULDBLOCK);
-static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid) {
+static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid, bool set_systemd_exec_pid) {
pid_t _pid;
int r;
@@ -57,6 +57,12 @@ static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid) {
(void) rlimit_nofile_safe();
+ if (set_systemd_exec_pid) {
+ r = setenv_systemd_exec_pid(false);
+ if (r < 0)
+ log_warning_errno(r, "Failed to set $SYSTEMD_EXEC_PID, ignoring: %m");
+ }
+
if (!argv) {
_argv[0] = (char*) path;
_argv[1] = NULL;
@@ -132,7 +138,7 @@ static int do_execute(
return log_error_errno(fd, "Failed to open serialization file: %m");
}
- r = do_spawn(t, argv, fd, &pid);
+ r = do_spawn(t, argv, fd, &pid, FLAGS_SET(flags, EXEC_DIR_SET_SYSTEMD_EXEC_PID));
if (r <= 0)
continue;
diff --git a/src/shared/exec-util.h b/src/shared/exec-util.h
index df6214e4c3f..5bd4a3785f8 100644
--- a/src/shared/exec-util.h
+++ b/src/shared/exec-util.h
@@ -15,9 +15,10 @@ enum {
};
typedef enum {
- EXEC_DIR_NONE = 0, /* No execdir flags */
- EXEC_DIR_PARALLEL = 1 << 0, /* Execute scripts in parallel, if possible */
- EXEC_DIR_IGNORE_ERRORS = 1 << 1, /* Ignore non-zero exit status of scripts */
+ EXEC_DIR_NONE = 0, /* No execdir flags */
+ EXEC_DIR_PARALLEL = 1 << 0, /* Execute scripts in parallel, if possible */
+ EXEC_DIR_IGNORE_ERRORS = 1 << 1, /* Ignore non-zero exit status of scripts */
+ EXEC_DIR_SET_SYSTEMD_EXEC_PID = 1 << 2, /* Set $SYSTEMD_EXEC_PID environment variable */
} ExecDirFlags;
typedef enum ExecCommandFlags {
diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c
index 297cc1fec69..262d4cea66a 100644
--- a/src/sleep/sleep.c
+++ b/src/sleep/sleep.c
@@ -368,7 +368,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(free_sleep_configp) SleepConfig *sleep_config = NULL;
int r;
- log_setup_service();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/sulogin-shell/sulogin-shell.c b/src/sulogin-shell/sulogin-shell.c
index b0d71ff580c..0207e85b7ef 100644
--- a/src/sulogin-shell/sulogin-shell.c
+++ b/src/sulogin-shell/sulogin-shell.c
@@ -100,7 +100,7 @@ int main(int argc, char *argv[]) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
int r;
- log_setup_service();
+ log_setup();
print_mode(argc > 1 ? argv[1] : "");
diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
index 6d20ee1a84b..1b433f70450 100644
--- a/src/sysctl/sysctl.c
+++ b/src/sysctl/sysctl.c
@@ -386,7 +386,7 @@ static int run(int argc, char *argv[]) {
if (r <= 0)
return r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c
index ee38e49ec92..a17f4e2c02b 100644
--- a/src/sysext/sysext.c
+++ b/src/sysext/sysext.c
@@ -1027,7 +1027,7 @@ static int sysext_main(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index c53ed41cc32..e8e3d2438a3 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1085,7 +1085,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_parse_environment_cli();
+ log_parse_environment();
log_open();
/* The journal merging logic potentially needs a lot of fds. */
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
index 25a1871bd4c..969896c0b5d 100644
--- a/src/sysusers/sysusers.c
+++ b/src/sysusers/sysusers.c
@@ -1928,7 +1928,7 @@ static int run(int argc, char *argv[]) {
if (r <= 0)
return r;
- log_setup_service();
+ log_setup();
if (arg_cat_config)
return cat_config();
diff --git a/src/test/test-chase-symlinks.c b/src/test/test-chase-symlinks.c
index d9b9b62dc5a..892f8a073ff 100644
--- a/src/test/test-chase-symlinks.c
+++ b/src/test/test-chase-symlinks.c
@@ -84,7 +84,7 @@ static int parse_argv(int argc, char *argv[]) {
static int run(int argc, char **argv) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c
index f77b1cdbcbd..ce215fdd364 100644
--- a/src/test/test-env-util.c
+++ b/src/test/test-env-util.c
@@ -4,9 +4,12 @@
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
+#include "parse-util.h"
+#include "process-util.h"
#include "serialize.h"
#include "string-util.h"
#include "strv.h"
+#include "tests.h"
#include "util.h"
static void test_strv_env_delete(void) {
@@ -334,7 +337,44 @@ static void test_env_assignment_is_valid(void) {
assert_se(!env_assignment_is_valid("głąb=printf \"\x1b]0;\x07\""));
}
+static void test_setenv_systemd_exec_pid(void) {
+ _cleanup_free_ char *saved = NULL;
+ const char *e;
+ pid_t p;
+
+ log_info("/* %s */", __func__);
+
+ e = getenv("SYSTEMD_EXEC_PID");
+ if (e)
+ assert_se(saved = strdup(e));
+
+ assert_se(unsetenv("SYSTEMD_EXEC_PID") >= 0);
+ assert_se(setenv_systemd_exec_pid(true) == 0);
+ assert_se(!getenv("SYSTEMD_EXEC_PID"));
+
+ assert_se(setenv("SYSTEMD_EXEC_PID", "*", 1) >= 0);
+ assert_se(setenv_systemd_exec_pid(true) == 0);
+ assert_se(e = getenv("SYSTEMD_EXEC_PID"));
+ assert_se(streq(e, "*"));
+
+ assert_se(setenv("SYSTEMD_EXEC_PID", "123abc", 1) >= 0);
+ assert_se(setenv_systemd_exec_pid(true) == 1);
+ assert_se(e = getenv("SYSTEMD_EXEC_PID"));
+ assert_se(parse_pid(e, &p) >= 0);
+ assert_se(p == getpid_cached());
+
+ assert_se(unsetenv("SYSTEMD_EXEC_PID") >= 0);
+ assert_se(setenv_systemd_exec_pid(false) == 1);
+ assert_se(e = getenv("SYSTEMD_EXEC_PID"));
+ assert_se(parse_pid(e, &p) >= 0);
+ assert_se(p == getpid_cached());
+
+ assert_se(set_unset_env("SYSTEMD_EXEC_PID", saved, 1) >= 0);
+}
+
int main(int argc, char *argv[]) {
+ test_setup_logging(LOG_DEBUG);
+
test_strv_env_delete();
test_strv_env_get();
test_strv_env_unset();
@@ -350,6 +390,7 @@ int main(int argc, char *argv[]) {
test_env_name_is_valid();
test_env_value_is_valid();
test_env_assignment_is_valid();
+ test_setenv_systemd_exec_pid();
return 0;
}
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c
index 7088a771a65..fb08f9ad260 100644
--- a/src/timedate/timedatectl.c
+++ b/src/timedate/timedatectl.c
@@ -1051,7 +1051,7 @@ static int run(int argc, char *argv[]) {
int r;
setlocale(LC_ALL, "");
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c
index 8149facb346..563f470f54e 100644
--- a/src/timedate/timedated.c
+++ b/src/timedate/timedated.c
@@ -1109,7 +1109,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
int r;
- log_setup_service();
+ log_setup();
r = service_parse_argv("systemd-timedated.service",
"Manage the system clock and timezone and NTP enablement.",
diff --git a/src/timesync/timesyncd.c b/src/timesync/timesyncd.c
index 1f59bf14e1a..e6a2b066873 100644
--- a/src/timesync/timesyncd.c
+++ b/src/timesync/timesyncd.c
@@ -97,7 +97,7 @@ static int run(int argc, char *argv[]) {
int r;
log_set_facility(LOG_CRON);
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index b033def9dff..8ad886236d2 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -3363,7 +3363,7 @@ static int run(int argc, char *argv[]) {
if (r <= 0)
return r;
- log_setup_service();
+ log_setup();
/* Descending down file system trees might take a lot of fds */
(void) rlimit_nofile_bump(HIGH_RLIMIT_NOFILE);
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index 5695327024a..ee66a3c312a 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -684,7 +684,7 @@ static int ask_on_consoles(char *argv[]) {
static int run(int argc, char *argv[]) {
int r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/update-done/update-done.c b/src/update-done/update-done.c
index 212892527e6..6518830717e 100644
--- a/src/update-done/update-done.c
+++ b/src/update-done/update-done.c
@@ -41,7 +41,7 @@ int main(int argc, char *argv[]) {
struct stat st;
int r, q = 0;
- log_setup_service();
+ log_setup();
if (stat("/usr", &st) < 0) {
log_error_errno(errno, "Failed to stat /usr: %m");
diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c
index 59c49f2a801..1ec9066d345 100644
--- a/src/update-utmp/update-utmp.c
+++ b/src/update-utmp/update-utmp.c
@@ -224,7 +224,7 @@ static int run(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program requires one argument.");
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/user-sessions/user-sessions.c b/src/user-sessions/user-sessions.c
index d1b8176714e..6b7493fd885 100644
--- a/src/user-sessions/user-sessions.c
+++ b/src/user-sessions/user-sessions.c
@@ -21,7 +21,7 @@ static int run(int argc, char *argv[]) {
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"This program requires one argument.");
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c
index ecaead39d76..5dc1cf8140b 100644
--- a/src/userdb/userdbctl.c
+++ b/src/userdb/userdbctl.c
@@ -763,7 +763,7 @@ static int run(int argc, char *argv[]) {
int r;
- log_setup_cli();
+ log_setup();
r = parse_argv(argc, argv);
if (r <= 0)
diff --git a/src/userdb/userdbd.c b/src/userdb/userdbd.c
index 6f2c8078432..6b28dd0a084 100644
--- a/src/userdb/userdbd.c
+++ b/src/userdb/userdbd.c
@@ -24,7 +24,7 @@ static int run(int argc, char *argv[]) {
_cleanup_(notify_on_cleanup) const char *notify_stop = NULL;
int r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/userdb/userwork.c b/src/userdb/userwork.c
index d525a6e05af..c62a21974a1 100644
--- a/src/userdb/userwork.c
+++ b/src/userdb/userwork.c
@@ -662,7 +662,7 @@ static int run(int argc, char *argv[]) {
unsigned n_iterations = 0;
int m, listen_fd, r;
- log_setup_service();
+ log_setup();
m = sd_listen_fds(false);
if (m < 0)
diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c
index b28e2853e10..45915ef853b 100644
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c
@@ -430,7 +430,7 @@ int main(int argc, char **argv) {
unsigned idx = 0;
int r;
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/veritysetup/veritysetup.c b/src/veritysetup/veritysetup.c
index 9ecfbc5217f..2b54065437f 100644
--- a/src/veritysetup/veritysetup.c
+++ b/src/veritysetup/veritysetup.c
@@ -136,7 +136,7 @@ static int run(int argc, char *argv[]) {
if (argc < 3)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "This program requires at least two arguments.");
- log_setup_service();
+ log_setup();
umask(0022);
diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c
index ee3532cc02a..242ef81ecf7 100644
--- a/src/volatile-root/volatile-root.c
+++ b/src/volatile-root/volatile-root.c
@@ -119,7 +119,7 @@ static int run(int argc, char *argv[]) {
dev_t devt;
int r;
- log_setup_service();
+ log_setup();
if (argc > 3)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),