From 5d6b158473100a7a85e790f8ead0b826baa13b5e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 1 Feb 2012 22:33:15 +0100 Subject: [PATCH] exec: include path name of binary we are about to execute when renaming forked off processes Immediately after forking off a process change the comm name and argv[0] to "(foobar)" where "foobar" is the basename of the path we are about to execute. This should be useful when charting boot progress. --- src/execute.c | 39 ++++++++++++++++++++++++++++++++++----- src/main.c | 4 ++-- src/util.c | 12 ++++++++---- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/execute.c b/src/execute.c index 13f4561f..536877d6 100644 --- a/src/execute.c +++ b/src/execute.c @@ -770,8 +770,8 @@ static int setup_pam( * termination */ /* This string must fit in 10 chars (i.e. the length - * of "/sbin/init") */ - rename_process("sd(PAM)"); + * of "/sbin/init"), to look pretty in /bin/ps */ + rename_process("(sd-pam)"); /* Make sure we don't keep open the passed fds in this child. We assume that otherwise only those fds are @@ -919,6 +919,37 @@ finish: return r; } +static void rename_process_from_path(const char *path) { + char process_name[11]; + const char *p; + size_t l; + + /* This resulting string must fit in 10 chars (i.e. the length + * of "/sbin/init") to look pretty in /bin/ps */ + + p = file_name_from_path(path); + if (isempty(p)) { + rename_process("(...)"); + return; + } + + l = strlen(p); + if (l > 8) { + /* The end of the process name is usually more + * interesting, since the first bit might just be + * "systemd-" */ + p = p + l - 8; + l = 8; + } + + process_name[0] = '('; + memcpy(process_name+1, p, l); + process_name[1+l] = ')'; + process_name[1+l+1] = 0; + + rename_process(process_name); +} + int exec_spawn(ExecCommand *command, char **argv, const ExecContext *context, @@ -997,9 +1028,7 @@ int exec_spawn(ExecCommand *command, /* child */ - /* This string must fit in 10 chars (i.e. the length - * of "/sbin/init") */ - rename_process("sd(EXEC)"); + rename_process_from_path(command->path); /* We reset exactly these signals, since they are the * only ones we set to SIG_IGN in the main daemon. All diff --git a/src/main.c b/src/main.c index 94e6ec63..738db6c2 100644 --- a/src/main.c +++ b/src/main.c @@ -1138,7 +1138,7 @@ int main(int argc, char *argv[]) { bool reexecute = false; const char *shutdown_verb = NULL; dual_timestamp initrd_timestamp = { 0ULL, 0ULL }; - char systemd[] = "systemd"; + static char systemd[] = "systemd"; bool is_reexec = false; int j; bool loaded_policy = false; @@ -1169,9 +1169,9 @@ int main(int argc, char *argv[]) { called 'init'. After a subsequent reexecution we are then called 'systemd'. That is confusing, hence let's call us systemd right-away. */ - program_invocation_short_name = systemd; prctl(PR_SET_NAME, systemd); + saved_argv = argv; saved_argc = argc; diff --git a/src/util.c b/src/util.c index ce7f1c9f..58a0aeba 100644 --- a/src/util.c +++ b/src/util.c @@ -3263,11 +3263,15 @@ fallback: void rename_process(const char name[8]) { assert(name); - prctl(PR_SET_NAME, name); + /* This is a like a poor man's setproctitle(). It changes the + * comm field, argv[0], and also the glibc's internally used + * name of the process. For the first one a limit of 16 chars + * applies, to the second one usually one of 10 (i.e. length + * of "/sbin/init"), to the third one one of 7 (i.e. length of + * "systemd"). If you pass a longer string it will be + * truncated */ - /* This is a like a poor man's setproctitle(). The string - * passed should fit in 7 chars (i.e. the length of - * "systemd") */ + prctl(PR_SET_NAME, name); if (program_invocation_name) strncpy(program_invocation_name, name, strlen(program_invocation_name)); -- 2.39.5